晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/proc/thread-self/root/usr/include/mysql/server/private/ |
| Current File : //proc/thread-self/root/usr/include/mysql/server/private/sql_mode.h |
#ifndef SQL_MODE_H_INCLUDED
#define SQL_MODE_H_INCLUDED
/*
Copyright (c) 2019, MariaDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
#ifdef USE_PRAGMA_INTERFACE
#pragma interface /* gcc class implementation */
#endif
#include "sql_basic_types.h"
/*
class Sql_mode_dependency
A combination of hard and soft dependency on sql_mode.
Used to watch if a GENERATED ALWAYS AS expression guarantees consitent
data written to its virtual column.
A virtual column can appear in an index if:
- the generation expression does not depend on any sql_mode flags, or
- the generation expression has a soft dependency on an sql_mode flag,
and the column knows how to handle this dependeny.
A virtual column cannot appear in an index if:
- its generation expression has a hard dependency
- its generation expression has a soft dependency, but the column
cannot handle it on store.
An error is reported in such cases.
How dependencies appear:
- When a column return value depends on some sql_mode flag,
its Item_field adds a corresponding bit to m_soft. For example,
Item_field for a CHAR(N) column adds the PAD_CHAR_TO_FULL_LENGTH flag.
- When an SQL function/operator return value depends on some sql_mode flag,
it adds a corresponding bit to m_soft. For example, Item_func_minus
adds the MODE_NO_UNSIGNED_SUBTRACTION in case of unsigned arguments.
How dependency are processed (see examples below):
- All SQL functions/operators bit-OR all hard dependencies from all arguments.
- Some soft dependencies can be handled by the underlying Field on store,
e.g. CHAR(N) can handle PAD_CHAR_TO_FULL_LENGTH.
- Some soft dependencies can be handled by SQL functions and operators,
e.g. RTRIM(expr) removes expr's soft dependency on PAD_CHAR_TO_FULL_LENGTH.
If a function or operator handles a soft dependency on a certain sql_mode
flag, it removes the corresponding bit from m_soft (see below).
Note, m_hard is not touched in such cases.
- When an expression with a soft dependency on a certain sql_mode flag
goes as an argument to an SQL function/operator which cannot handle
this flag, the dependency escalates from soft to hard
(by moving the corresponding bit from m_soft to m_hard) and cannot be
handled any more on the upper level, neither by a Field on store,
nor by another SQL function/operator.
There are four kinds of Items:
1. Items that generate a soft or hard dependency, e.g.
- Item_field for CHAR(N) - generates soft/PAD_CHAR_TO_FULL_LENGTH
- Item_func_minus - generates soft/NO_UNSIGNED_SUBTRACTION
2. Items that convert a soft dependency to a hard dependency.
This happens e.g. when an Item_func instance gets a soft dependency
from its arguments, and it does not know how to handle this dependency.
Most Item_func descendants do this.
3. Items that remove soft dependencies, e.g.:
- Item_func_rtrim - removes soft/PAD_CHAR_TO_FULL_LENGTH
that came from args[0] (under certain conditions)
- Item_func_rpad - removes soft/PAD_CJAR_TO_FULL_LENGTH
that came from args[0] (under certain conditions)
4. Items that repeat soft dependency from its arguments to the caller.
They are not implemented yet. But functions like Item_func_coalesce,
Item_func_case, Item_func_case_abbreviation2 could do this.
Examples:
1. CREATE OR REPLACE TABLE t1 (a CHAR(5), v CHAR(20) AS(a), KEY(v));
Here `v` has a soft dependency on `a`.
The value of `a` depends on PAD_CHAR_TO_FULL_LENGTH, it can return:
- 'a' - if PAD_CHAR_TO_FULL_LENGTH is disabled
- 'a' followed by four spaces - if PAD_CHAR_TO_FULL_LENGTH is enabled
But `v` will pad trailing spaces to the full length on store anyway.
So Field_string handles this soft dependency on store.
This combination of the virtial column data type and its generation
expression is safe and provides consistent data in `v`, which is
'a' followed by four spaces, no matter what PAD_CHAR_TO_FULL_LENGTH is.
2. CREATE OR REPLACE TABLE t1 (a CHAR(5), v VARCHAR(20) AS(a), KEY(v));
Here `v` has a soft dependency on `a`. But Field_varstring does
not pad spaces on store, so it cannot handle this dependency.
This combination of the virtual column data type and its generation
expression is not safe. An error is returned.
3. CREATE OR REPLACE TABLE t1 (a CHAR(5), v INT AS(LENGTH(a)), KEY(v));
Here `v` has a hard dependency on `a`, because the value of `a`
is wrapped to the function LENGTH().
The value of `LENGTH(a)` depends on PAD_CHAR_TO_FULL_LENGTH, it can return:
- 1 - if PAD_CHAR_TO_FULL_LENGTH is disabled
- 4 - if PAD_CHAR_TO_FULL_LENGTH is enabled
This combination cannot provide consistent data stored to `v`,
therefore it's disallowed.
*/
class Sql_mode_dependency
{
sql_mode_t m_hard;
sql_mode_t m_soft;
public:
Sql_mode_dependency()
:m_hard(0), m_soft(0)
{ }
Sql_mode_dependency(sql_mode_t hard, sql_mode_t soft)
:m_hard(hard), m_soft(soft)
{ }
sql_mode_t hard() const { return m_hard; }
sql_mode_t soft() const { return m_soft; }
operator bool () const
{
return m_hard > 0 || m_soft > 0;
}
Sql_mode_dependency operator|(const Sql_mode_dependency &other) const
{
return Sql_mode_dependency(m_hard | other.m_hard, m_soft | other.m_soft);
}
Sql_mode_dependency operator&(const Sql_mode_dependency &other) const
{
return Sql_mode_dependency(m_hard & other.m_hard, m_soft & other.m_soft);
}
Sql_mode_dependency &operator|=(const Sql_mode_dependency &other)
{
m_hard|= other.m_hard;
m_soft|= other.m_soft;
return *this;
}
Sql_mode_dependency &operator&=(const Sql_mode_dependency &other)
{
m_hard&= other.m_hard;
m_soft&= other.m_soft;
return *this;
}
Sql_mode_dependency &soft_to_hard()
{
m_hard|= m_soft;
m_soft= 0;
return *this;
}
void push_dependency_warnings(THD *thd) const;
};
#endif // SQL_MODE_H_INCLUDED
|