mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Merge remote-tracking branch 'origin/bb-10.2-ext' into 10.3
This commit is contained in:
commit
4991eab483
23 changed files with 1145 additions and 432 deletions
|
@ -205,7 +205,7 @@ fi
|
||||||
|
|
||||||
max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max"
|
max_no_embedded_configs="$SSL_LIBRARY --with-plugins=max"
|
||||||
max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache"
|
max_no_qc_configs="$SSL_LIBRARY --with-plugins=max --without-query-cache"
|
||||||
max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent --without-plugin=plugin_file_key_management"
|
max_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-libevent --without-plugin=plugin_file_key_management --with-plugin-rocksdb=dynamic"
|
||||||
all_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-innodb_plugin --with-libevent"
|
all_configs="$SSL_LIBRARY --with-plugins=max --with-embedded-server --with-innodb_plugin --with-libevent"
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -1000,14 +1000,14 @@ t2 CREATE TABLE `t2` (
|
||||||
`least____a_a` int(11) DEFAULT NULL,
|
`least____a_a` int(11) DEFAULT NULL,
|
||||||
`greatest_a_a` int(11) DEFAULT NULL,
|
`greatest_a_a` int(11) DEFAULT NULL,
|
||||||
`___________b` bit(8) DEFAULT NULL,
|
`___________b` bit(8) DEFAULT NULL,
|
||||||
`case_______b` int(8) unsigned DEFAULT NULL,
|
`case_______b` bit(8) DEFAULT NULL,
|
||||||
`case_____b_b` int(8) unsigned DEFAULT NULL,
|
`case_____b_b` bit(8) DEFAULT NULL,
|
||||||
`coalesce___b` int(8) unsigned DEFAULT NULL,
|
`coalesce___b` bit(8) DEFAULT NULL,
|
||||||
`coalesce_b_b` int(8) unsigned DEFAULT NULL,
|
`coalesce_b_b` bit(8) DEFAULT NULL,
|
||||||
`if_______b_b` int(8) unsigned DEFAULT NULL,
|
`if_______b_b` bit(8) DEFAULT NULL,
|
||||||
`ifnull___b_b` bit(8) DEFAULT NULL,
|
`ifnull___b_b` bit(8) DEFAULT NULL,
|
||||||
`least____b_b` int(8) unsigned DEFAULT NULL,
|
`least____b_b` bit(8) DEFAULT NULL,
|
||||||
`greatest_b_b` int(8) unsigned DEFAULT NULL
|
`greatest_b_b` bit(8) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||||||
|
@ -1119,18 +1119,18 @@ GREATEST(a, b) AS greatest_a_b,
|
||||||
GREATEST(b, a) AS greatest_b_a
|
GREATEST(b, a) AS greatest_b_a
|
||||||
FROM t1;
|
FROM t1;
|
||||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
def case_____a_b 8 10 10 Y 32928 0 63
|
def case_____a_b 3 10 10 Y 32928 0 63
|
||||||
def case_____b_a 8 10 2 Y 32928 0 63
|
def case_____b_a 3 10 2 Y 32928 0 63
|
||||||
def coalesce_a_b 8 10 10 Y 32928 0 63
|
def coalesce_a_b 3 10 10 Y 32928 0 63
|
||||||
def coalesce_b_a 8 10 2 Y 32928 0 63
|
def coalesce_b_a 3 10 2 Y 32928 0 63
|
||||||
def if_______a_b 8 10 2 Y 32928 0 63
|
def if_______a_b 3 10 2 Y 32928 0 63
|
||||||
def if_______b_a 8 10 10 Y 32928 0 63
|
def if_______b_a 3 10 10 Y 32928 0 63
|
||||||
def ifnull___a_b 8 10 10 Y 32928 0 63
|
def ifnull___a_b 3 10 10 Y 32928 0 63
|
||||||
def ifnull___b_a 8 10 2 Y 32928 0 63
|
def ifnull___b_a 3 10 2 Y 32928 0 63
|
||||||
def least____a_b 8 10 2 Y 32928 0 63
|
def least____a_b 3 10 2 Y 32928 0 63
|
||||||
def least____b_a 8 10 2 Y 32928 0 63
|
def least____b_a 3 10 2 Y 32928 0 63
|
||||||
def greatest_a_b 8 10 10 Y 32928 0 63
|
def greatest_a_b 3 10 10 Y 32928 0 63
|
||||||
def greatest_b_a 8 10 10 Y 32928 0 63
|
def greatest_b_a 3 10 10 Y 32928 0 63
|
||||||
case_____a_b 4294967295
|
case_____a_b 4294967295
|
||||||
case_____b_a 50
|
case_____b_a 50
|
||||||
coalesce_a_b 4294967295
|
coalesce_a_b 4294967295
|
||||||
|
@ -1177,14 +1177,14 @@ t2 CREATE TABLE `t2` (
|
||||||
`least____a_a` int(10) unsigned DEFAULT NULL,
|
`least____a_a` int(10) unsigned DEFAULT NULL,
|
||||||
`greatest_a_a` int(10) unsigned DEFAULT NULL,
|
`greatest_a_a` int(10) unsigned DEFAULT NULL,
|
||||||
`___________b` bit(8) DEFAULT NULL,
|
`___________b` bit(8) DEFAULT NULL,
|
||||||
`case_______b` int(8) unsigned DEFAULT NULL,
|
`case_______b` bit(8) DEFAULT NULL,
|
||||||
`case_____b_b` int(8) unsigned DEFAULT NULL,
|
`case_____b_b` bit(8) DEFAULT NULL,
|
||||||
`coalesce___b` int(8) unsigned DEFAULT NULL,
|
`coalesce___b` bit(8) DEFAULT NULL,
|
||||||
`coalesce_b_b` int(8) unsigned DEFAULT NULL,
|
`coalesce_b_b` bit(8) DEFAULT NULL,
|
||||||
`if_______b_b` int(8) unsigned DEFAULT NULL,
|
`if_______b_b` bit(8) DEFAULT NULL,
|
||||||
`ifnull___b_b` bit(8) DEFAULT NULL,
|
`ifnull___b_b` bit(8) DEFAULT NULL,
|
||||||
`least____b_b` int(8) unsigned DEFAULT NULL,
|
`least____b_b` bit(8) DEFAULT NULL,
|
||||||
`greatest_b_b` int(8) unsigned DEFAULT NULL
|
`greatest_b_b` bit(8) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||||||
|
@ -1212,8 +1212,8 @@ t2 CREATE TABLE `t2` (
|
||||||
`coalesce_b_a` int(10) unsigned DEFAULT NULL,
|
`coalesce_b_a` int(10) unsigned DEFAULT NULL,
|
||||||
`if_______a_b` int(10) unsigned DEFAULT NULL,
|
`if_______a_b` int(10) unsigned DEFAULT NULL,
|
||||||
`if_______b_a` int(10) unsigned DEFAULT NULL,
|
`if_______b_a` int(10) unsigned DEFAULT NULL,
|
||||||
`ifnull___a_b` bigint(10) unsigned DEFAULT NULL,
|
`ifnull___a_b` int(10) unsigned DEFAULT NULL,
|
||||||
`ifnull___b_a` bigint(10) unsigned DEFAULT NULL,
|
`ifnull___b_a` int(10) unsigned DEFAULT NULL,
|
||||||
`least____a_b` int(10) unsigned DEFAULT NULL,
|
`least____a_b` int(10) unsigned DEFAULT NULL,
|
||||||
`least____b_a` int(10) unsigned DEFAULT NULL,
|
`least____b_a` int(10) unsigned DEFAULT NULL,
|
||||||
`greatest_a_b` int(10) unsigned DEFAULT NULL,
|
`greatest_a_b` int(10) unsigned DEFAULT NULL,
|
||||||
|
@ -1345,23 +1345,23 @@ SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`___________a` bit(7) DEFAULT NULL,
|
`___________a` bit(7) DEFAULT NULL,
|
||||||
`case_______a` int(7) unsigned DEFAULT NULL,
|
`case_______a` bit(7) DEFAULT NULL,
|
||||||
`case_____a_a` int(7) unsigned DEFAULT NULL,
|
`case_____a_a` bit(7) DEFAULT NULL,
|
||||||
`coalesce___a` int(7) unsigned DEFAULT NULL,
|
`coalesce___a` bit(7) DEFAULT NULL,
|
||||||
`coalesce_a_a` int(7) unsigned DEFAULT NULL,
|
`coalesce_a_a` bit(7) DEFAULT NULL,
|
||||||
`if_______a_a` int(7) unsigned DEFAULT NULL,
|
`if_______a_a` bit(7) DEFAULT NULL,
|
||||||
`ifnull___a_a` bit(7) DEFAULT NULL,
|
`ifnull___a_a` bit(7) DEFAULT NULL,
|
||||||
`least____a_a` int(7) unsigned DEFAULT NULL,
|
`least____a_a` bit(7) DEFAULT NULL,
|
||||||
`greatest_a_a` int(7) unsigned DEFAULT NULL,
|
`greatest_a_a` bit(7) DEFAULT NULL,
|
||||||
`___________b` bit(8) DEFAULT NULL,
|
`___________b` bit(8) DEFAULT NULL,
|
||||||
`case_______b` int(8) unsigned DEFAULT NULL,
|
`case_______b` bit(8) DEFAULT NULL,
|
||||||
`case_____b_b` int(8) unsigned DEFAULT NULL,
|
`case_____b_b` bit(8) DEFAULT NULL,
|
||||||
`coalesce___b` int(8) unsigned DEFAULT NULL,
|
`coalesce___b` bit(8) DEFAULT NULL,
|
||||||
`coalesce_b_b` int(8) unsigned DEFAULT NULL,
|
`coalesce_b_b` bit(8) DEFAULT NULL,
|
||||||
`if_______b_b` int(8) unsigned DEFAULT NULL,
|
`if_______b_b` bit(8) DEFAULT NULL,
|
||||||
`ifnull___b_b` bit(8) DEFAULT NULL,
|
`ifnull___b_b` bit(8) DEFAULT NULL,
|
||||||
`least____b_b` int(8) unsigned DEFAULT NULL,
|
`least____b_b` bit(8) DEFAULT NULL,
|
||||||
`greatest_b_b` int(8) unsigned DEFAULT NULL
|
`greatest_b_b` bit(8) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||||||
|
@ -1383,18 +1383,18 @@ FROM t1;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`case_____a_b` int(8) unsigned DEFAULT NULL,
|
`case_____a_b` bit(8) DEFAULT NULL,
|
||||||
`case_____b_a` int(8) unsigned DEFAULT NULL,
|
`case_____b_a` bit(8) DEFAULT NULL,
|
||||||
`coalesce_a_b` int(8) unsigned DEFAULT NULL,
|
`coalesce_a_b` bit(8) DEFAULT NULL,
|
||||||
`coalesce_b_a` int(8) unsigned DEFAULT NULL,
|
`coalesce_b_a` bit(8) DEFAULT NULL,
|
||||||
`if_______a_b` int(8) unsigned DEFAULT NULL,
|
`if_______a_b` bit(8) DEFAULT NULL,
|
||||||
`if_______b_a` int(8) unsigned DEFAULT NULL,
|
`if_______b_a` bit(8) DEFAULT NULL,
|
||||||
`ifnull___a_b` bit(8) DEFAULT NULL,
|
`ifnull___a_b` bit(8) DEFAULT NULL,
|
||||||
`ifnull___b_a` bit(8) DEFAULT NULL,
|
`ifnull___b_a` bit(8) DEFAULT NULL,
|
||||||
`least____a_b` int(8) unsigned DEFAULT NULL,
|
`least____a_b` bit(8) DEFAULT NULL,
|
||||||
`least____b_a` int(8) unsigned DEFAULT NULL,
|
`least____b_a` bit(8) DEFAULT NULL,
|
||||||
`greatest_a_b` int(8) unsigned DEFAULT NULL,
|
`greatest_a_b` bit(8) DEFAULT NULL,
|
||||||
`greatest_b_a` int(8) unsigned DEFAULT NULL
|
`greatest_b_a` bit(8) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -1429,8 +1429,8 @@ def coalesce___a 4 12 1 Y 32896 31 63
|
||||||
def coalesce_a_a 4 12 1 Y 32896 31 63
|
def coalesce_a_a 4 12 1 Y 32896 31 63
|
||||||
def if_______a_a 4 12 1 Y 32896 31 63
|
def if_______a_a 4 12 1 Y 32896 31 63
|
||||||
def ifnull___a_a 4 12 1 Y 32896 31 63
|
def ifnull___a_a 4 12 1 Y 32896 31 63
|
||||||
def least____a_a 5 23 1 Y 32896 31 63
|
def least____a_a 4 23 1 Y 32896 31 63
|
||||||
def greatest_a_a 5 23 1 Y 32896 31 63
|
def greatest_a_a 4 23 1 Y 32896 31 63
|
||||||
def test t1 t1 b ___________b 2 6 6 Y 32768 0 63
|
def test t1 t1 b ___________b 2 6 6 Y 32768 0 63
|
||||||
def case_______b 2 6 6 Y 32896 0 63
|
def case_______b 2 6 6 Y 32896 0 63
|
||||||
def case_____b_b 2 6 6 Y 32896 0 63
|
def case_____b_b 2 6 6 Y 32896 0 63
|
||||||
|
@ -1522,23 +1522,23 @@ SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`___________a` float DEFAULT NULL,
|
`___________a` float DEFAULT NULL,
|
||||||
`case_______a` double DEFAULT NULL,
|
`case_______a` float DEFAULT NULL,
|
||||||
`case_____a_a` double DEFAULT NULL,
|
`case_____a_a` float DEFAULT NULL,
|
||||||
`coalesce___a` double DEFAULT NULL,
|
`coalesce___a` float DEFAULT NULL,
|
||||||
`coalesce_a_a` double DEFAULT NULL,
|
`coalesce_a_a` float DEFAULT NULL,
|
||||||
`if_______a_a` double DEFAULT NULL,
|
`if_______a_a` float DEFAULT NULL,
|
||||||
`ifnull___a_a` float DEFAULT NULL,
|
`ifnull___a_a` float DEFAULT NULL,
|
||||||
`least____a_a` double DEFAULT NULL,
|
`least____a_a` float DEFAULT NULL,
|
||||||
`greatest_a_a` double DEFAULT NULL,
|
`greatest_a_a` float DEFAULT NULL,
|
||||||
`___________b` smallint(6) DEFAULT NULL,
|
`___________b` smallint(6) DEFAULT NULL,
|
||||||
`case_______b` int(6) DEFAULT NULL,
|
`case_______b` smallint(6) DEFAULT NULL,
|
||||||
`case_____b_b` int(6) DEFAULT NULL,
|
`case_____b_b` smallint(6) DEFAULT NULL,
|
||||||
`coalesce___b` int(6) DEFAULT NULL,
|
`coalesce___b` smallint(6) DEFAULT NULL,
|
||||||
`coalesce_b_b` int(6) DEFAULT NULL,
|
`coalesce_b_b` smallint(6) DEFAULT NULL,
|
||||||
`if_______b_b` int(6) DEFAULT NULL,
|
`if_______b_b` smallint(6) DEFAULT NULL,
|
||||||
`ifnull___b_b` smallint(6) DEFAULT NULL,
|
`ifnull___b_b` smallint(6) DEFAULT NULL,
|
||||||
`least____b_b` int(6) DEFAULT NULL,
|
`least____b_b` smallint(6) DEFAULT NULL,
|
||||||
`greatest_b_b` int(6) DEFAULT NULL
|
`greatest_b_b` smallint(6) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||||||
|
@ -1560,12 +1560,12 @@ FROM t1;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`case_____a_b` double DEFAULT NULL,
|
`case_____a_b` float DEFAULT NULL,
|
||||||
`case_____b_a` double DEFAULT NULL,
|
`case_____b_a` float DEFAULT NULL,
|
||||||
`coalesce_a_b` double DEFAULT NULL,
|
`coalesce_a_b` float DEFAULT NULL,
|
||||||
`coalesce_b_a` double DEFAULT NULL,
|
`coalesce_b_a` float DEFAULT NULL,
|
||||||
`if_______a_b` double DEFAULT NULL,
|
`if_______a_b` float DEFAULT NULL,
|
||||||
`if_______b_a` double DEFAULT NULL,
|
`if_______b_a` float DEFAULT NULL,
|
||||||
`ifnull___a_b` float DEFAULT NULL,
|
`ifnull___a_b` float DEFAULT NULL,
|
||||||
`ifnull___b_a` float DEFAULT NULL,
|
`ifnull___b_a` float DEFAULT NULL,
|
||||||
`least____a_b` double DEFAULT NULL,
|
`least____a_b` double DEFAULT NULL,
|
||||||
|
@ -1885,14 +1885,14 @@ t2 CREATE TABLE `t2` (
|
||||||
`least____a_a` int(11) DEFAULT NULL,
|
`least____a_a` int(11) DEFAULT NULL,
|
||||||
`greatest_a_a` int(11) DEFAULT NULL,
|
`greatest_a_a` int(11) DEFAULT NULL,
|
||||||
`___________b` year(4) DEFAULT NULL,
|
`___________b` year(4) DEFAULT NULL,
|
||||||
`case_______b` int(4) unsigned DEFAULT NULL,
|
`case_______b` year(4) DEFAULT NULL,
|
||||||
`case_____b_b` int(4) unsigned DEFAULT NULL,
|
`case_____b_b` year(4) DEFAULT NULL,
|
||||||
`coalesce___b` int(4) unsigned DEFAULT NULL,
|
`coalesce___b` year(4) DEFAULT NULL,
|
||||||
`coalesce_b_b` int(4) unsigned DEFAULT NULL,
|
`coalesce_b_b` year(4) DEFAULT NULL,
|
||||||
`if_______b_b` int(4) unsigned DEFAULT NULL,
|
`if_______b_b` year(4) DEFAULT NULL,
|
||||||
`ifnull___b_b` year(4) DEFAULT NULL,
|
`ifnull___b_b` year(4) DEFAULT NULL,
|
||||||
`least____b_b` int(4) unsigned DEFAULT NULL,
|
`least____b_b` year(4) DEFAULT NULL,
|
||||||
`greatest_b_b` int(4) unsigned DEFAULT NULL
|
`greatest_b_b` year(4) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||||||
|
@ -2062,14 +2062,14 @@ t2 CREATE TABLE `t2` (
|
||||||
`least____a_a` int(10) unsigned DEFAULT NULL,
|
`least____a_a` int(10) unsigned DEFAULT NULL,
|
||||||
`greatest_a_a` int(10) unsigned DEFAULT NULL,
|
`greatest_a_a` int(10) unsigned DEFAULT NULL,
|
||||||
`___________b` year(4) DEFAULT NULL,
|
`___________b` year(4) DEFAULT NULL,
|
||||||
`case_______b` int(4) unsigned DEFAULT NULL,
|
`case_______b` year(4) DEFAULT NULL,
|
||||||
`case_____b_b` int(4) unsigned DEFAULT NULL,
|
`case_____b_b` year(4) DEFAULT NULL,
|
||||||
`coalesce___b` int(4) unsigned DEFAULT NULL,
|
`coalesce___b` year(4) DEFAULT NULL,
|
||||||
`coalesce_b_b` int(4) unsigned DEFAULT NULL,
|
`coalesce_b_b` year(4) DEFAULT NULL,
|
||||||
`if_______b_b` int(4) unsigned DEFAULT NULL,
|
`if_______b_b` year(4) DEFAULT NULL,
|
||||||
`ifnull___b_b` year(4) DEFAULT NULL,
|
`ifnull___b_b` year(4) DEFAULT NULL,
|
||||||
`least____b_b` int(4) unsigned DEFAULT NULL,
|
`least____b_b` year(4) DEFAULT NULL,
|
||||||
`greatest_b_b` int(4) unsigned DEFAULT NULL
|
`greatest_b_b` year(4) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR
|
||||||
|
@ -3512,5 +3512,40 @@ t2 CREATE TABLE `t2` (
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-12617 CASE and CASE-alike hybrid functions do not preserve exact data types
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a FLOAT(10,2));
|
||||||
|
CREATE TABLE t2 AS SELECT COALESCE(a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`COALESCE(a)` float(10,2) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
CREATE TABLE t1 (a FLOAT(10,2));
|
||||||
|
CREATE TABLE t2 AS SELECT LEAST(a,a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`LEAST(a,a)` float(19,2) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
CREATE TABLE t1 (a TINYINT(1));
|
||||||
|
CREATE TABLE t2 AS SELECT COALESCE(a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`COALESCE(a)` tinyint(4) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
CREATE TABLE t1 (a TINYINT(1));
|
||||||
|
CREATE TABLE t2 AS SELECT LEAST(a,a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
Table Create Table
|
||||||
|
t2 CREATE TABLE `t2` (
|
||||||
|
`LEAST(a,a)` tinyint(4) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
#
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
#
|
#
|
||||||
|
|
|
@ -297,6 +297,9 @@ STRINGpadpadpadpadpa
|
||||||
select lpad('STRING', 20, CONCAT('p','a','d') );
|
select lpad('STRING', 20, CONCAT('p','a','d') );
|
||||||
lpad('STRING', 20, CONCAT('p','a','d') )
|
lpad('STRING', 20, CONCAT('p','a','d') )
|
||||||
padpadpadpadpaSTRING
|
padpadpadpadpaSTRING
|
||||||
|
select rpad('abcd',7),lpad('abcd',7);
|
||||||
|
rpad('abcd',7) lpad('abcd',7)
|
||||||
|
abcd abcd
|
||||||
select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD');
|
select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD');
|
||||||
LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD')
|
LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD')
|
||||||
NULL NULL
|
NULL NULL
|
||||||
|
@ -637,9 +640,15 @@ latin2_general_ci 4
|
||||||
select collation(lpad(_latin2'a',4,_latin2'b')), coercibility(lpad(_latin2'a',4,_latin2'b'));
|
select collation(lpad(_latin2'a',4,_latin2'b')), coercibility(lpad(_latin2'a',4,_latin2'b'));
|
||||||
collation(lpad(_latin2'a',4,_latin2'b')) coercibility(lpad(_latin2'a',4,_latin2'b'))
|
collation(lpad(_latin2'a',4,_latin2'b')) coercibility(lpad(_latin2'a',4,_latin2'b'))
|
||||||
latin2_general_ci 4
|
latin2_general_ci 4
|
||||||
|
select collation(lpad(_latin2'a',4)), coercibility(lpad(_latin2'a',4));
|
||||||
|
collation(lpad(_latin2'a',4)) coercibility(lpad(_latin2'a',4))
|
||||||
|
latin2_general_ci 4
|
||||||
select collation(rpad(_latin2'a',4,_latin2'b')), coercibility(rpad(_latin2'a',4,_latin2'b'));
|
select collation(rpad(_latin2'a',4,_latin2'b')), coercibility(rpad(_latin2'a',4,_latin2'b'));
|
||||||
collation(rpad(_latin2'a',4,_latin2'b')) coercibility(rpad(_latin2'a',4,_latin2'b'))
|
collation(rpad(_latin2'a',4,_latin2'b')) coercibility(rpad(_latin2'a',4,_latin2'b'))
|
||||||
latin2_general_ci 4
|
latin2_general_ci 4
|
||||||
|
select collation(rpad(_latin2'a',4)), coercibility(rpad(_latin2'a',4));
|
||||||
|
collation(rpad(_latin2'a',4)) coercibility(rpad(_latin2'a',4))
|
||||||
|
latin2_general_ci 4
|
||||||
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
|
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
|
||||||
collation(concat_ws(_latin2'a',_latin2'b')) coercibility(concat_ws(_latin2'a',_latin2'b'))
|
collation(concat_ws(_latin2'a',_latin2'b')) coercibility(concat_ws(_latin2'a',_latin2'b'))
|
||||||
latin2_general_ci 4
|
latin2_general_ci 4
|
||||||
|
@ -707,6 +716,8 @@ substring(_latin2'a',1,1),
|
||||||
concat(_latin2'a',_latin2'b'),
|
concat(_latin2'a',_latin2'b'),
|
||||||
lpad(_latin2'a',4,_latin2'b'),
|
lpad(_latin2'a',4,_latin2'b'),
|
||||||
rpad(_latin2'a',4,_latin2'b'),
|
rpad(_latin2'a',4,_latin2'b'),
|
||||||
|
lpad(_latin2'a',4),
|
||||||
|
rpad(_latin2'a',4),
|
||||||
concat_ws(_latin2'a',_latin2'b'),
|
concat_ws(_latin2'a',_latin2'b'),
|
||||||
make_set(255,_latin2'a',_latin2'b',_latin2'c'),
|
make_set(255,_latin2'a',_latin2'b',_latin2'c'),
|
||||||
export_set(255,_latin2'y',_latin2'n',_latin2' '),
|
export_set(255,_latin2'y',_latin2'n',_latin2' '),
|
||||||
|
@ -742,6 +753,8 @@ t1 CREATE TABLE `t1` (
|
||||||
`concat(_latin2'a',_latin2'b')` varchar(2) CHARACTER SET latin2 DEFAULT NULL,
|
`concat(_latin2'a',_latin2'b')` varchar(2) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
`lpad(_latin2'a',4,_latin2'b')` varchar(4) CHARACTER SET latin2 DEFAULT NULL,
|
`lpad(_latin2'a',4,_latin2'b')` varchar(4) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
`rpad(_latin2'a',4,_latin2'b')` varchar(4) CHARACTER SET latin2 DEFAULT NULL,
|
`rpad(_latin2'a',4,_latin2'b')` varchar(4) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
|
`lpad(_latin2'a',4)` varchar(4) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
|
`rpad(_latin2'a',4)` varchar(4) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
`concat_ws(_latin2'a',_latin2'b')` varchar(1) CHARACTER SET latin2 DEFAULT NULL,
|
`concat_ws(_latin2'a',_latin2'b')` varchar(1) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
`make_set(255,_latin2'a',_latin2'b',_latin2'c')` varchar(5) CHARACTER SET latin2 DEFAULT NULL,
|
`make_set(255,_latin2'a',_latin2'b',_latin2'c')` varchar(5) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
`export_set(255,_latin2'y',_latin2'n',_latin2' ')` varchar(127) CHARACTER SET latin2 DEFAULT NULL,
|
`export_set(255,_latin2'y',_latin2'n',_latin2' ')` varchar(127) CHARACTER SET latin2 DEFAULT NULL,
|
||||||
|
@ -869,6 +882,16 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select lpad('a',4,'1') AS `lpad('a',4,'1')`
|
Note 1003 select lpad('a',4,'1') AS `lpad('a',4,'1')`
|
||||||
|
explain extended select rpad('a',4);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select rpad('a',4) AS `rpad('a',4)`
|
||||||
|
explain extended select lpad('a',4);
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select lpad('a',4) AS `lpad('a',4)`
|
||||||
explain extended select concat_ws(',','',NULL,'a');
|
explain extended select concat_ws(',','',NULL,'a');
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
@ -2213,6 +2236,76 @@ Warnings:
|
||||||
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', -1);
|
||||||
|
rpad('hello', -1)
|
||||||
|
NULL
|
||||||
|
select rpad('hello', -4294967295);
|
||||||
|
rpad('hello', -4294967295)
|
||||||
|
NULL
|
||||||
|
select rpad('hello', 4294967295);
|
||||||
|
rpad('hello', 4294967295)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', -4294967296);
|
||||||
|
rpad('hello', -4294967296)
|
||||||
|
NULL
|
||||||
|
select rpad('hello', 4294967296);
|
||||||
|
rpad('hello', 4294967296)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', -4294967297);
|
||||||
|
rpad('hello', -4294967297)
|
||||||
|
NULL
|
||||||
|
select rpad('hello', 4294967297);
|
||||||
|
rpad('hello', 4294967297)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', -18446744073709551615);
|
||||||
|
rpad('hello', -18446744073709551615)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551615' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551615' to INT. Value truncated
|
||||||
|
select rpad('hello', 18446744073709551615);
|
||||||
|
rpad('hello', 18446744073709551615)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', -18446744073709551616);
|
||||||
|
rpad('hello', -18446744073709551616)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551616' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551616' to INT. Value truncated
|
||||||
|
select rpad('hello', 18446744073709551616);
|
||||||
|
rpad('hello', 18446744073709551616)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated
|
||||||
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', -18446744073709551617);
|
||||||
|
rpad('hello', -18446744073709551617)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551617' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551617' to INT. Value truncated
|
||||||
|
select rpad('hello', 18446744073709551617);
|
||||||
|
rpad('hello', 18446744073709551617)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
|
Warning 1301 Result of rpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select rpad('hello', 0, 'x');
|
||||||
|
rpad('hello', 0, 'x')
|
||||||
|
|
||||||
|
select rpad('hello', 0);
|
||||||
|
rpad('hello', 0)
|
||||||
|
|
||||||
select lpad('hello', -1, '1');
|
select lpad('hello', -1, '1');
|
||||||
lpad('hello', -1, '1')
|
lpad('hello', -1, '1')
|
||||||
NULL
|
NULL
|
||||||
|
@ -2277,6 +2370,85 @@ Warnings:
|
||||||
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', -1);
|
||||||
|
lpad('hello', -1)
|
||||||
|
NULL
|
||||||
|
select lpad('hello', -4294967295);
|
||||||
|
lpad('hello', -4294967295)
|
||||||
|
NULL
|
||||||
|
select lpad('hello', 4294967295);
|
||||||
|
lpad('hello', 4294967295)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', -4294967296);
|
||||||
|
lpad('hello', -4294967296)
|
||||||
|
NULL
|
||||||
|
select lpad('hello', 4294967296);
|
||||||
|
lpad('hello', 4294967296)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', -4294967297);
|
||||||
|
lpad('hello', -4294967297)
|
||||||
|
NULL
|
||||||
|
select lpad('hello', 4294967297);
|
||||||
|
lpad('hello', 4294967297)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', -18446744073709551615);
|
||||||
|
lpad('hello', -18446744073709551615)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551615' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551615' to INT. Value truncated
|
||||||
|
select lpad('hello', 18446744073709551615);
|
||||||
|
lpad('hello', 18446744073709551615)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', -18446744073709551616);
|
||||||
|
lpad('hello', -18446744073709551616)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551616' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551616' to INT. Value truncated
|
||||||
|
select lpad('hello', 18446744073709551616);
|
||||||
|
lpad('hello', 18446744073709551616)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated
|
||||||
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', -18446744073709551617);
|
||||||
|
lpad('hello', -18446744073709551617)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551617' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '-18446744073709551617' to INT. Value truncated
|
||||||
|
select lpad('hello', 18446744073709551617);
|
||||||
|
lpad('hello', 18446744073709551617)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
|
Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated
|
||||||
|
Warning 1301 Result of lpad() was larger than max_allowed_packet (1048576) - truncated
|
||||||
|
select lpad('hello', 0, 'x');
|
||||||
|
lpad('hello', 0, 'x')
|
||||||
|
|
||||||
|
select lpad('hello', 0);
|
||||||
|
lpad('hello', 0)
|
||||||
|
|
||||||
|
Check parameters count rpad / lpad
|
||||||
|
select rpad('x');
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'rpad'
|
||||||
|
select rpad('x',2,'.','z');
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'rpad'
|
||||||
|
select lpad('x');
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'lpad'
|
||||||
|
select lpad('x',2,'.','z');
|
||||||
|
ERROR 42000: Incorrect parameter count in the call to native function 'lpad'
|
||||||
SET @orig_sql_mode = @@SQL_MODE;
|
SET @orig_sql_mode = @@SQL_MODE;
|
||||||
SET SQL_MODE=traditional;
|
SET SQL_MODE=traditional;
|
||||||
SELECT CHAR(0xff,0x8f USING utf8);
|
SELECT CHAR(0xff,0x8f USING utf8);
|
||||||
|
@ -2302,6 +2474,12 @@ abcxx
|
||||||
select lpad('abc', cast(5 as unsigned integer), 'x');
|
select lpad('abc', cast(5 as unsigned integer), 'x');
|
||||||
lpad('abc', cast(5 as unsigned integer), 'x')
|
lpad('abc', cast(5 as unsigned integer), 'x')
|
||||||
xxabc
|
xxabc
|
||||||
|
select rpad('abc', cast(5 as unsigned integer));
|
||||||
|
rpad('abc', cast(5 as unsigned integer))
|
||||||
|
abc
|
||||||
|
select lpad('abc', cast(5 as unsigned integer));
|
||||||
|
lpad('abc', cast(5 as unsigned integer))
|
||||||
|
abc
|
||||||
create table t1(f1 longtext);
|
create table t1(f1 longtext);
|
||||||
insert into t1 values ("123"),("456");
|
insert into t1 values ("123"),("456");
|
||||||
select substring(f1,1,1) from t1 group by 1;
|
select substring(f1,1,1) from t1 group by 1;
|
||||||
|
@ -2663,6 +2841,12 @@ NULL
|
||||||
SELECT LPAD('hi', DAY(FROM_UNIXTIME(-1)),'?');
|
SELECT LPAD('hi', DAY(FROM_UNIXTIME(-1)),'?');
|
||||||
LPAD('hi', DAY(FROM_UNIXTIME(-1)),'?')
|
LPAD('hi', DAY(FROM_UNIXTIME(-1)),'?')
|
||||||
NULL
|
NULL
|
||||||
|
SELECT RPAD('hi', DAY(FROM_UNIXTIME(-1)));
|
||||||
|
RPAD('hi', DAY(FROM_UNIXTIME(-1)))
|
||||||
|
NULL
|
||||||
|
SELECT LPAD('hi', DAY(FROM_UNIXTIME(-1)));
|
||||||
|
LPAD('hi', DAY(FROM_UNIXTIME(-1)))
|
||||||
|
NULL
|
||||||
create table t1 (i int);
|
create table t1 (i int);
|
||||||
insert into t1 values (null),(8);
|
insert into t1 values (null),(8);
|
||||||
select group_concat( i ), make_set( i, 'a', 'b' ) field from t1 group by field;
|
select group_concat( i ), make_set( i, 'a', 'b' ) field from t1 group by field;
|
||||||
|
|
|
@ -1,13 +1,105 @@
|
||||||
drop table if exists t1,t2;
|
drop table if exists t1,t2;
|
||||||
select 1, 1.0, -1, "hello", NULL;
|
select 1, 1.0, -1, "hello", NULL;
|
||||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
def 1 8 1 1 N 32897 0 63
|
def 1 3 1 1 N 32897 0 63
|
||||||
def 1.0 246 4 3 N 32897 1 63
|
def 1.0 246 4 3 N 32897 1 63
|
||||||
def -1 8 2 2 N 32897 0 63
|
def -1 3 2 2 N 32897 0 63
|
||||||
def hello 253 5 5 N 1 39 8
|
def hello 253 5 5 N 1 39 8
|
||||||
def NULL 6 0 0 Y 32896 0 63
|
def NULL 6 0 0 Y 32896 0 63
|
||||||
1 1.0 -1 hello NULL
|
1 1.0 -1 hello NULL
|
||||||
1 1.0 -1 hello NULL
|
1 1.0 -1 hello NULL
|
||||||
|
SELECT
|
||||||
|
1 AS c1,
|
||||||
|
11 AS c2,
|
||||||
|
111 AS c3,
|
||||||
|
1111 AS c4,
|
||||||
|
11111 AS c5,
|
||||||
|
111111 AS c6,
|
||||||
|
1111111 AS c7,
|
||||||
|
11111111 AS c8,
|
||||||
|
111111111 AS c9,
|
||||||
|
1111111111 AS c10,
|
||||||
|
11111111111 AS c11,
|
||||||
|
111111111111 AS c12,
|
||||||
|
1111111111111 AS c13,
|
||||||
|
11111111111111 AS c14,
|
||||||
|
111111111111111 AS c15,
|
||||||
|
1111111111111111 AS c16,
|
||||||
|
11111111111111111 AS c17,
|
||||||
|
111111111111111111 AS c18,
|
||||||
|
1111111111111111111 AS c19,
|
||||||
|
11111111111111111111 AS c20,
|
||||||
|
111111111111111111111 AS c21;
|
||||||
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
|
def c1 3 1 1 N 32897 0 63
|
||||||
|
def c2 3 2 2 N 32897 0 63
|
||||||
|
def c3 3 3 3 N 32897 0 63
|
||||||
|
def c4 3 4 4 N 32897 0 63
|
||||||
|
def c5 3 5 5 N 32897 0 63
|
||||||
|
def c6 3 6 6 N 32897 0 63
|
||||||
|
def c7 3 7 7 N 32897 0 63
|
||||||
|
def c8 3 8 8 N 32897 0 63
|
||||||
|
def c9 3 9 9 N 32897 0 63
|
||||||
|
def c10 8 10 10 N 32897 0 63
|
||||||
|
def c11 8 11 11 N 32897 0 63
|
||||||
|
def c12 8 12 12 N 32897 0 63
|
||||||
|
def c13 8 13 13 N 32897 0 63
|
||||||
|
def c14 8 14 14 N 32897 0 63
|
||||||
|
def c15 8 15 15 N 32897 0 63
|
||||||
|
def c16 8 16 16 N 32897 0 63
|
||||||
|
def c17 8 17 17 N 32897 0 63
|
||||||
|
def c18 8 18 18 N 32897 0 63
|
||||||
|
def c19 8 19 19 N 32897 0 63
|
||||||
|
def c20 8 20 20 N 32929 0 63
|
||||||
|
def c21 246 22 21 N 32897 0 63
|
||||||
|
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21
|
||||||
|
1 11 111 1111 11111 111111 1111111 11111111 111111111 1111111111 11111111111 111111111111 1111111111111 11111111111111 111111111111111 1111111111111111 11111111111111111 111111111111111111 1111111111111111111 11111111111111111111 111111111111111111111
|
||||||
|
SELECT
|
||||||
|
-1 AS c1,
|
||||||
|
-11 AS c2,
|
||||||
|
-111 AS c3,
|
||||||
|
-1111 AS c4,
|
||||||
|
-11111 AS c5,
|
||||||
|
-111111 AS c6,
|
||||||
|
-1111111 AS c7,
|
||||||
|
-11111111 AS c8,
|
||||||
|
-111111111 AS c9,
|
||||||
|
-1111111111 AS c10,
|
||||||
|
-11111111111 AS c11,
|
||||||
|
-111111111111 AS c12,
|
||||||
|
-1111111111111 AS c13,
|
||||||
|
-11111111111111 AS c14,
|
||||||
|
-111111111111111 AS c15,
|
||||||
|
-1111111111111111 AS c16,
|
||||||
|
-11111111111111111 AS c17,
|
||||||
|
-111111111111111111 AS c18,
|
||||||
|
-1111111111111111111 AS c19,
|
||||||
|
-11111111111111111111 AS c20,
|
||||||
|
-111111111111111111111 AS c21;
|
||||||
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
|
def c1 3 2 2 N 32897 0 63
|
||||||
|
def c2 3 3 3 N 32897 0 63
|
||||||
|
def c3 3 4 4 N 32897 0 63
|
||||||
|
def c4 3 5 5 N 32897 0 63
|
||||||
|
def c5 3 6 6 N 32897 0 63
|
||||||
|
def c6 3 7 7 N 32897 0 63
|
||||||
|
def c7 3 8 8 N 32897 0 63
|
||||||
|
def c8 3 9 9 N 32897 0 63
|
||||||
|
def c9 8 10 10 N 32897 0 63
|
||||||
|
def c10 8 11 11 N 32897 0 63
|
||||||
|
def c11 8 12 12 N 32897 0 63
|
||||||
|
def c12 8 13 13 N 32897 0 63
|
||||||
|
def c13 8 14 14 N 32897 0 63
|
||||||
|
def c14 8 15 15 N 32897 0 63
|
||||||
|
def c15 8 16 16 N 32897 0 63
|
||||||
|
def c16 8 17 17 N 32897 0 63
|
||||||
|
def c17 8 18 18 N 32897 0 63
|
||||||
|
def c18 8 19 19 N 32897 0 63
|
||||||
|
def c19 8 20 20 N 32897 0 63
|
||||||
|
def c20 246 21 21 N 32897 0 63
|
||||||
|
def c21 246 22 22 N 32897 0 63
|
||||||
|
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21
|
||||||
|
-1 -11 -111 -1111 -11111 -111111 -1111111 -11111111 -111111111 -1111111111 -11111111111 -111111111111 -1111111111111 -11111111111111 -111111111111111 -1111111111111111 -11111111111111111 -111111111111111111 -1111111111111111111 -11111111111111111111 -111111111111111111111
|
||||||
create table t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float(3,2), g double(4,3), h decimal(5,4), i year, j date, k timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, l datetime, m enum('a','b'), n set('a','b'), o char(10));
|
create table t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float(3,2), g double(4,3), h decimal(5,4), i year, j date, k timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, l datetime, m enum('a','b'), n set('a','b'), o char(10));
|
||||||
select * from t1;
|
select * from t1;
|
||||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||||
|
|
|
@ -613,22 +613,22 @@ FROM t1;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`NULLIF(c_tinyint, 1)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, 1)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_smallint)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_smallint)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_tinyint)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_tinyint)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_int)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_int)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_bigint)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_bigint)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_float)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_float)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_double)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_double)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_decimal103)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_decimal103)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_varchar10)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_varchar10)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_text)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_text)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_blob)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_blob)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_enum)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_enum)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_datetime3)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_datetime3)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_timestamp3)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_timestamp3)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_date)` int(4) DEFAULT NULL,
|
`NULLIF(c_tinyint, c_date)` tinyint(4) DEFAULT NULL,
|
||||||
`NULLIF(c_tinyint, c_time)` int(4) DEFAULT NULL
|
`NULLIF(c_tinyint, c_time)` tinyint(4) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
CREATE TABLE t2 AS SELECT
|
CREATE TABLE t2 AS SELECT
|
||||||
|
@ -652,22 +652,22 @@ FROM t1;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`NULLIF(c_smallint, 1)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, 1)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_smallint)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_smallint)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_tinyint)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_tinyint)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_int)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_int)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_bigint)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_bigint)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_float)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_float)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_double)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_double)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_decimal103)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_decimal103)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_varchar10)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_varchar10)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_text)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_text)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_blob)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_blob)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_enum)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_enum)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_datetime3)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_datetime3)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_timestamp3)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_timestamp3)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_date)` int(6) DEFAULT NULL,
|
`NULLIF(c_smallint, c_date)` smallint(6) DEFAULT NULL,
|
||||||
`NULLIF(c_smallint, c_time)` int(6) DEFAULT NULL
|
`NULLIF(c_smallint, c_time)` smallint(6) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
CREATE TABLE t2 AS SELECT
|
CREATE TABLE t2 AS SELECT
|
||||||
|
@ -769,22 +769,22 @@ FROM t1;
|
||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`NULLIF(c_float, 1)` double DEFAULT NULL,
|
`NULLIF(c_float, 1)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_smallint)` double DEFAULT NULL,
|
`NULLIF(c_float, c_smallint)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_tinyint)` double DEFAULT NULL,
|
`NULLIF(c_float, c_tinyint)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_int)` double DEFAULT NULL,
|
`NULLIF(c_float, c_int)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_bigint)` double DEFAULT NULL,
|
`NULLIF(c_float, c_bigint)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_float)` double DEFAULT NULL,
|
`NULLIF(c_float, c_float)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_double)` double DEFAULT NULL,
|
`NULLIF(c_float, c_double)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_decimal103)` double DEFAULT NULL,
|
`NULLIF(c_float, c_decimal103)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_varchar10)` double DEFAULT NULL,
|
`NULLIF(c_float, c_varchar10)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_text)` double DEFAULT NULL,
|
`NULLIF(c_float, c_text)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_blob)` double DEFAULT NULL,
|
`NULLIF(c_float, c_blob)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_enum)` double DEFAULT NULL,
|
`NULLIF(c_float, c_enum)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_datetime3)` double DEFAULT NULL,
|
`NULLIF(c_float, c_datetime3)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_timestamp3)` double DEFAULT NULL,
|
`NULLIF(c_float, c_timestamp3)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_date)` double DEFAULT NULL,
|
`NULLIF(c_float, c_date)` float DEFAULT NULL,
|
||||||
`NULLIF(c_float, c_time)` double DEFAULT NULL
|
`NULLIF(c_float, c_time)` float DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
CREATE TABLE t2 AS SELECT
|
CREATE TABLE t2 AS SELECT
|
||||||
|
|
|
@ -510,6 +510,29 @@ SHOW CREATE TABLE t2;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-12617 CASE and CASE-alike hybrid functions do not preserve exact data types
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a FLOAT(10,2));
|
||||||
|
CREATE TABLE t2 AS SELECT COALESCE(a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a FLOAT(10,2));
|
||||||
|
CREATE TABLE t2 AS SELECT LEAST(a,a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a TINYINT(1));
|
||||||
|
CREATE TABLE t2 AS SELECT COALESCE(a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a TINYINT(1));
|
||||||
|
CREATE TABLE t2 AS SELECT LEAST(a,a) FROM t1;
|
||||||
|
SHOW CREATE TABLE t2;
|
||||||
|
DROP TABLE t2, t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.3 tests
|
--echo # End of 10.3 tests
|
||||||
|
|
|
@ -119,6 +119,7 @@ select rpad('abcd',7,'ab'),lpad('abcd',7,'ab');
|
||||||
select rpad('abcd',1,'ab'),lpad('abcd',1,'ab');
|
select rpad('abcd',1,'ab'),lpad('abcd',1,'ab');
|
||||||
select rpad('STRING', 20, CONCAT('p','a','d') );
|
select rpad('STRING', 20, CONCAT('p','a','d') );
|
||||||
select lpad('STRING', 20, CONCAT('p','a','d') );
|
select lpad('STRING', 20, CONCAT('p','a','d') );
|
||||||
|
select rpad('abcd',7),lpad('abcd',7);
|
||||||
|
|
||||||
select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD');
|
select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD');
|
||||||
select least(1,2,3) | greatest(16,32,8), least(5,4)*1,greatest(-1.0,1.0)*1,least(3,2,1)*1.0,greatest(1,1.1,1.0),least("10",9),greatest("A","B","0");
|
select least(1,2,3) | greatest(16,32,8), least(5,4)*1,greatest(-1.0,1.0)*1,least(3,2,1)*1.0,greatest(1,1.1,1.0),least("10",9),greatest("A","B","0");
|
||||||
|
@ -373,7 +374,9 @@ select collation(right(_latin2'a',1)), coercibility(right(_latin2'a',1));
|
||||||
select collation(substring(_latin2'a',1,1)), coercibility(substring(_latin2'a',1,1));
|
select collation(substring(_latin2'a',1,1)), coercibility(substring(_latin2'a',1,1));
|
||||||
select collation(concat(_latin2'a',_latin2'b')), coercibility(concat(_latin2'a',_latin2'b'));
|
select collation(concat(_latin2'a',_latin2'b')), coercibility(concat(_latin2'a',_latin2'b'));
|
||||||
select collation(lpad(_latin2'a',4,_latin2'b')), coercibility(lpad(_latin2'a',4,_latin2'b'));
|
select collation(lpad(_latin2'a',4,_latin2'b')), coercibility(lpad(_latin2'a',4,_latin2'b'));
|
||||||
|
select collation(lpad(_latin2'a',4)), coercibility(lpad(_latin2'a',4));
|
||||||
select collation(rpad(_latin2'a',4,_latin2'b')), coercibility(rpad(_latin2'a',4,_latin2'b'));
|
select collation(rpad(_latin2'a',4,_latin2'b')), coercibility(rpad(_latin2'a',4,_latin2'b'));
|
||||||
|
select collation(rpad(_latin2'a',4)), coercibility(rpad(_latin2'a',4));
|
||||||
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
|
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
|
||||||
select collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')), coercibility(make_set(255,_latin2'a',_latin2'b',_latin2'c'));
|
select collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')), coercibility(make_set(255,_latin2'a',_latin2'b',_latin2'c'));
|
||||||
select collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')), coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '));
|
select collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')), coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '));
|
||||||
|
@ -408,6 +411,8 @@ select
|
||||||
concat(_latin2'a',_latin2'b'),
|
concat(_latin2'a',_latin2'b'),
|
||||||
lpad(_latin2'a',4,_latin2'b'),
|
lpad(_latin2'a',4,_latin2'b'),
|
||||||
rpad(_latin2'a',4,_latin2'b'),
|
rpad(_latin2'a',4,_latin2'b'),
|
||||||
|
lpad(_latin2'a',4),
|
||||||
|
rpad(_latin2'a',4),
|
||||||
concat_ws(_latin2'a',_latin2'b'),
|
concat_ws(_latin2'a',_latin2'b'),
|
||||||
make_set(255,_latin2'a',_latin2'b',_latin2'c'),
|
make_set(255,_latin2'a',_latin2'b',_latin2'c'),
|
||||||
export_set(255,_latin2'y',_latin2'n',_latin2' '),
|
export_set(255,_latin2'y',_latin2'n',_latin2' '),
|
||||||
|
@ -485,6 +490,8 @@ explain extended select concat('*',space(5),'*');
|
||||||
explain extended select reverse('abc');
|
explain extended select reverse('abc');
|
||||||
explain extended select rpad('a',4,'1');
|
explain extended select rpad('a',4,'1');
|
||||||
explain extended select lpad('a',4,'1');
|
explain extended select lpad('a',4,'1');
|
||||||
|
explain extended select rpad('a',4);
|
||||||
|
explain extended select lpad('a',4);
|
||||||
explain extended select concat_ws(',','',NULL,'a');
|
explain extended select concat_ws(',','',NULL,'a');
|
||||||
explain extended select make_set(255,_latin2'a', _latin2'b', _latin2'c');
|
explain extended select make_set(255,_latin2'a', _latin2'b', _latin2'c');
|
||||||
explain extended select elt(2,1);
|
explain extended select elt(2,1);
|
||||||
|
@ -1105,6 +1112,21 @@ select rpad('hello', -18446744073709551616, '1');
|
||||||
select rpad('hello', 18446744073709551616, '1');
|
select rpad('hello', 18446744073709551616, '1');
|
||||||
select rpad('hello', -18446744073709551617, '1');
|
select rpad('hello', -18446744073709551617, '1');
|
||||||
select rpad('hello', 18446744073709551617, '1');
|
select rpad('hello', 18446744073709551617, '1');
|
||||||
|
select rpad('hello', -1);
|
||||||
|
select rpad('hello', -4294967295);
|
||||||
|
select rpad('hello', 4294967295);
|
||||||
|
select rpad('hello', -4294967296);
|
||||||
|
select rpad('hello', 4294967296);
|
||||||
|
select rpad('hello', -4294967297);
|
||||||
|
select rpad('hello', 4294967297);
|
||||||
|
select rpad('hello', -18446744073709551615);
|
||||||
|
select rpad('hello', 18446744073709551615);
|
||||||
|
select rpad('hello', -18446744073709551616);
|
||||||
|
select rpad('hello', 18446744073709551616);
|
||||||
|
select rpad('hello', -18446744073709551617);
|
||||||
|
select rpad('hello', 18446744073709551617);
|
||||||
|
select rpad('hello', 0, 'x');
|
||||||
|
select rpad('hello', 0);
|
||||||
|
|
||||||
select lpad('hello', -1, '1');
|
select lpad('hello', -1, '1');
|
||||||
select lpad('hello', -4294967295, '1');
|
select lpad('hello', -4294967295, '1');
|
||||||
|
@ -1119,7 +1141,32 @@ select lpad('hello', -18446744073709551616, '1');
|
||||||
select lpad('hello', 18446744073709551616, '1');
|
select lpad('hello', 18446744073709551616, '1');
|
||||||
select lpad('hello', -18446744073709551617, '1');
|
select lpad('hello', -18446744073709551617, '1');
|
||||||
select lpad('hello', 18446744073709551617, '1');
|
select lpad('hello', 18446744073709551617, '1');
|
||||||
|
select lpad('hello', -1);
|
||||||
|
select lpad('hello', -4294967295);
|
||||||
|
select lpad('hello', 4294967295);
|
||||||
|
select lpad('hello', -4294967296);
|
||||||
|
select lpad('hello', 4294967296);
|
||||||
|
select lpad('hello', -4294967297);
|
||||||
|
select lpad('hello', 4294967297);
|
||||||
|
select lpad('hello', -18446744073709551615);
|
||||||
|
select lpad('hello', 18446744073709551615);
|
||||||
|
select lpad('hello', -18446744073709551616);
|
||||||
|
select lpad('hello', 18446744073709551616);
|
||||||
|
select lpad('hello', -18446744073709551617);
|
||||||
|
select lpad('hello', 18446744073709551617);
|
||||||
|
select lpad('hello', 0, 'x');
|
||||||
|
select lpad('hello', 0);
|
||||||
|
|
||||||
|
--echo Check parameters count rpad / lpad
|
||||||
|
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select rpad('x');
|
||||||
|
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select rpad('x',2,'.','z');
|
||||||
|
|
||||||
|
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select lpad('x');
|
||||||
|
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||||
|
select lpad('x',2,'.','z');
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#17047: CHAR() and IN() can return NULL without signaling NULL
|
# BUG#17047: CHAR() and IN() can return NULL without signaling NULL
|
||||||
|
@ -1141,6 +1188,8 @@ select substring('abc', cast(2 as unsigned int));
|
||||||
select repeat('a', cast(2 as unsigned int));
|
select repeat('a', cast(2 as unsigned int));
|
||||||
select rpad('abc', cast(5 as unsigned integer), 'x');
|
select rpad('abc', cast(5 as unsigned integer), 'x');
|
||||||
select lpad('abc', cast(5 as unsigned integer), 'x');
|
select lpad('abc', cast(5 as unsigned integer), 'x');
|
||||||
|
select rpad('abc', cast(5 as unsigned integer));
|
||||||
|
select lpad('abc', cast(5 as unsigned integer));
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug#15757: Wrong SUBSTRING() result when a tmp table was employed.
|
# Bug#15757: Wrong SUBSTRING() result when a tmp table was employed.
|
||||||
|
@ -1403,6 +1452,8 @@ SELECT RIGHT('1', DAY(FROM_UNIXTIME(-1)));
|
||||||
SELECT REPEAT('1', DAY(FROM_UNIXTIME(-1)));
|
SELECT REPEAT('1', DAY(FROM_UNIXTIME(-1)));
|
||||||
SELECT RPAD('hi', DAY(FROM_UNIXTIME(-1)),'?');
|
SELECT RPAD('hi', DAY(FROM_UNIXTIME(-1)),'?');
|
||||||
SELECT LPAD('hi', DAY(FROM_UNIXTIME(-1)),'?');
|
SELECT LPAD('hi', DAY(FROM_UNIXTIME(-1)),'?');
|
||||||
|
SELECT RPAD('hi', DAY(FROM_UNIXTIME(-1)));
|
||||||
|
SELECT LPAD('hi', DAY(FROM_UNIXTIME(-1)));
|
||||||
|
|
||||||
#
|
#
|
||||||
# MDEV-4289 Assertion `0' fails in make_sortkey with GROUP_CONCAT, MAKE_SET, GROUP BY
|
# MDEV-4289 Assertion `0' fails in make_sortkey with GROUP_CONCAT, MAKE_SET, GROUP BY
|
||||||
|
|
|
@ -14,6 +14,51 @@ drop table if exists t1,t2;
|
||||||
#
|
#
|
||||||
|
|
||||||
select 1, 1.0, -1, "hello", NULL;
|
select 1, 1.0, -1, "hello", NULL;
|
||||||
|
SELECT
|
||||||
|
1 AS c1,
|
||||||
|
11 AS c2,
|
||||||
|
111 AS c3,
|
||||||
|
1111 AS c4,
|
||||||
|
11111 AS c5,
|
||||||
|
111111 AS c6,
|
||||||
|
1111111 AS c7,
|
||||||
|
11111111 AS c8,
|
||||||
|
111111111 AS c9,
|
||||||
|
1111111111 AS c10,
|
||||||
|
11111111111 AS c11,
|
||||||
|
111111111111 AS c12,
|
||||||
|
1111111111111 AS c13,
|
||||||
|
11111111111111 AS c14,
|
||||||
|
111111111111111 AS c15,
|
||||||
|
1111111111111111 AS c16,
|
||||||
|
11111111111111111 AS c17,
|
||||||
|
111111111111111111 AS c18,
|
||||||
|
1111111111111111111 AS c19,
|
||||||
|
11111111111111111111 AS c20,
|
||||||
|
111111111111111111111 AS c21;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
-1 AS c1,
|
||||||
|
-11 AS c2,
|
||||||
|
-111 AS c3,
|
||||||
|
-1111 AS c4,
|
||||||
|
-11111 AS c5,
|
||||||
|
-111111 AS c6,
|
||||||
|
-1111111 AS c7,
|
||||||
|
-11111111 AS c8,
|
||||||
|
-111111111 AS c9,
|
||||||
|
-1111111111 AS c10,
|
||||||
|
-11111111111 AS c11,
|
||||||
|
-111111111111 AS c12,
|
||||||
|
-1111111111111 AS c13,
|
||||||
|
-11111111111111 AS c14,
|
||||||
|
-111111111111111 AS c15,
|
||||||
|
-1111111111111111 AS c16,
|
||||||
|
-11111111111111111 AS c17,
|
||||||
|
-111111111111111111 AS c18,
|
||||||
|
-1111111111111111111 AS c19,
|
||||||
|
-11111111111111111111 AS c20,
|
||||||
|
-111111111111111111111 AS c21;
|
||||||
|
|
||||||
create table t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float(3,2), g double(4,3), h decimal(5,4), i year, j date, k timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, l datetime, m enum('a','b'), n set('a','b'), o char(10));
|
create table t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float(3,2), g double(4,3), h decimal(5,4), i year, j date, k timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, l datetime, m enum('a','b'), n set('a','b'), o char(10));
|
||||||
select * from t1;
|
select * from t1;
|
||||||
|
|
132
sql/item.cc
132
sql/item.cc
|
@ -6854,127 +6854,11 @@ bool Item_time_literal::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date)
|
||||||
Pack data in buffer for sending.
|
Pack data in buffer for sending.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool Item_null::send(Protocol *protocol, String *packet)
|
bool Item_null::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
return protocol->store_null();
|
return protocol->store_null();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
This is only called from items that is not of type item_field.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool Item::send(Protocol *protocol, String *buffer)
|
|
||||||
{
|
|
||||||
bool UNINIT_VAR(result); // Will be set if null_value == 0
|
|
||||||
enum_field_types f_type;
|
|
||||||
|
|
||||||
switch ((f_type=field_type())) {
|
|
||||||
default:
|
|
||||||
case MYSQL_TYPE_NULL:
|
|
||||||
case MYSQL_TYPE_DECIMAL:
|
|
||||||
case MYSQL_TYPE_ENUM:
|
|
||||||
case MYSQL_TYPE_SET:
|
|
||||||
case MYSQL_TYPE_TINY_BLOB:
|
|
||||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
|
||||||
case MYSQL_TYPE_LONG_BLOB:
|
|
||||||
case MYSQL_TYPE_BLOB:
|
|
||||||
case MYSQL_TYPE_GEOMETRY:
|
|
||||||
case MYSQL_TYPE_STRING:
|
|
||||||
case MYSQL_TYPE_VAR_STRING:
|
|
||||||
case MYSQL_TYPE_VARCHAR:
|
|
||||||
case MYSQL_TYPE_BIT:
|
|
||||||
case MYSQL_TYPE_NEWDECIMAL:
|
|
||||||
{
|
|
||||||
String *res;
|
|
||||||
if ((res=val_str(buffer)))
|
|
||||||
{
|
|
||||||
DBUG_ASSERT(!null_value);
|
|
||||||
result= protocol->store(res->ptr(),res->length(),res->charset());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBUG_ASSERT(null_value);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_TINY:
|
|
||||||
{
|
|
||||||
longlong nr;
|
|
||||||
nr= val_int();
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store_tiny(nr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_SHORT:
|
|
||||||
case MYSQL_TYPE_YEAR:
|
|
||||||
{
|
|
||||||
longlong nr;
|
|
||||||
nr= val_int();
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store_short(nr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_INT24:
|
|
||||||
case MYSQL_TYPE_LONG:
|
|
||||||
{
|
|
||||||
longlong nr;
|
|
||||||
nr= val_int();
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store_long(nr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_LONGLONG:
|
|
||||||
{
|
|
||||||
longlong nr;
|
|
||||||
nr= val_int();
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store_longlong(nr, unsigned_flag);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_FLOAT:
|
|
||||||
{
|
|
||||||
float nr;
|
|
||||||
nr= (float) val_real();
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store(nr, decimals, buffer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_DOUBLE:
|
|
||||||
{
|
|
||||||
double nr= val_real();
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store(nr, decimals, buffer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_DATETIME:
|
|
||||||
case MYSQL_TYPE_DATE:
|
|
||||||
case MYSQL_TYPE_TIMESTAMP:
|
|
||||||
{
|
|
||||||
MYSQL_TIME tm;
|
|
||||||
get_date(&tm, sql_mode_for_dates(current_thd));
|
|
||||||
if (!null_value)
|
|
||||||
{
|
|
||||||
if (f_type == MYSQL_TYPE_DATE)
|
|
||||||
return protocol->store_date(&tm);
|
|
||||||
else
|
|
||||||
result= protocol->store(&tm, decimals);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MYSQL_TYPE_TIME:
|
|
||||||
{
|
|
||||||
MYSQL_TIME tm;
|
|
||||||
get_time(&tm);
|
|
||||||
if (!null_value)
|
|
||||||
result= protocol->store_time(&tm, decimals);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (null_value)
|
|
||||||
result= protocol->store_null();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check if an item is a constant one and can be cached.
|
Check if an item is a constant one and can be cached.
|
||||||
|
@ -7046,7 +6930,7 @@ bool Item::find_item_processor(void *arg)
|
||||||
return (this == ((Item *) arg));
|
return (this == ((Item *) arg));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item_field::send(Protocol *protocol, String *buffer)
|
bool Item_field::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
return protocol->store(result_field);
|
return protocol->store(result_field);
|
||||||
}
|
}
|
||||||
|
@ -7776,11 +7660,11 @@ void Item_ref::print(String *str, enum_query_type query_type)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Item_ref::send(Protocol *prot, String *tmp)
|
bool Item_ref::send(Protocol *prot, st_value *buffer)
|
||||||
{
|
{
|
||||||
if (result_field)
|
if (result_field)
|
||||||
return prot->store(result_field);
|
return prot->store(result_field);
|
||||||
return (*ref)->send(prot, tmp);
|
return (*ref)->send(prot, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8135,7 +8019,7 @@ bool Item_cache_wrapper::fix_fields(THD *thd __attribute__((unused)),
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item_cache_wrapper::send(Protocol *protocol, String *buffer)
|
bool Item_cache_wrapper::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
if (result_field)
|
if (result_field)
|
||||||
return protocol->store(result_field);
|
return protocol->store(result_field);
|
||||||
|
@ -8466,7 +8350,7 @@ Item* Item_cache_wrapper::get_tmp_table_item(THD *thd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Item_direct_view_ref::send(Protocol *protocol, String *buffer)
|
bool Item_direct_view_ref::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
if (check_null_ref())
|
if (check_null_ref())
|
||||||
return protocol->store_null();
|
return protocol->store_null();
|
||||||
|
@ -8843,7 +8727,7 @@ bool Item_default_value::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate)
|
||||||
return Item_field::get_date(ltime, fuzzydate);
|
return Item_field::get_date(ltime, fuzzydate);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item_default_value::send(Protocol *protocol, String *buffer)
|
bool Item_default_value::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
calculate();
|
calculate();
|
||||||
return Item_field::send(protocol, buffer);
|
return Item_field::send(protocol, buffer);
|
||||||
|
@ -8950,7 +8834,7 @@ bool Item_ignore_value::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item_ignore_value::send(Protocol *protocol, String *buffer)
|
bool Item_ignore_value::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(0); // never should be called
|
DBUG_ASSERT(0); // never should be called
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
52
sql/item.h
52
sql/item.h
|
@ -55,6 +55,23 @@ struct st_value
|
||||||
|
|
||||||
C_MODE_END
|
C_MODE_END
|
||||||
|
|
||||||
|
|
||||||
|
template<size_t buffer_size>
|
||||||
|
class ValueBuffer: public st_value
|
||||||
|
{
|
||||||
|
char buffer[buffer_size];
|
||||||
|
void reset_buffer()
|
||||||
|
{
|
||||||
|
m_string.set(buffer, buffer_size, &my_charset_bin);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
ValueBuffer()
|
||||||
|
{
|
||||||
|
reset_buffer();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const char *dbug_print_item(Item *item);
|
const char *dbug_print_item(Item *item);
|
||||||
|
|
||||||
class Protocol;
|
class Protocol;
|
||||||
|
@ -693,7 +710,10 @@ public:
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
virtual int save_safe_in_field(Field *field)
|
virtual int save_safe_in_field(Field *field)
|
||||||
{ return save_in_field(field, 1); }
|
{ return save_in_field(field, 1); }
|
||||||
virtual bool send(Protocol *protocol, String *str);
|
virtual bool send(Protocol *protocol, st_value *buffer)
|
||||||
|
{
|
||||||
|
return type_handler()->Item_send(this, protocol, buffer);
|
||||||
|
}
|
||||||
virtual bool eq(const Item *, bool binary_cmp) const;
|
virtual bool eq(const Item *, bool binary_cmp) const;
|
||||||
virtual enum_field_types field_type() const= 0;
|
virtual enum_field_types field_type() const= 0;
|
||||||
virtual const Type_handler *type_handler() const
|
virtual const Type_handler *type_handler() const
|
||||||
|
@ -2090,7 +2110,7 @@ public:
|
||||||
inline bool const_item() const;
|
inline bool const_item() const;
|
||||||
|
|
||||||
inline int save_in_field(Field *field, bool no_conversions);
|
inline int save_in_field(Field *field, bool no_conversions);
|
||||||
inline bool send(Protocol *protocol, String *str);
|
inline bool send(Protocol *protocol, st_value *buffer);
|
||||||
bool check_vcol_func_processor(void *arg)
|
bool check_vcol_func_processor(void *arg)
|
||||||
{
|
{
|
||||||
return mark_unsupported_function(m_name.str, arg, VCOL_IMPOSSIBLE);
|
return mark_unsupported_function(m_name.str, arg, VCOL_IMPOSSIBLE);
|
||||||
|
@ -2111,9 +2131,9 @@ inline int Item_sp_variable::save_in_field(Field *field, bool no_conversions)
|
||||||
return this_item()->save_in_field(field, no_conversions);
|
return this_item()->save_in_field(field, no_conversions);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool Item_sp_variable::send(Protocol *protocol, String *str)
|
inline bool Item_sp_variable::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
return this_item()->send(protocol, str);
|
return this_item()->send(protocol, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2399,9 +2419,9 @@ public:
|
||||||
return value_item->save_in_field(field, no_conversions);
|
return value_item->save_in_field(field, no_conversions);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool send(Protocol *protocol, String *str)
|
bool send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
return value_item->send(protocol, str);
|
return value_item->send(protocol, buffer);
|
||||||
}
|
}
|
||||||
bool check_vcol_func_processor(void *arg)
|
bool check_vcol_func_processor(void *arg)
|
||||||
{
|
{
|
||||||
|
@ -2533,7 +2553,6 @@ public:
|
||||||
{
|
{
|
||||||
Type_std_attributes::set(par_field);
|
Type_std_attributes::set(par_field);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Type type() const { return FIELD_ITEM; }
|
enum Type type() const { return FIELD_ITEM; }
|
||||||
double val_real() { return field->val_real(); }
|
double val_real() { return field->val_real(); }
|
||||||
longlong val_int() { return field->val_int(); }
|
longlong val_int() { return field->val_int(); }
|
||||||
|
@ -2592,7 +2611,7 @@ public:
|
||||||
my_decimal *val_decimal_result(my_decimal *);
|
my_decimal *val_decimal_result(my_decimal *);
|
||||||
bool val_bool_result();
|
bool val_bool_result();
|
||||||
bool is_null_result();
|
bool is_null_result();
|
||||||
bool send(Protocol *protocol, String *str_arg);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
void reset_field(Field *f);
|
void reset_field(Field *f);
|
||||||
bool fix_fields(THD *, Item **);
|
bool fix_fields(THD *, Item **);
|
||||||
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
|
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
|
||||||
|
@ -2837,7 +2856,7 @@ public:
|
||||||
my_decimal *val_decimal(my_decimal *);
|
my_decimal *val_decimal(my_decimal *);
|
||||||
int save_in_field(Field *field, bool no_conversions);
|
int save_in_field(Field *field, bool no_conversions);
|
||||||
int save_safe_in_field(Field *field);
|
int save_safe_in_field(Field *field);
|
||||||
bool send(Protocol *protocol, String *str);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
enum Item_result result_type () const { return STRING_RESULT; }
|
enum Item_result result_type () const { return STRING_RESULT; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_NULL; }
|
enum_field_types field_type() const { return MYSQL_TYPE_NULL; }
|
||||||
bool basic_const_item() const { return 1; }
|
bool basic_const_item() const { return 1; }
|
||||||
|
@ -3159,7 +3178,10 @@ public:
|
||||||
Item_int(THD *thd, const char *str_arg, uint length=64);
|
Item_int(THD *thd, const char *str_arg, uint length=64);
|
||||||
enum Type type() const { return INT_ITEM; }
|
enum Type type() const { return INT_ITEM; }
|
||||||
enum Item_result result_type () const { return INT_RESULT; }
|
enum Item_result result_type () const { return INT_RESULT; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
|
enum_field_types field_type() const
|
||||||
|
{
|
||||||
|
return Item_int::type_handler()->field_type();
|
||||||
|
}
|
||||||
const Type_handler *type_handler() const
|
const Type_handler *type_handler() const
|
||||||
{
|
{
|
||||||
// The same condition is repeated in Item::create_tmp_field()
|
// The same condition is repeated in Item::create_tmp_field()
|
||||||
|
@ -4234,7 +4256,7 @@ public:
|
||||||
my_decimal *val_decimal_result(my_decimal *);
|
my_decimal *val_decimal_result(my_decimal *);
|
||||||
bool val_bool_result();
|
bool val_bool_result();
|
||||||
bool is_null_result();
|
bool is_null_result();
|
||||||
bool send(Protocol *prot, String *tmp);
|
bool send(Protocol *prot, st_value *buffer);
|
||||||
void make_field(THD *thd, Send_field *field);
|
void make_field(THD *thd, Send_field *field);
|
||||||
bool fix_fields(THD *, Item **);
|
bool fix_fields(THD *, Item **);
|
||||||
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
|
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
|
||||||
|
@ -4511,7 +4533,7 @@ public:
|
||||||
bool val_bool();
|
bool val_bool();
|
||||||
bool is_null();
|
bool is_null();
|
||||||
bool get_date(MYSQL_TIME *ltime, ulonglong fuzzydate);
|
bool get_date(MYSQL_TIME *ltime, ulonglong fuzzydate);
|
||||||
bool send(Protocol *protocol, String *buffer);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
void save_org_in_field(Field *field,
|
void save_org_in_field(Field *field,
|
||||||
fast_field_copier data __attribute__ ((__unused__)))
|
fast_field_copier data __attribute__ ((__unused__)))
|
||||||
{
|
{
|
||||||
|
@ -4725,7 +4747,7 @@ public:
|
||||||
}
|
}
|
||||||
return Item_direct_ref::get_date(ltime, fuzzydate);
|
return Item_direct_ref::get_date(ltime, fuzzydate);
|
||||||
}
|
}
|
||||||
bool send(Protocol *protocol, String *buffer);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
void save_org_in_field(Field *field,
|
void save_org_in_field(Field *field,
|
||||||
fast_field_copier data __attribute__ ((__unused__)))
|
fast_field_copier data __attribute__ ((__unused__)))
|
||||||
{
|
{
|
||||||
|
@ -5239,7 +5261,7 @@ public:
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
my_decimal *val_decimal(my_decimal *decimal_value);
|
my_decimal *val_decimal(my_decimal *decimal_value);
|
||||||
bool get_date(MYSQL_TIME *ltime,ulonglong fuzzydate);
|
bool get_date(MYSQL_TIME *ltime,ulonglong fuzzydate);
|
||||||
bool send(Protocol *protocol, String *buffer);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
int save_in_field(Field *field_arg, bool no_conversions);
|
int save_in_field(Field *field_arg, bool no_conversions);
|
||||||
bool save_in_param(THD *thd, Item_param *param)
|
bool save_in_param(THD *thd, Item_param *param)
|
||||||
{
|
{
|
||||||
|
@ -5291,7 +5313,7 @@ public:
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
my_decimal *val_decimal(my_decimal *decimal_value);
|
my_decimal *val_decimal(my_decimal *decimal_value);
|
||||||
bool get_date(MYSQL_TIME *ltime,ulonglong fuzzydate);
|
bool get_date(MYSQL_TIME *ltime,ulonglong fuzzydate);
|
||||||
bool send(Protocol *protocol, String *buffer);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2786,7 +2786,7 @@ Item_func_nullif::is_null()
|
||||||
|
|
||||||
Item_func_case::Item_func_case(THD *thd, List<Item> &list,
|
Item_func_case::Item_func_case(THD *thd, List<Item> &list,
|
||||||
Item *first_expr_arg, Item *else_expr_arg):
|
Item *first_expr_arg, Item *else_expr_arg):
|
||||||
Item_func_hybrid_field_type(thd),
|
Item_func_case_expression(thd),
|
||||||
Predicant_to_list_comparator(thd, list.elements/*QQ*/),
|
Predicant_to_list_comparator(thd, list.elements/*QQ*/),
|
||||||
first_expr_num(-1), else_expr_num(-1),
|
first_expr_num(-1), else_expr_num(-1),
|
||||||
left_cmp_type(INT_RESULT), m_found_types(0)
|
left_cmp_type(INT_RESULT), m_found_types(0)
|
||||||
|
|
|
@ -965,13 +965,13 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_coalesce :public Item_func_hybrid_field_type
|
class Item_func_coalesce :public Item_func_case_expression
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Item_func_coalesce(THD *thd, Item *a, Item *b):
|
Item_func_coalesce(THD *thd, Item *a, Item *b):
|
||||||
Item_func_hybrid_field_type(thd, a, b) {}
|
Item_func_case_expression(thd, a, b) {}
|
||||||
Item_func_coalesce(THD *thd, List<Item> &list):
|
Item_func_coalesce(THD *thd, List<Item> &list):
|
||||||
Item_func_hybrid_field_type(thd, list) {}
|
Item_func_case_expression(thd, list) {}
|
||||||
double real_op();
|
double real_op();
|
||||||
longlong int_op();
|
longlong int_op();
|
||||||
String *str_op(String *);
|
String *str_op(String *);
|
||||||
|
@ -995,7 +995,7 @@ public:
|
||||||
IF(switch, arg1, arg2)
|
IF(switch, arg1, arg2)
|
||||||
NVL2(switch, arg1, arg2)
|
NVL2(switch, arg1, arg2)
|
||||||
*/
|
*/
|
||||||
class Item_func_case_abbreviation2 :public Item_func_hybrid_field_type
|
class Item_func_case_abbreviation2 :public Item_func_case_expression
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
void fix_length_and_dec2(Item **items)
|
void fix_length_and_dec2(Item **items)
|
||||||
|
@ -1034,9 +1034,9 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Item_func_case_abbreviation2(THD *thd, Item *a, Item *b):
|
Item_func_case_abbreviation2(THD *thd, Item *a, Item *b):
|
||||||
Item_func_hybrid_field_type(thd, a, b) { }
|
Item_func_case_expression(thd, a, b) { }
|
||||||
Item_func_case_abbreviation2(THD *thd, Item *a, Item *b, Item *c):
|
Item_func_case_abbreviation2(THD *thd, Item *a, Item *b, Item *c):
|
||||||
Item_func_hybrid_field_type(thd, a, b, c) { }
|
Item_func_case_expression(thd, a, b, c) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1056,8 +1056,6 @@ public:
|
||||||
maybe_null= args[1]->maybe_null;
|
maybe_null= args[1]->maybe_null;
|
||||||
}
|
}
|
||||||
const char *func_name() const { return "ifnull"; }
|
const char *func_name() const { return "ifnull"; }
|
||||||
Field *create_field_for_create_select(TABLE *table)
|
|
||||||
{ return tmp_table_field_from_field_type(table); }
|
|
||||||
|
|
||||||
table_map not_null_tables() const { return 0; }
|
table_map not_null_tables() const { return 0; }
|
||||||
uint decimal_precision() const
|
uint decimal_precision() const
|
||||||
|
@ -1161,7 +1159,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_nullif :public Item_func_hybrid_field_type
|
class Item_func_nullif :public Item_func_case_expression
|
||||||
{
|
{
|
||||||
Arg_comparator cmp;
|
Arg_comparator cmp;
|
||||||
/*
|
/*
|
||||||
|
@ -1199,7 +1197,7 @@ public:
|
||||||
See also Item_func_nullif::fix_length_and_dec().
|
See also Item_func_nullif::fix_length_and_dec().
|
||||||
*/
|
*/
|
||||||
Item_func_nullif(THD *thd, Item *a, Item *b):
|
Item_func_nullif(THD *thd, Item *a, Item *b):
|
||||||
Item_func_hybrid_field_type(thd, a, b, a),
|
Item_func_case_expression(thd, a, b, a),
|
||||||
m_cache(NULL),
|
m_cache(NULL),
|
||||||
m_arg0(NULL)
|
m_arg0(NULL)
|
||||||
{ arg_count--; }
|
{ arg_count--; }
|
||||||
|
@ -2031,7 +2029,7 @@ public:
|
||||||
function and only comparators for there result types are used.
|
function and only comparators for there result types are used.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Item_func_case :public Item_func_hybrid_field_type,
|
class Item_func_case :public Item_func_case_expression,
|
||||||
public Predicant_to_list_comparator
|
public Predicant_to_list_comparator
|
||||||
{
|
{
|
||||||
int first_expr_num, else_expr_num;
|
int first_expr_num, else_expr_num;
|
||||||
|
|
|
@ -2260,10 +2260,11 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_lpad : public Create_func_arg3
|
class Create_func_lpad : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3);
|
virtual Item *create_native(THD *thd, LEX_CSTRING *name,
|
||||||
|
List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_lpad s_singleton;
|
static Create_func_lpad s_singleton;
|
||||||
|
|
||||||
|
@ -2686,10 +2687,11 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_rpad : public Create_func_arg3
|
class Create_func_rpad : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3);
|
virtual Item *create_native(THD *thd, LEX_CSTRING *name,
|
||||||
|
List<Item> *item_list);
|
||||||
|
|
||||||
static Create_func_rpad s_singleton;
|
static Create_func_rpad s_singleton;
|
||||||
|
|
||||||
|
@ -5791,9 +5793,34 @@ Create_func_log2::create_1_arg(THD *thd, Item *arg1)
|
||||||
Create_func_lpad Create_func_lpad::s_singleton;
|
Create_func_lpad Create_func_lpad::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_lpad::create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3)
|
Create_func_lpad::create_native(THD *thd, LEX_CSTRING *name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
return new (thd->mem_root) Item_func_lpad(thd, arg1, arg2, arg3);
|
Item *func= NULL;
|
||||||
|
int arg_count= item_list ? item_list->elements : 0;
|
||||||
|
|
||||||
|
switch (arg_count) {
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
Item *param_1= item_list->pop();
|
||||||
|
Item *param_2= item_list->pop();
|
||||||
|
func= new (thd->mem_root) Item_func_lpad(thd, param_1, param_2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
Item *param_1= item_list->pop();
|
||||||
|
Item *param_2= item_list->pop();
|
||||||
|
Item *param_3= item_list->pop();
|
||||||
|
func= new (thd->mem_root) Item_func_lpad(thd, param_1, param_2, param_3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6253,9 +6280,34 @@ Create_func_round::create_native(THD *thd, LEX_CSTRING *name,
|
||||||
Create_func_rpad Create_func_rpad::s_singleton;
|
Create_func_rpad Create_func_rpad::s_singleton;
|
||||||
|
|
||||||
Item*
|
Item*
|
||||||
Create_func_rpad::create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3)
|
Create_func_rpad::create_native(THD *thd, LEX_CSTRING *name,
|
||||||
|
List<Item> *item_list)
|
||||||
{
|
{
|
||||||
return new (thd->mem_root) Item_func_rpad(thd, arg1, arg2, arg3);
|
Item *func= NULL;
|
||||||
|
int arg_count= item_list ? item_list->elements : 0;
|
||||||
|
|
||||||
|
switch (arg_count) {
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
Item *param_1= item_list->pop();
|
||||||
|
Item *param_2= item_list->pop();
|
||||||
|
func= new (thd->mem_root) Item_func_rpad(thd, param_1, param_2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
Item *param_1= item_list->pop();
|
||||||
|
Item *param_2= item_list->pop();
|
||||||
|
Item *param_3= item_list->pop();
|
||||||
|
func= new (thd->mem_root) Item_func_rpad(thd, param_1, param_2, param_3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4981,7 +4981,7 @@ void Item_func_set_user_var::print_as_stmt(String *str,
|
||||||
args[0]->print_parenthesised(str, query_type, precedence());
|
args[0]->print_parenthesised(str, query_type, precedence());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item_func_set_user_var::send(Protocol *protocol, String *str_arg)
|
bool Item_func_set_user_var::send(Protocol *protocol, st_value *buffer)
|
||||||
{
|
{
|
||||||
if (result_field)
|
if (result_field)
|
||||||
{
|
{
|
||||||
|
@ -4989,7 +4989,7 @@ bool Item_func_set_user_var::send(Protocol *protocol, String *str_arg)
|
||||||
update();
|
update();
|
||||||
return protocol->store(result_field);
|
return protocol->store(result_field);
|
||||||
}
|
}
|
||||||
return Item::send(protocol, str_arg);
|
return Item::send(protocol, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item_func_set_user_var::make_field(THD *thd, Send_field *tmp_field)
|
void Item_func_set_user_var::make_field(THD *thd, Send_field *tmp_field)
|
||||||
|
|
|
@ -599,6 +599,38 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
This class resembles SQL standard CASE-alike expressions:
|
||||||
|
CASE and its abbreviations COALESCE, NULLIF, IFNULL, IF.
|
||||||
|
|
||||||
|
<case expression> ::= <case abbreviation>
|
||||||
|
| <case specification>
|
||||||
|
*/
|
||||||
|
class Item_func_case_expression: public Item_func_hybrid_field_type
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Item_func_case_expression(THD *thd)
|
||||||
|
:Item_func_hybrid_field_type(thd)
|
||||||
|
{ }
|
||||||
|
Item_func_case_expression(THD *thd, Item *a)
|
||||||
|
:Item_func_hybrid_field_type(thd, a)
|
||||||
|
{ }
|
||||||
|
Item_func_case_expression(THD *thd, Item *a, Item *b)
|
||||||
|
:Item_func_hybrid_field_type(thd, a, b)
|
||||||
|
{ }
|
||||||
|
Item_func_case_expression(THD *thd, Item *a, Item *b, Item *c)
|
||||||
|
:Item_func_hybrid_field_type(thd, a, b, c)
|
||||||
|
{ }
|
||||||
|
Item_func_case_expression(THD *thd, List<Item> &list):
|
||||||
|
Item_func_hybrid_field_type(thd, list)
|
||||||
|
{ }
|
||||||
|
Field *create_tmp_field(bool group, TABLE *table)
|
||||||
|
{ return tmp_table_field_from_field_type(table); }
|
||||||
|
Field *create_field_for_create_select(TABLE *table)
|
||||||
|
{ return tmp_table_field_from_field_type(table); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_numhybrid: public Item_func_hybrid_field_type
|
class Item_func_numhybrid: public Item_func_hybrid_field_type
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -1404,6 +1436,10 @@ public:
|
||||||
Item_func_min_max(THD *thd, List<Item> &list, int cmp_sign_arg):
|
Item_func_min_max(THD *thd, List<Item> &list, int cmp_sign_arg):
|
||||||
Item_hybrid_func(thd, list), cmp_sign(cmp_sign_arg)
|
Item_hybrid_func(thd, list), cmp_sign(cmp_sign_arg)
|
||||||
{}
|
{}
|
||||||
|
Field *create_tmp_field(bool group, TABLE *table)
|
||||||
|
{ return tmp_table_field_from_field_type(table); }
|
||||||
|
Field *create_field_for_create_select(TABLE *table)
|
||||||
|
{ return tmp_table_field_from_field_type(table); }
|
||||||
String *val_str_native(String *str);
|
String *val_str_native(String *str);
|
||||||
double val_real_native();
|
double val_real_native();
|
||||||
longlong val_int_native();
|
longlong val_int_native();
|
||||||
|
@ -2212,7 +2248,7 @@ public:
|
||||||
bool is_null_result();
|
bool is_null_result();
|
||||||
bool update_hash(void *ptr, uint length, enum Item_result type,
|
bool update_hash(void *ptr, uint length, enum Item_result type,
|
||||||
CHARSET_INFO *cs, bool unsigned_arg);
|
CHARSET_INFO *cs, bool unsigned_arg);
|
||||||
bool send(Protocol *protocol, String *str_arg);
|
bool send(Protocol *protocol, st_value *buffer);
|
||||||
void make_field(THD *thd, Send_field *tmp_field);
|
void make_field(THD *thd, Send_field *tmp_field);
|
||||||
bool check(bool use_result_field);
|
bool check(bool use_result_field);
|
||||||
void save_item_result(Item *item);
|
void save_item_result(Item *item);
|
||||||
|
|
|
@ -3152,11 +3152,22 @@ err:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_func_rpad::fix_length_and_dec()
|
void Item_func_pad::fix_length_and_dec()
|
||||||
{
|
{
|
||||||
// Handle character set for args[0] and args[2].
|
if (arg_count == 3)
|
||||||
if (agg_arg_charsets_for_string_result(collation, &args[0], 2, 2))
|
{
|
||||||
return;
|
// Handle character set for args[0] and args[2].
|
||||||
|
if (agg_arg_charsets_for_string_result(collation, &args[0], 2, 2))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (agg_arg_charsets_for_string_result(collation, &args[0], 1, 1))
|
||||||
|
return;
|
||||||
|
pad_str.set_charset(collation.collation);
|
||||||
|
pad_str.append(" ", 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (args[1]->const_item())
|
if (args[1]->const_item())
|
||||||
{
|
{
|
||||||
ulonglong char_length= (ulonglong) args[1]->val_int();
|
ulonglong char_length= (ulonglong) args[1]->val_int();
|
||||||
|
@ -3187,11 +3198,15 @@ String *Item_func_rpad::val_str(String *str)
|
||||||
longlong count= args[1]->val_int();
|
longlong count= args[1]->val_int();
|
||||||
longlong byte_count;
|
longlong byte_count;
|
||||||
String *res= args[0]->val_str(str);
|
String *res= args[0]->val_str(str);
|
||||||
String *rpad= args[2]->val_str(&rpad_str);
|
String *rpad= arg_count == 2 ? &pad_str : args[2]->val_str(&pad_str);
|
||||||
|
|
||||||
if (!res || args[1]->null_value || !rpad ||
|
if (!res || args[1]->null_value || !rpad ||
|
||||||
((count < 0) && !args[1]->unsigned_flag))
|
((count < 0) && !args[1]->unsigned_flag))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
if (count == 0)
|
||||||
|
return make_empty_result();
|
||||||
|
|
||||||
null_value=0;
|
null_value=0;
|
||||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||||
/* Set here so that rest of code sees out-of-bound value as such. */
|
/* Set here so that rest of code sees out-of-bound value as such. */
|
||||||
|
@ -3216,7 +3231,6 @@ String *Item_func_rpad::val_str(String *str)
|
||||||
res->length(res->charpos((int) count)); // Shorten result if longer
|
res->length(res->charpos((int) count)); // Shorten result if longer
|
||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
pad_char_length= rpad->numchars();
|
|
||||||
|
|
||||||
byte_count= count * collation.collation->mbmaxlen;
|
byte_count= count * collation.collation->mbmaxlen;
|
||||||
{
|
{
|
||||||
|
@ -3230,8 +3244,15 @@ String *Item_func_rpad::val_str(String *str)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (args[2]->null_value || !pad_char_length)
|
|
||||||
goto err;
|
if (arg_count == 3)
|
||||||
|
{
|
||||||
|
if (args[2]->null_value || !(pad_char_length= rpad->numchars()))
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pad_char_length= 1; // Implicit space
|
||||||
|
|
||||||
res_byte_length= res->length(); /* Must be done before alloc_buffer */
|
res_byte_length= res->length(); /* Must be done before alloc_buffer */
|
||||||
if (!(res= alloc_buffer(res,str,&tmp_value, (ulong) byte_count)))
|
if (!(res= alloc_buffer(res,str,&tmp_value, (ulong) byte_count)))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -3260,32 +3281,6 @@ String *Item_func_rpad::val_str(String *str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_func_lpad::fix_length_and_dec()
|
|
||||||
{
|
|
||||||
// Handle character set for args[0] and args[2].
|
|
||||||
if (agg_arg_charsets_for_string_result(collation, &args[0], 2, 2))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (args[1]->const_item())
|
|
||||||
{
|
|
||||||
ulonglong char_length= (ulonglong) args[1]->val_int();
|
|
||||||
DBUG_ASSERT(collation.collation->mbmaxlen > 0);
|
|
||||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
|
||||||
/* Set here so that rest of code sees out-of-bound value as such. */
|
|
||||||
if (args[1]->null_value)
|
|
||||||
char_length= 0;
|
|
||||||
else if (char_length > INT_MAX32)
|
|
||||||
char_length= INT_MAX32;
|
|
||||||
fix_char_length_ulonglong(char_length);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
max_length= MAX_BLOB_WIDTH;
|
|
||||||
maybe_null= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
String *Item_func_lpad::val_str(String *str)
|
String *Item_func_lpad::val_str(String *str)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(fixed == 1);
|
DBUG_ASSERT(fixed == 1);
|
||||||
|
@ -3294,11 +3289,15 @@ String *Item_func_lpad::val_str(String *str)
|
||||||
longlong count= args[1]->val_int();
|
longlong count= args[1]->val_int();
|
||||||
longlong byte_count;
|
longlong byte_count;
|
||||||
String *res= args[0]->val_str(&tmp_value);
|
String *res= args[0]->val_str(&tmp_value);
|
||||||
String *pad= args[2]->val_str(&lpad_str);
|
String *pad= arg_count == 2 ? &pad_str : args[2]->val_str(&pad_str);
|
||||||
|
|
||||||
if (!res || args[1]->null_value || !pad ||
|
if (!res || args[1]->null_value || !pad ||
|
||||||
((count < 0) && !args[1]->unsigned_flag))
|
((count < 0) && !args[1]->unsigned_flag))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
if (count == 0)
|
||||||
|
return make_empty_result();
|
||||||
|
|
||||||
null_value=0;
|
null_value=0;
|
||||||
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
/* Assumes that the maximum length of a String is < INT_MAX32. */
|
||||||
/* Set here so that rest of code sees out-of-bound value as such. */
|
/* Set here so that rest of code sees out-of-bound value as such. */
|
||||||
|
@ -3327,7 +3326,6 @@ String *Item_func_lpad::val_str(String *str)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
pad_char_length= pad->numchars();
|
|
||||||
byte_count= count * collation.collation->mbmaxlen;
|
byte_count= count * collation.collation->mbmaxlen;
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -3342,9 +3340,16 @@ String *Item_func_lpad::val_str(String *str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args[2]->null_value || !pad_char_length ||
|
if (str->alloc((uint32) byte_count))
|
||||||
str->alloc((uint32) byte_count))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
if (arg_count == 3)
|
||||||
|
{
|
||||||
|
if (args[2]->null_value || !(pad_char_length= pad->numchars()))
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pad_char_length= 1; // Implicit space
|
||||||
|
|
||||||
str->length(0);
|
str->length(0);
|
||||||
str->set_charset(collation.collation);
|
str->set_charset(collation.collation);
|
||||||
|
|
|
@ -1003,28 +1003,41 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_rpad :public Item_str_func
|
class Item_func_pad: public Item_str_func
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
String tmp_value, pad_str;
|
||||||
|
public:
|
||||||
|
Item_func_pad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
||||||
|
Item_str_func(thd, arg1, arg2, arg3) {}
|
||||||
|
Item_func_pad(THD *thd, Item *arg1, Item *arg2):
|
||||||
|
Item_str_func(thd, arg1, arg2) {}
|
||||||
|
void fix_length_and_dec();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Item_func_rpad :public Item_func_pad
|
||||||
{
|
{
|
||||||
String tmp_value, rpad_str;
|
|
||||||
public:
|
public:
|
||||||
Item_func_rpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
Item_func_rpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
||||||
Item_str_func(thd, arg1, arg2, arg3) {}
|
Item_func_pad(thd, arg1, arg2, arg3) {}
|
||||||
|
Item_func_rpad(THD *thd, Item *arg1, Item *arg2):
|
||||||
|
Item_func_pad(thd, arg1, arg2) {}
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec();
|
|
||||||
const char *func_name() const { return "rpad"; }
|
const char *func_name() const { return "rpad"; }
|
||||||
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
||||||
{ return get_item_copy<Item_func_rpad>(thd, mem_root, this); }
|
{ return get_item_copy<Item_func_rpad>(thd, mem_root, this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_lpad :public Item_str_func
|
class Item_func_lpad :public Item_func_pad
|
||||||
{
|
{
|
||||||
String tmp_value, lpad_str;
|
|
||||||
public:
|
public:
|
||||||
Item_func_lpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
Item_func_lpad(THD *thd, Item *arg1, Item *arg2, Item *arg3):
|
||||||
Item_str_func(thd, arg1, arg2, arg3) {}
|
Item_func_pad(thd, arg1, arg2, arg3) {}
|
||||||
|
Item_func_lpad(THD *thd, Item *arg1, Item *arg2):
|
||||||
|
Item_func_pad(thd, arg1, arg2) {}
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec();
|
|
||||||
const char *func_name() const { return "lpad"; }
|
const char *func_name() const { return "lpad"; }
|
||||||
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
Item *get_copy(THD *thd, MEM_ROOT *mem_root)
|
||||||
{ return get_item_copy<Item_func_lpad>(thd, mem_root, this); }
|
{ return get_item_copy<Item_func_lpad>(thd, mem_root, this); }
|
||||||
|
|
|
@ -791,8 +791,7 @@ bool Protocol::send_result_set_metadata(List<Item> *list, uint flags)
|
||||||
{
|
{
|
||||||
List_iterator_fast<Item> it(*list);
|
List_iterator_fast<Item> it(*list);
|
||||||
Item *item;
|
Item *item;
|
||||||
uchar buff[MAX_FIELD_WIDTH];
|
ValueBuffer<MAX_FIELD_WIDTH> tmp;
|
||||||
String tmp((char*) buff,sizeof(buff),&my_charset_bin);
|
|
||||||
Protocol_text prot(thd);
|
Protocol_text prot(thd);
|
||||||
String *local_packet= prot.storage_packet();
|
String *local_packet= prot.storage_packet();
|
||||||
CHARSET_INFO *thd_charset= thd->variables.character_set_results;
|
CHARSET_INFO *thd_charset= thd->variables.character_set_results;
|
||||||
|
@ -800,7 +799,9 @@ bool Protocol::send_result_set_metadata(List<Item> *list, uint flags)
|
||||||
|
|
||||||
if (flags & SEND_NUM_ROWS)
|
if (flags & SEND_NUM_ROWS)
|
||||||
{ // Packet with number of elements
|
{ // Packet with number of elements
|
||||||
|
uchar buff[MAX_INT_WIDTH];
|
||||||
uchar *pos= net_store_length(buff, list->elements);
|
uchar *pos= net_store_length(buff, list->elements);
|
||||||
|
DBUG_ASSERT(pos <= buff + sizeof(buff));
|
||||||
if (my_net_write(&thd->net, buff, (size_t) (pos-buff)))
|
if (my_net_write(&thd->net, buff, (size_t) (pos-buff)))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
@ -968,15 +969,20 @@ bool Protocol::write()
|
||||||
|
|
||||||
bool Protocol::send_result_set_row(List<Item> *row_items)
|
bool Protocol::send_result_set_row(List<Item> *row_items)
|
||||||
{
|
{
|
||||||
char buffer[MAX_FIELD_WIDTH];
|
|
||||||
String str_buffer(buffer, sizeof (buffer), &my_charset_bin);
|
|
||||||
List_iterator_fast<Item> it(*row_items);
|
List_iterator_fast<Item> it(*row_items);
|
||||||
|
|
||||||
DBUG_ENTER("Protocol::send_result_set_row");
|
DBUG_ENTER("Protocol::send_result_set_row");
|
||||||
|
|
||||||
for (Item *item= it++; item; item= it++)
|
for (Item *item= it++; item; item= it++)
|
||||||
{
|
{
|
||||||
if (item->send(this, &str_buffer))
|
/*
|
||||||
|
ValueBuffer::m_string can be altered during Item::send().
|
||||||
|
It's important to declare value_buffer inside the loop,
|
||||||
|
to have ValueBuffer::m_string point to ValueBuffer::buffer
|
||||||
|
on every iteration.
|
||||||
|
*/
|
||||||
|
ValueBuffer<MAX_FIELD_WIDTH> value_buffer;
|
||||||
|
if (item->send(this, &value_buffer))
|
||||||
{
|
{
|
||||||
// If we're out of memory, reclaim some, to help us recover.
|
// If we're out of memory, reclaim some, to help us recover.
|
||||||
this->free();
|
this->free();
|
||||||
|
@ -985,12 +991,6 @@ bool Protocol::send_result_set_row(List<Item> *row_items)
|
||||||
/* Item::send() may generate an error. If so, abort the loop. */
|
/* Item::send() may generate an error. If so, abort the loop. */
|
||||||
if (thd->is_error())
|
if (thd->is_error())
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
/*
|
|
||||||
Reset str_buffer to its original state, as it may have been altered in
|
|
||||||
Item::send().
|
|
||||||
*/
|
|
||||||
str_buffer.set(buffer, sizeof(buffer), &my_charset_bin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
|
|
|
@ -2985,7 +2985,7 @@ sp_head::show_routine_code(THD *thd)
|
||||||
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, tmp);
|
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, tmp);
|
||||||
}
|
}
|
||||||
protocol->prepare_for_resend();
|
protocol->prepare_for_resend();
|
||||||
protocol->store((longlong)ip);
|
protocol->store_long(ip);
|
||||||
|
|
||||||
buffer.set("", 0, system_charset_info);
|
buffer.set("", 0, system_charset_info);
|
||||||
i->print(&buffer);
|
i->print(&buffer);
|
||||||
|
|
146
sql/sql_type.cc
146
sql/sql_type.cc
|
@ -513,6 +513,21 @@ Type_handler_hybrid_field_type::aggregate_for_result(const Type_handler *other)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
This method is called for CASE (and its abbreviations) and LEAST/GREATEST
|
||||||
|
when data type aggregation returned LONGLONG and there were some BIT
|
||||||
|
expressions. This helps to adjust the data type from LONGLONG to LONG
|
||||||
|
if all expressions fit.
|
||||||
|
*/
|
||||||
|
const Type_handler *
|
||||||
|
Type_handler::bit_and_int_mixture_handler(uint max_char_length)
|
||||||
|
{
|
||||||
|
if (max_char_length <= MY_INT32_NUM_DECIMAL_DIGITS)
|
||||||
|
return &type_handler_long;
|
||||||
|
return &type_handler_longlong;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Aggregates field types from the array of items.
|
@brief Aggregates field types from the array of items.
|
||||||
|
|
||||||
|
@ -552,6 +567,8 @@ Type_handler_hybrid_field_type::aggregate_for_result(const char *funcname,
|
||||||
Item **items, uint nitems,
|
Item **items, uint nitems,
|
||||||
bool treat_bit_as_number)
|
bool treat_bit_as_number)
|
||||||
{
|
{
|
||||||
|
bool bit_and_non_bit_mixture_found= false;
|
||||||
|
uint32 max_display_length;
|
||||||
if (!nitems || items[0]->result_type() == ROW_RESULT)
|
if (!nitems || items[0]->result_type() == ROW_RESULT)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
|
@ -559,12 +576,15 @@ Type_handler_hybrid_field_type::aggregate_for_result(const char *funcname,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
set_handler(items[0]->type_handler());
|
set_handler(items[0]->type_handler());
|
||||||
|
max_display_length= items[0]->max_display_length();
|
||||||
for (uint i= 1 ; i < nitems ; i++)
|
for (uint i= 1 ; i < nitems ; i++)
|
||||||
{
|
{
|
||||||
const Type_handler *cur= items[i]->type_handler();
|
const Type_handler *cur= items[i]->type_handler();
|
||||||
|
set_if_bigger(max_display_length, items[i]->max_display_length());
|
||||||
if (treat_bit_as_number &&
|
if (treat_bit_as_number &&
|
||||||
((type_handler() == &type_handler_bit) ^ (cur == &type_handler_bit)))
|
((type_handler() == &type_handler_bit) ^ (cur == &type_handler_bit)))
|
||||||
{
|
{
|
||||||
|
bit_and_non_bit_mixture_found= true;
|
||||||
if (type_handler() == &type_handler_bit)
|
if (type_handler() == &type_handler_bit)
|
||||||
set_handler(&type_handler_longlong); // BIT + non-BIT
|
set_handler(&type_handler_longlong); // BIT + non-BIT
|
||||||
else
|
else
|
||||||
|
@ -577,6 +597,8 @@ Type_handler_hybrid_field_type::aggregate_for_result(const char *funcname,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (bit_and_non_bit_mixture_found && type_handler() == &type_handler_longlong)
|
||||||
|
set_handler(Type_handler::bit_and_int_mixture_handler(max_display_length));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -728,7 +750,9 @@ Type_handler_hybrid_field_type::aggregate_for_min_max(const Type_handler *h)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_type_handler= &type_handler_double;
|
// Preserve FLOAT if two FLOATs, set to DOUBLE otherwise.
|
||||||
|
if (m_type_handler != &type_handler_float || h != &type_handler_float)
|
||||||
|
m_type_handler= &type_handler_double;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -738,12 +762,19 @@ bool
|
||||||
Type_handler_hybrid_field_type::aggregate_for_min_max(const char *funcname,
|
Type_handler_hybrid_field_type::aggregate_for_min_max(const char *funcname,
|
||||||
Item **items, uint nitems)
|
Item **items, uint nitems)
|
||||||
{
|
{
|
||||||
|
bool bit_and_non_bit_mixture_found= false;
|
||||||
|
uint32 max_display_length;
|
||||||
// LEAST/GREATEST require at least two arguments
|
// LEAST/GREATEST require at least two arguments
|
||||||
DBUG_ASSERT(nitems > 1);
|
DBUG_ASSERT(nitems > 1);
|
||||||
set_handler(items[0]->type_handler());
|
set_handler(items[0]->type_handler());
|
||||||
|
max_display_length= items[0]->max_display_length();
|
||||||
for (uint i= 1; i < nitems; i++)
|
for (uint i= 1; i < nitems; i++)
|
||||||
{
|
{
|
||||||
const Type_handler *cur= items[i]->type_handler();
|
const Type_handler *cur= items[i]->type_handler();
|
||||||
|
set_if_bigger(max_display_length, items[i]->max_display_length());
|
||||||
|
// Check if BIT + non-BIT, or non-BIT + BIT
|
||||||
|
bit_and_non_bit_mixture_found|= (m_type_handler == &type_handler_bit) !=
|
||||||
|
(cur == &type_handler_bit);
|
||||||
if (aggregate_for_min_max(cur))
|
if (aggregate_for_min_max(cur))
|
||||||
{
|
{
|
||||||
my_error(ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION, MYF(0),
|
my_error(ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION, MYF(0),
|
||||||
|
@ -751,6 +782,8 @@ Type_handler_hybrid_field_type::aggregate_for_min_max(const char *funcname,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (bit_and_non_bit_mixture_found && type_handler() == &type_handler_longlong)
|
||||||
|
set_handler(Type_handler::bit_and_int_mixture_handler(max_display_length));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4028,3 +4061,114 @@ bool Type_handler_time_common::
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
|
|
||||||
|
bool Type_handler_null::
|
||||||
|
Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_str(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
String *res;
|
||||||
|
if ((res= item->val_str(&buf->m_string)))
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(!item->null_value);
|
||||||
|
return protocol->store(res->ptr(), res->length(), res->charset());
|
||||||
|
}
|
||||||
|
DBUG_ASSERT(item->null_value);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_tiny(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
longlong nr= item->val_int();
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store_tiny(nr);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_short(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
longlong nr= item->val_int();
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store_short(nr);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_long(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
longlong nr= item->val_int();
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store_long(nr);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_longlong(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
longlong nr= item->val_int();
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store_longlong(nr, item->unsigned_flag);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_float(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
float nr= (float) item->val_real();
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store(nr, item->decimals, &buf->m_string);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_double(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
double nr= item->val_real();
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store(nr, item->decimals, &buf->m_string);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_datetime(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
item->get_date(&buf->value.m_time, sql_mode_for_dates(current_thd));
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store(&buf->value.m_time, item->decimals);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_date(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
item->get_date(&buf->value.m_time, sql_mode_for_dates(current_thd));
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store_date(&buf->value.m_time);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Item_send_time(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
item->get_time(&buf->value.m_time);
|
||||||
|
if (!item->null_value)
|
||||||
|
return protocol->store_time(&buf->value.m_time, item->decimals);
|
||||||
|
return protocol->store_null();
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************/
|
||||||
|
|
|
@ -63,6 +63,7 @@ class in_vector;
|
||||||
class Sort_param;
|
class Sort_param;
|
||||||
class Arg_comparator;
|
class Arg_comparator;
|
||||||
struct st_value;
|
struct st_value;
|
||||||
|
class Protocol;
|
||||||
struct TABLE;
|
struct TABLE;
|
||||||
struct SORT_FIELD_ATTR;
|
struct SORT_FIELD_ATTR;
|
||||||
|
|
||||||
|
@ -465,6 +466,7 @@ public:
|
||||||
Type_all_attributes(const Type_all_attributes *other)
|
Type_all_attributes(const Type_all_attributes *other)
|
||||||
:Type_std_attributes(other)
|
:Type_std_attributes(other)
|
||||||
{ }
|
{ }
|
||||||
|
virtual ~Type_all_attributes() {}
|
||||||
// Returns total number of decimal digits
|
// Returns total number of decimal digits
|
||||||
virtual uint decimal_precision() const= 0;
|
virtual uint decimal_precision() const= 0;
|
||||||
/*
|
/*
|
||||||
|
@ -531,9 +533,20 @@ protected:
|
||||||
bool
|
bool
|
||||||
Item_func_or_sum_illegal_param(const Item_func_or_sum *) const;
|
Item_func_or_sum_illegal_param(const Item_func_or_sum *) const;
|
||||||
bool check_null(const Item *item, st_value *value) const;
|
bool check_null(const Item *item, st_value *value) const;
|
||||||
|
bool Item_send_str(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_tiny(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_short(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_long(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_longlong(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_float(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_double(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_time(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_date(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
|
bool Item_send_datetime(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
public:
|
public:
|
||||||
static const Type_handler *blob_type_handler(uint max_octet_length);
|
static const Type_handler *blob_type_handler(uint max_octet_length);
|
||||||
static const Type_handler *string_type_handler(uint max_octet_length);
|
static const Type_handler *string_type_handler(uint max_octet_length);
|
||||||
|
static const Type_handler *bit_and_int_mixture_handler(uint max_char_len);
|
||||||
/**
|
/**
|
||||||
Return a string type handler for Item
|
Return a string type handler for Item
|
||||||
If too_big_for_varchar() returns a BLOB variant, according to length.
|
If too_big_for_varchar() returns a BLOB variant, according to length.
|
||||||
|
@ -670,6 +683,7 @@ public:
|
||||||
|
|
||||||
virtual uint32 max_display_length(const Item *item) const= 0;
|
virtual uint32 max_display_length(const Item *item) const= 0;
|
||||||
virtual bool Item_save_in_value(Item *item, st_value *value) const= 0;
|
virtual bool Item_save_in_value(Item *item, st_value *value) const= 0;
|
||||||
|
virtual bool Item_send(Item *item, Protocol *p, st_value *buf) const= 0;
|
||||||
virtual int Item_save_in_field(Item *item, Field *field,
|
virtual int Item_save_in_field(Item *item, Field *field,
|
||||||
bool no_conversions) const= 0;
|
bool no_conversions) const= 0;
|
||||||
|
|
||||||
|
@ -886,6 +900,11 @@ public:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
bool Item_save_in_value(Item *item, st_value *value) const;
|
bool Item_save_in_value(Item *item, st_value *value) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const
|
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
|
@ -1155,6 +1174,10 @@ public:
|
||||||
SORT_FIELD_ATTR *attr) const;
|
SORT_FIELD_ATTR *attr) const;
|
||||||
uint32 max_display_length(const Item *item) const;
|
uint32 max_display_length(const Item *item) const;
|
||||||
bool Item_save_in_value(Item *item, st_value *value) const;
|
bool Item_save_in_value(Item *item, st_value *value) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_str(item, protocol, buf);
|
||||||
|
}
|
||||||
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
||||||
Item_cache *Item_get_cache(THD *thd, const Item *item) const;
|
Item_cache *Item_get_cache(THD *thd, const Item *item) const;
|
||||||
bool set_comparator_func(Arg_comparator *cmp) const;
|
bool set_comparator_func(Arg_comparator *cmp) const;
|
||||||
|
@ -1340,6 +1363,10 @@ public:
|
||||||
return Item_temporal_precision(item, false);
|
return Item_temporal_precision(item, false);
|
||||||
}
|
}
|
||||||
bool Item_save_in_value(Item *item, st_value *value) const;
|
bool Item_save_in_value(Item *item, st_value *value) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_str(item, protocol, buf);
|
||||||
|
}
|
||||||
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
||||||
String *print_item_value(THD *thd, Item *item, String *str) const
|
String *print_item_value(THD *thd, Item *item, String *str) const
|
||||||
{
|
{
|
||||||
|
@ -1424,6 +1451,10 @@ public:
|
||||||
const Name name() const { return m_name_tiny; }
|
const Name name() const { return m_name_tiny; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_TINY; }
|
enum_field_types field_type() const { return MYSQL_TYPE_TINY; }
|
||||||
uint32 max_display_length(const Item *item) const { return 4; }
|
uint32 max_display_length(const Item *item) const { return 4; }
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_tiny(item, protocol, buf);
|
||||||
|
}
|
||||||
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
Field *make_table_field(const LEX_CSTRING *name,
|
Field *make_table_field(const LEX_CSTRING *name,
|
||||||
|
@ -1440,6 +1471,10 @@ public:
|
||||||
virtual ~Type_handler_short() {}
|
virtual ~Type_handler_short() {}
|
||||||
const Name name() const { return m_name_short; }
|
const Name name() const { return m_name_short; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_SHORT; }
|
enum_field_types field_type() const { return MYSQL_TYPE_SHORT; }
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_short(item, protocol, buf);
|
||||||
|
}
|
||||||
uint32 max_display_length(const Item *item) const { return 6; }
|
uint32 max_display_length(const Item *item) const { return 6; }
|
||||||
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
|
@ -1461,6 +1496,10 @@ public:
|
||||||
{
|
{
|
||||||
return MY_INT32_NUM_DECIMAL_DIGITS;
|
return MY_INT32_NUM_DECIMAL_DIGITS;
|
||||||
}
|
}
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_long(item, protocol, buf);
|
||||||
|
}
|
||||||
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
Field *make_table_field(const LEX_CSTRING *name,
|
Field *make_table_field(const LEX_CSTRING *name,
|
||||||
|
@ -1478,6 +1517,10 @@ public:
|
||||||
const Name name() const { return m_name_longlong; }
|
const Name name() const { return m_name_longlong; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
|
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
|
||||||
uint32 max_display_length(const Item *item) const { return 20; }
|
uint32 max_display_length(const Item *item) const { return 20; }
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_longlong(item, protocol, buf);
|
||||||
|
}
|
||||||
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
Field *make_conversion_table_field(TABLE *TABLE, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
Field *make_table_field(const LEX_CSTRING *name,
|
Field *make_table_field(const LEX_CSTRING *name,
|
||||||
|
@ -1494,6 +1537,10 @@ public:
|
||||||
virtual ~Type_handler_int24() {}
|
virtual ~Type_handler_int24() {}
|
||||||
const Name name() const { return m_name_mediumint; }
|
const Name name() const { return m_name_mediumint; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_INT24; }
|
enum_field_types field_type() const { return MYSQL_TYPE_INT24; }
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_long(item, protocol, buf);
|
||||||
|
}
|
||||||
uint32 max_display_length(const Item *item) const { return 8; }
|
uint32 max_display_length(const Item *item) const { return 8; }
|
||||||
Field *make_conversion_table_field(TABLE *, uint metadata,
|
Field *make_conversion_table_field(TABLE *, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
|
@ -1512,6 +1559,10 @@ public:
|
||||||
const Name name() const { return m_name_year; }
|
const Name name() const { return m_name_year; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_YEAR; }
|
enum_field_types field_type() const { return MYSQL_TYPE_YEAR; }
|
||||||
uint32 max_display_length(const Item *item) const;
|
uint32 max_display_length(const Item *item) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_short(item, protocol, buf);
|
||||||
|
}
|
||||||
Field *make_conversion_table_field(TABLE *, uint metadata,
|
Field *make_conversion_table_field(TABLE *, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
Field *make_table_field(const LEX_CSTRING *name,
|
Field *make_table_field(const LEX_CSTRING *name,
|
||||||
|
@ -1529,6 +1580,10 @@ public:
|
||||||
const Name name() const { return m_name_bit; }
|
const Name name() const { return m_name_bit; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_BIT; }
|
enum_field_types field_type() const { return MYSQL_TYPE_BIT; }
|
||||||
uint32 max_display_length(const Item *item) const;
|
uint32 max_display_length(const Item *item) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_str(item, protocol, buf);
|
||||||
|
}
|
||||||
String *print_item_value(THD *thd, Item *item, String *str) const
|
String *print_item_value(THD *thd, Item *item, String *str) const
|
||||||
{
|
{
|
||||||
return print_item_value_csstr(thd, item, str);
|
return print_item_value_csstr(thd, item, str);
|
||||||
|
@ -1550,6 +1605,10 @@ public:
|
||||||
const Name name() const { return m_name_float; }
|
const Name name() const { return m_name_float; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_FLOAT; }
|
enum_field_types field_type() const { return MYSQL_TYPE_FLOAT; }
|
||||||
uint32 max_display_length(const Item *item) const { return 25; }
|
uint32 max_display_length(const Item *item) const { return 25; }
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_float(item, protocol, buf);
|
||||||
|
}
|
||||||
Field *make_num_distinct_aggregator_field(MEM_ROOT *, const Item *) const;
|
Field *make_num_distinct_aggregator_field(MEM_ROOT *, const Item *) const;
|
||||||
Field *make_conversion_table_field(TABLE *, uint metadata,
|
Field *make_conversion_table_field(TABLE *, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
|
@ -1568,6 +1627,10 @@ public:
|
||||||
const Name name() const { return m_name_double; }
|
const Name name() const { return m_name_double; }
|
||||||
enum_field_types field_type() const { return MYSQL_TYPE_DOUBLE; }
|
enum_field_types field_type() const { return MYSQL_TYPE_DOUBLE; }
|
||||||
uint32 max_display_length(const Item *item) const { return 53; }
|
uint32 max_display_length(const Item *item) const { return 53; }
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_double(item, protocol, buf);
|
||||||
|
}
|
||||||
Field *make_conversion_table_field(TABLE *, uint metadata,
|
Field *make_conversion_table_field(TABLE *, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
Field *make_table_field(const LEX_CSTRING *name,
|
Field *make_table_field(const LEX_CSTRING *name,
|
||||||
|
@ -1598,6 +1661,10 @@ public:
|
||||||
}
|
}
|
||||||
const Type_handler *type_handler_for_comparison() const;
|
const Type_handler *type_handler_for_comparison() const;
|
||||||
bool Item_save_in_value(Item *item, st_value *value) const;
|
bool Item_save_in_value(Item *item, st_value *value) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_time(item, protocol, buf);
|
||||||
|
}
|
||||||
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
||||||
String *print_item_value(THD *thd, Item *item, String *str) const;
|
String *print_item_value(THD *thd, Item *item, String *str) const;
|
||||||
bool Item_hybrid_func_fix_attributes(THD *thd, Item_hybrid_func *func,
|
bool Item_hybrid_func_fix_attributes(THD *thd, Item_hybrid_func *func,
|
||||||
|
@ -1640,6 +1707,10 @@ public:
|
||||||
virtual ~Type_handler_temporal_with_date() {}
|
virtual ~Type_handler_temporal_with_date() {}
|
||||||
const Type_handler *type_handler_for_comparison() const;
|
const Type_handler *type_handler_for_comparison() const;
|
||||||
bool Item_save_in_value(Item *item, st_value *value) const;
|
bool Item_save_in_value(Item *item, st_value *value) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_date(item, protocol, buf);
|
||||||
|
}
|
||||||
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
|
||||||
cmp_item *make_cmp_item(THD *thd, CHARSET_INFO *cs) const;
|
cmp_item *make_cmp_item(THD *thd, CHARSET_INFO *cs) const;
|
||||||
in_vector *make_in_vector(THD *, const Item_func_in *, uint nargs) const;
|
in_vector *make_in_vector(THD *, const Item_func_in *, uint nargs) const;
|
||||||
|
@ -1708,6 +1779,10 @@ public:
|
||||||
{
|
{
|
||||||
return Item_divisor_precision_increment_with_seconds(item);
|
return Item_divisor_precision_increment_with_seconds(item);
|
||||||
}
|
}
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_datetime(item, protocol, buf);
|
||||||
|
}
|
||||||
String *print_item_value(THD *thd, Item *item, String *str) const;
|
String *print_item_value(THD *thd, Item *item, String *str) const;
|
||||||
bool Item_hybrid_func_fix_attributes(THD *thd, Item_hybrid_func *func,
|
bool Item_hybrid_func_fix_attributes(THD *thd, Item_hybrid_func *func,
|
||||||
Item **items, uint nitems) const;
|
Item **items, uint nitems) const;
|
||||||
|
@ -1760,6 +1835,10 @@ public:
|
||||||
{
|
{
|
||||||
return Item_divisor_precision_increment_with_seconds(item);
|
return Item_divisor_precision_increment_with_seconds(item);
|
||||||
}
|
}
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const
|
||||||
|
{
|
||||||
|
return Item_send_datetime(item, protocol, buf);
|
||||||
|
}
|
||||||
String *print_item_value(THD *thd, Item *item, String *str) const;
|
String *print_item_value(THD *thd, Item *item, String *str) const;
|
||||||
bool Item_hybrid_func_fix_attributes(THD *thd, Item_hybrid_func *func,
|
bool Item_hybrid_func_fix_attributes(THD *thd, Item_hybrid_func *func,
|
||||||
Item **items, uint nitems) const;
|
Item **items, uint nitems) const;
|
||||||
|
@ -1839,6 +1918,7 @@ public:
|
||||||
const Type_handler *type_handler_for_union(const Item *) const;
|
const Type_handler *type_handler_for_union(const Item *) const;
|
||||||
uint32 max_display_length(const Item *item) const { return 0; }
|
uint32 max_display_length(const Item *item) const { return 0; }
|
||||||
bool Item_save_in_value(Item *item, st_value *value) const;
|
bool Item_save_in_value(Item *item, st_value *value) const;
|
||||||
|
bool Item_send(Item *item, Protocol *protocol, st_value *buf) const;
|
||||||
Field *make_conversion_table_field(TABLE *, uint metadata,
|
Field *make_conversion_table_field(TABLE *, uint metadata,
|
||||||
const Field *target) const;
|
const Field *target) const;
|
||||||
Field *make_table_field(const LEX_CSTRING *name,
|
Field *make_table_field(const LEX_CSTRING *name,
|
||||||
|
|
173
sql/sql_yacc.yy
173
sql/sql_yacc.yy
|
@ -772,6 +772,11 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr)
|
||||||
Lex_dyncol_type_st Lex_dyncol_type;
|
Lex_dyncol_type_st Lex_dyncol_type;
|
||||||
Lex_for_loop_st for_loop;
|
Lex_for_loop_st for_loop;
|
||||||
Lex_for_loop_bounds_st for_loop_bounds;
|
Lex_for_loop_bounds_st for_loop_bounds;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
LEX_CSTRING name;
|
||||||
|
uint offset;
|
||||||
|
} sp_cursor_name_and_offset;
|
||||||
|
|
||||||
/* pointers */
|
/* pointers */
|
||||||
Create_field *create_field;
|
Create_field *create_field;
|
||||||
|
@ -860,10 +865,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
%parse-param { THD *thd }
|
%parse-param { THD *thd }
|
||||||
%lex-param { THD *thd }
|
%lex-param { THD *thd }
|
||||||
/*
|
/*
|
||||||
Currently there are 103 shift/reduce conflicts.
|
Currently there are 102 shift/reduce conflicts.
|
||||||
We should not introduce new conflicts any more.
|
We should not introduce new conflicts any more.
|
||||||
*/
|
*/
|
||||||
%expect 103
|
%expect 102
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Comments for TOKENS.
|
Comments for TOKENS.
|
||||||
|
@ -1642,6 +1647,11 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
%type <field_type> int_type real_type
|
%type <field_type> int_type real_type
|
||||||
|
|
||||||
%type <Lex_field_type> type_with_opt_collate field_type
|
%type <Lex_field_type> type_with_opt_collate field_type
|
||||||
|
field_type_numeric
|
||||||
|
field_type_string
|
||||||
|
field_type_lob
|
||||||
|
field_type_temporal
|
||||||
|
field_type_misc
|
||||||
|
|
||||||
%type <Lex_dyncol_type> opt_dyncol_type dyncol_type
|
%type <Lex_dyncol_type> opt_dyncol_type dyncol_type
|
||||||
numeric_dyncol_type temporal_dyncol_type string_dyncol_type
|
numeric_dyncol_type temporal_dyncol_type string_dyncol_type
|
||||||
|
@ -1788,6 +1798,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
%type <Lex_length_and_dec> precision opt_precision float_options
|
%type <Lex_length_and_dec> precision opt_precision float_options
|
||||||
|
|
||||||
%type <symbol> keyword keyword_sp
|
%type <symbol> keyword keyword_sp
|
||||||
|
keyword_sp_data_type
|
||||||
|
keyword_sp_not_data_type
|
||||||
|
|
||||||
%type <lex_user> user grant_user grant_role user_or_role current_role
|
%type <lex_user> user grant_user grant_role user_or_role current_role
|
||||||
admin_option_for_role user_maybe_role
|
admin_option_for_role user_maybe_role
|
||||||
|
@ -6244,6 +6256,14 @@ column_default_expr:
|
||||||
;
|
;
|
||||||
|
|
||||||
field_type:
|
field_type:
|
||||||
|
field_type_numeric
|
||||||
|
| field_type_temporal
|
||||||
|
| field_type_string
|
||||||
|
| field_type_lob
|
||||||
|
| field_type_misc
|
||||||
|
;
|
||||||
|
|
||||||
|
field_type_numeric:
|
||||||
int_type opt_field_length field_options { $$.set($1, $2); }
|
int_type opt_field_length field_options { $$.set($1, $2); }
|
||||||
| real_type opt_precision field_options { $$.set($1, $2); }
|
| real_type opt_precision field_options { $$.set($1, $2); }
|
||||||
| FLOAT_SYM float_options field_options
|
| FLOAT_SYM float_options field_options
|
||||||
|
@ -6274,7 +6294,17 @@ field_type:
|
||||||
{
|
{
|
||||||
$$.set(MYSQL_TYPE_TINY, "1");
|
$$.set(MYSQL_TYPE_TINY, "1");
|
||||||
}
|
}
|
||||||
| char opt_field_length_default_1 opt_binary
|
| DECIMAL_SYM float_options field_options
|
||||||
|
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
||||||
|
| NUMERIC_SYM float_options field_options
|
||||||
|
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
||||||
|
| FIXED_SYM float_options field_options
|
||||||
|
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
field_type_string:
|
||||||
|
char opt_field_length_default_1 opt_binary
|
||||||
{
|
{
|
||||||
$$.set(MYSQL_TYPE_STRING, $2);
|
$$.set(MYSQL_TYPE_STRING, $2);
|
||||||
}
|
}
|
||||||
|
@ -6302,7 +6332,10 @@ field_type:
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
$$.set(MYSQL_TYPE_VARCHAR, $2);
|
||||||
}
|
}
|
||||||
| YEAR_SYM opt_field_length field_options
|
;
|
||||||
|
|
||||||
|
field_type_temporal:
|
||||||
|
YEAR_SYM opt_field_length field_options
|
||||||
{
|
{
|
||||||
if ($2)
|
if ($2)
|
||||||
{
|
{
|
||||||
|
@ -6345,7 +6378,11 @@ field_type:
|
||||||
| DATETIME opt_field_length
|
| DATETIME opt_field_length
|
||||||
{ $$.set(opt_mysql56_temporal_format ?
|
{ $$.set(opt_mysql56_temporal_format ?
|
||||||
MYSQL_TYPE_DATETIME2 : MYSQL_TYPE_DATETIME, $2); }
|
MYSQL_TYPE_DATETIME2 : MYSQL_TYPE_DATETIME, $2); }
|
||||||
| TINYBLOB
|
;
|
||||||
|
|
||||||
|
|
||||||
|
field_type_lob:
|
||||||
|
TINYBLOB
|
||||||
{
|
{
|
||||||
Lex->charset=&my_charset_bin;
|
Lex->charset=&my_charset_bin;
|
||||||
$$.set(MYSQL_TYPE_TINY_BLOB);
|
$$.set(MYSQL_TYPE_TINY_BLOB);
|
||||||
|
@ -6391,18 +6428,16 @@ field_type:
|
||||||
{ $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
|
{ $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
|
||||||
| LONGTEXT opt_binary
|
| LONGTEXT opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_LONG_BLOB); }
|
{ $$.set(MYSQL_TYPE_LONG_BLOB); }
|
||||||
| DECIMAL_SYM float_options field_options
|
| LONG_SYM opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
{ $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
|
||||||
| NUMERIC_SYM float_options field_options
|
;
|
||||||
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
|
||||||
| FIXED_SYM float_options field_options
|
|
||||||
{ $$.set(MYSQL_TYPE_NEWDECIMAL, $2);}
|
field_type_misc:
|
||||||
| ENUM '(' string_list ')' opt_binary
|
ENUM '(' string_list ')' opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_ENUM); }
|
{ $$.set(MYSQL_TYPE_ENUM); }
|
||||||
| SET '(' string_list ')' opt_binary
|
| SET '(' string_list ')' opt_binary
|
||||||
{ $$.set(MYSQL_TYPE_SET); }
|
{ $$.set(MYSQL_TYPE_SET); }
|
||||||
| LONG_SYM opt_binary
|
|
||||||
{ $$.set(MYSQL_TYPE_MEDIUM_BLOB); }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
spatial_type:
|
spatial_type:
|
||||||
|
@ -12202,17 +12237,17 @@ drop:
|
||||||
Lex->set_command(SQLCOM_DROP_SERVER, $3);
|
Lex->set_command(SQLCOM_DROP_SERVER, $3);
|
||||||
Lex->server_options.reset($4);
|
Lex->server_options.reset($4);
|
||||||
}
|
}
|
||||||
| DROP opt_temporary SEQUENCE_SYM opt_if_exists
|
| DROP opt_temporary SEQUENCE_SYM opt_if_exists
|
||||||
|
|
||||||
{
|
{
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
lex->set_command(SQLCOM_DROP_SEQUENCE, $2, $4);
|
lex->set_command(SQLCOM_DROP_SEQUENCE, $2, $4);
|
||||||
lex->table_type= TABLE_TYPE_SEQUENCE;
|
lex->table_type= TABLE_TYPE_SEQUENCE;
|
||||||
YYPS->m_lock_type= TL_UNLOCK;
|
YYPS->m_lock_type= TL_UNLOCK;
|
||||||
YYPS->m_mdl_type= MDL_EXCLUSIVE;
|
YYPS->m_mdl_type= MDL_EXCLUSIVE;
|
||||||
}
|
}
|
||||||
table_list
|
table_list
|
||||||
{}
|
{}
|
||||||
;
|
;
|
||||||
|
|
||||||
table_list:
|
table_list:
|
||||||
|
@ -14094,7 +14129,7 @@ simple_ident:
|
||||||
lip->get_tok_end())))
|
lip->get_tok_end())))
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
| simple_ident_q2 { $$= $1; }
|
| simple_ident_q2
|
||||||
| ident '.' ident
|
| ident '.' ident
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
|
@ -14481,6 +14516,49 @@ keyword:
|
||||||
* conflicts.
|
* conflicts.
|
||||||
*/
|
*/
|
||||||
keyword_sp:
|
keyword_sp:
|
||||||
|
keyword_sp_data_type
|
||||||
|
| keyword_sp_not_data_type
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
These keywords are generally allowed as identifiers,
|
||||||
|
but not allowed as non-delimited SP variable names in sql_mode=ORACLE.
|
||||||
|
*/
|
||||||
|
keyword_sp_data_type:
|
||||||
|
BIT_SYM {}
|
||||||
|
| BOOLEAN_SYM {} /* PLSQL-R */
|
||||||
|
| BOOL_SYM {}
|
||||||
|
| CLOB {}
|
||||||
|
| DATE_SYM {} /* Oracle-R, PLSQL-R */
|
||||||
|
| DATETIME {}
|
||||||
|
| ENUM {}
|
||||||
|
| FIXED_SYM {}
|
||||||
|
| GEOMETRYCOLLECTION {}
|
||||||
|
| GEOMETRY_SYM {}
|
||||||
|
| LINESTRING {}
|
||||||
|
| MEDIUM_SYM {}
|
||||||
|
| MULTILINESTRING {}
|
||||||
|
| MULTIPOINT {}
|
||||||
|
| MULTIPOLYGON {}
|
||||||
|
| NATIONAL_SYM {}
|
||||||
|
| NCHAR_SYM {}
|
||||||
|
| NUMBER_SYM {} /* Oracle-R, PLSQL-R */
|
||||||
|
| NVARCHAR_SYM {}
|
||||||
|
| POINT_SYM {}
|
||||||
|
| POLYGON {}
|
||||||
|
| RAW {} /* Oracle-R */
|
||||||
|
| ROW_SYM {}
|
||||||
|
| SERIAL_SYM {}
|
||||||
|
| TEXT_SYM {}
|
||||||
|
| TIMESTAMP {}
|
||||||
|
| TIME_SYM {} /* Oracle-R */
|
||||||
|
| VARCHAR2 {} /* Oracle-R, PLSQL-R */
|
||||||
|
| YEAR_SYM {}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
keyword_sp_not_data_type:
|
||||||
ACTION {}
|
ACTION {}
|
||||||
| ADDDATE_SYM {}
|
| ADDDATE_SYM {}
|
||||||
| ADMIN_SYM {}
|
| ADMIN_SYM {}
|
||||||
|
@ -14498,10 +14576,7 @@ keyword_sp:
|
||||||
| AUTO_SYM {}
|
| AUTO_SYM {}
|
||||||
| AVG_ROW_LENGTH {}
|
| AVG_ROW_LENGTH {}
|
||||||
| AVG_SYM {}
|
| AVG_SYM {}
|
||||||
| BIT_SYM {}
|
|
||||||
| BLOCK_SYM {}
|
| BLOCK_SYM {}
|
||||||
| BOOL_SYM {}
|
|
||||||
| BOOLEAN_SYM {}
|
|
||||||
| BTREE_SYM {}
|
| BTREE_SYM {}
|
||||||
| CASCADED {}
|
| CASCADED {}
|
||||||
| CATALOG_NAME_SYM {}
|
| CATALOG_NAME_SYM {}
|
||||||
|
@ -14510,7 +14585,6 @@ keyword_sp:
|
||||||
| CIPHER_SYM {}
|
| CIPHER_SYM {}
|
||||||
| CLIENT_SYM {}
|
| CLIENT_SYM {}
|
||||||
| CLASS_ORIGIN_SYM {}
|
| CLASS_ORIGIN_SYM {}
|
||||||
| CLOB {}
|
|
||||||
| COALESCE {}
|
| COALESCE {}
|
||||||
| CODE_SYM {}
|
| CODE_SYM {}
|
||||||
| COLLATION_SYM {}
|
| COLLATION_SYM {}
|
||||||
|
@ -14540,8 +14614,6 @@ keyword_sp:
|
||||||
| CYCLE_SYM {}
|
| CYCLE_SYM {}
|
||||||
| DATA_SYM {}
|
| DATA_SYM {}
|
||||||
| DATAFILE_SYM {}
|
| DATAFILE_SYM {}
|
||||||
| DATETIME {}
|
|
||||||
| DATE_SYM {}
|
|
||||||
| DAY_SYM {}
|
| DAY_SYM {}
|
||||||
| DECODE_SYM {}
|
| DECODE_SYM {}
|
||||||
| DEFINER_SYM {}
|
| DEFINER_SYM {}
|
||||||
|
@ -14557,7 +14629,6 @@ keyword_sp:
|
||||||
| DYNAMIC_SYM {}
|
| DYNAMIC_SYM {}
|
||||||
| ELSIF_SYM {}
|
| ELSIF_SYM {}
|
||||||
| ENDS_SYM {}
|
| ENDS_SYM {}
|
||||||
| ENUM {}
|
|
||||||
| ENGINE_SYM {}
|
| ENGINE_SYM {}
|
||||||
| ENGINES_SYM {}
|
| ENGINES_SYM {}
|
||||||
| ERROR_SYM {}
|
| ERROR_SYM {}
|
||||||
|
@ -14579,11 +14650,8 @@ keyword_sp:
|
||||||
| FULL {}
|
| FULL {}
|
||||||
| FILE_SYM {}
|
| FILE_SYM {}
|
||||||
| FIRST_SYM {}
|
| FIRST_SYM {}
|
||||||
| FIXED_SYM {}
|
|
||||||
| GENERAL {}
|
| GENERAL {}
|
||||||
| GENERATED_SYM {}
|
| GENERATED_SYM {}
|
||||||
| GEOMETRY_SYM {}
|
|
||||||
| GEOMETRYCOLLECTION {}
|
|
||||||
| GET_FORMAT {}
|
| GET_FORMAT {}
|
||||||
| GRANTS {}
|
| GRANTS {}
|
||||||
| GLOBAL_SYM {}
|
| GLOBAL_SYM {}
|
||||||
|
@ -14615,7 +14683,6 @@ keyword_sp:
|
||||||
| LEAVES {}
|
| LEAVES {}
|
||||||
| LESS_SYM {}
|
| LESS_SYM {}
|
||||||
| LEVEL_SYM {}
|
| LEVEL_SYM {}
|
||||||
| LINESTRING {}
|
|
||||||
| LIST_SYM {}
|
| LIST_SYM {}
|
||||||
| LOCAL_SYM {}
|
| LOCAL_SYM {}
|
||||||
| LOCKS_SYM {}
|
| LOCKS_SYM {}
|
||||||
|
@ -14649,7 +14716,6 @@ keyword_sp:
|
||||||
| MAX_STATEMENT_TIME_SYM {}
|
| MAX_STATEMENT_TIME_SYM {}
|
||||||
| MAX_UPDATES_PER_HOUR {}
|
| MAX_UPDATES_PER_HOUR {}
|
||||||
| MAX_USER_CONNECTIONS_SYM {}
|
| MAX_USER_CONNECTIONS_SYM {}
|
||||||
| MEDIUM_SYM {}
|
|
||||||
| MEMORY_SYM {}
|
| MEMORY_SYM {}
|
||||||
| MERGE_SYM {}
|
| MERGE_SYM {}
|
||||||
| MESSAGE_TEXT_SYM {}
|
| MESSAGE_TEXT_SYM {}
|
||||||
|
@ -14661,16 +14727,11 @@ keyword_sp:
|
||||||
| MODIFY_SYM {}
|
| MODIFY_SYM {}
|
||||||
| MODE_SYM {}
|
| MODE_SYM {}
|
||||||
| MONTH_SYM {}
|
| MONTH_SYM {}
|
||||||
| MULTILINESTRING {}
|
|
||||||
| MULTIPOINT {}
|
|
||||||
| MULTIPOLYGON {}
|
|
||||||
| MUTEX_SYM {}
|
| MUTEX_SYM {}
|
||||||
| MYSQL_SYM {}
|
| MYSQL_SYM {}
|
||||||
| MYSQL_ERRNO_SYM {}
|
| MYSQL_ERRNO_SYM {}
|
||||||
| NAME_SYM {}
|
| NAME_SYM {}
|
||||||
| NAMES_SYM {}
|
| NAMES_SYM {}
|
||||||
| NATIONAL_SYM {}
|
|
||||||
| NCHAR_SYM {}
|
|
||||||
| NEXT_SYM {}
|
| NEXT_SYM {}
|
||||||
| NEXTVAL_SYM {}
|
| NEXTVAL_SYM {}
|
||||||
| NEW_SYM {}
|
| NEW_SYM {}
|
||||||
|
@ -14683,8 +14744,6 @@ keyword_sp:
|
||||||
| NODEGROUP_SYM {}
|
| NODEGROUP_SYM {}
|
||||||
| NONE_SYM {}
|
| NONE_SYM {}
|
||||||
| NOTFOUND_SYM {}
|
| NOTFOUND_SYM {}
|
||||||
| NUMBER_SYM {}
|
|
||||||
| NVARCHAR_SYM {}
|
|
||||||
| OF_SYM {} /* SQL-1999-R, Oracle-R */
|
| OF_SYM {} /* SQL-1999-R, Oracle-R */
|
||||||
| OFFSET_SYM {}
|
| OFFSET_SYM {}
|
||||||
| OLD_PASSWORD_SYM {}
|
| OLD_PASSWORD_SYM {}
|
||||||
|
@ -14701,8 +14760,6 @@ keyword_sp:
|
||||||
| PHASE_SYM {}
|
| PHASE_SYM {}
|
||||||
| PLUGIN_SYM {}
|
| PLUGIN_SYM {}
|
||||||
| PLUGINS_SYM {}
|
| PLUGINS_SYM {}
|
||||||
| POINT_SYM {}
|
|
||||||
| POLYGON {}
|
|
||||||
| PRESERVE_SYM {}
|
| PRESERVE_SYM {}
|
||||||
| PREV_SYM {}
|
| PREV_SYM {}
|
||||||
| PREVIOUS_SYM {}
|
| PREVIOUS_SYM {}
|
||||||
|
@ -14716,7 +14773,6 @@ keyword_sp:
|
||||||
| QUERY_SYM {}
|
| QUERY_SYM {}
|
||||||
| QUICK {}
|
| QUICK {}
|
||||||
| RAISE_SYM {}
|
| RAISE_SYM {}
|
||||||
| RAW {}
|
|
||||||
| READ_ONLY_SYM {}
|
| READ_ONLY_SYM {}
|
||||||
| REBUILD_SYM {}
|
| REBUILD_SYM {}
|
||||||
| RECOVER_SYM {}
|
| RECOVER_SYM {}
|
||||||
|
@ -14736,7 +14792,7 @@ keyword_sp:
|
||||||
| RESUME_SYM {}
|
| RESUME_SYM {}
|
||||||
| RETURNED_SQLSTATE_SYM {}
|
| RETURNED_SQLSTATE_SYM {}
|
||||||
| RETURNS_SYM {}
|
| RETURNS_SYM {}
|
||||||
| REUSE_SYM {}
|
| REUSE_SYM {} /* Oracle-R */
|
||||||
| REVERSE_SYM {}
|
| REVERSE_SYM {}
|
||||||
| ROLE_SYM {}
|
| ROLE_SYM {}
|
||||||
| ROLLUP_SYM {}
|
| ROLLUP_SYM {}
|
||||||
|
@ -14745,13 +14801,11 @@ keyword_sp:
|
||||||
| ROWTYPE_SYM {}
|
| ROWTYPE_SYM {}
|
||||||
| ROW_COUNT_SYM {}
|
| ROW_COUNT_SYM {}
|
||||||
| ROW_FORMAT_SYM {}
|
| ROW_FORMAT_SYM {}
|
||||||
| ROW_SYM {}
|
|
||||||
| RTREE_SYM {}
|
| RTREE_SYM {}
|
||||||
| SCHEDULE_SYM {}
|
| SCHEDULE_SYM {}
|
||||||
| SCHEMA_NAME_SYM {}
|
| SCHEMA_NAME_SYM {}
|
||||||
| SECOND_SYM {}
|
| SECOND_SYM {}
|
||||||
| SEQUENCE_SYM {}
|
| SEQUENCE_SYM {}
|
||||||
| SERIAL_SYM {}
|
|
||||||
| SERIALIZABLE_SYM {}
|
| SERIALIZABLE_SYM {}
|
||||||
| SESSION_SYM {}
|
| SESSION_SYM {}
|
||||||
| SIMPLE_SYM {}
|
| SIMPLE_SYM {}
|
||||||
|
@ -14786,15 +14840,12 @@ keyword_sp:
|
||||||
| TABLESPACE {}
|
| TABLESPACE {}
|
||||||
| TEMPORARY {}
|
| TEMPORARY {}
|
||||||
| TEMPTABLE_SYM {}
|
| TEMPTABLE_SYM {}
|
||||||
| TEXT_SYM {}
|
|
||||||
| THAN_SYM {}
|
| THAN_SYM {}
|
||||||
| TRANSACTION_SYM {}
|
| TRANSACTION_SYM {}
|
||||||
| TRANSACTIONAL_SYM {}
|
| TRANSACTIONAL_SYM {}
|
||||||
| TRIGGERS_SYM {}
|
| TRIGGERS_SYM {}
|
||||||
| TIMESTAMP {}
|
|
||||||
| TIMESTAMP_ADD {}
|
| TIMESTAMP_ADD {}
|
||||||
| TIMESTAMP_DIFF {}
|
| TIMESTAMP_DIFF {}
|
||||||
| TIME_SYM {}
|
|
||||||
| TYPES_SYM {}
|
| TYPES_SYM {}
|
||||||
| TYPE_SYM {}
|
| TYPE_SYM {}
|
||||||
| UDF_RETURNS_SYM {}
|
| UDF_RETURNS_SYM {}
|
||||||
|
@ -14807,7 +14858,6 @@ keyword_sp:
|
||||||
| UNTIL_SYM {}
|
| UNTIL_SYM {}
|
||||||
| USER_SYM {}
|
| USER_SYM {}
|
||||||
| USE_FRM {}
|
| USE_FRM {}
|
||||||
| VARCHAR2 {}
|
|
||||||
| VARIABLES {}
|
| VARIABLES {}
|
||||||
| VIEW_SYM {}
|
| VIEW_SYM {}
|
||||||
| VIRTUAL_SYM {}
|
| VIRTUAL_SYM {}
|
||||||
|
@ -14819,7 +14869,6 @@ keyword_sp:
|
||||||
| WORK_SYM {}
|
| WORK_SYM {}
|
||||||
| X509_SYM {}
|
| X509_SYM {}
|
||||||
| XML_SYM {}
|
| XML_SYM {}
|
||||||
| YEAR_SYM {}
|
|
||||||
| VIA_SYM {}
|
| VIA_SYM {}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -15975,11 +16024,6 @@ opt_release:
|
||||||
| NO_SYM RELEASE_SYM { $$= TVL_NO; }
|
| NO_SYM RELEASE_SYM { $$= TVL_NO; }
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_savepoint:
|
|
||||||
/* empty */ {}
|
|
||||||
| SAVEPOINT_SYM {}
|
|
||||||
;
|
|
||||||
|
|
||||||
commit:
|
commit:
|
||||||
COMMIT_SYM opt_work opt_chain opt_release
|
COMMIT_SYM opt_work opt_chain opt_release
|
||||||
{
|
{
|
||||||
|
@ -16002,13 +16046,18 @@ rollback:
|
||||||
lex->tx_chain= $3;
|
lex->tx_chain= $3;
|
||||||
lex->tx_release= $4;
|
lex->tx_release= $4;
|
||||||
}
|
}
|
||||||
| ROLLBACK_SYM opt_work
|
| ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident
|
||||||
TO_SYM opt_savepoint ident
|
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT;
|
lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT;
|
||||||
lex->ident= $5;
|
lex->ident= $5;
|
||||||
}
|
}
|
||||||
|
| ROLLBACK_SYM opt_work TO_SYM ident
|
||||||
|
{
|
||||||
|
LEX *lex=Lex;
|
||||||
|
lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT;
|
||||||
|
lex->ident= $4;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
savepoint:
|
savepoint:
|
||||||
|
|
|
@ -274,10 +274,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
||||||
%parse-param { THD *thd }
|
%parse-param { THD *thd }
|
||||||
%lex-param { THD *thd }
|
%lex-param { THD *thd }
|
||||||
/*
|
/*
|
||||||
Currently there are 105 shift/reduce conflicts.
|
Currently there are 104 shift/reduce conflicts.
|
||||||
We should not introduce new conflicts any more.
|
We should not introduce new conflicts any more.
|
||||||
*/
|
*/
|
||||||
%expect 105
|
%expect 104
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Comments for TOKENS.
|
Comments for TOKENS.
|
||||||
|
@ -14721,7 +14721,7 @@ keyword_sp:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These keywords are generally allowed as identifiers,
|
These keywords are generally allowed as identifiers,
|
||||||
but not allowed as non-delimited SP variable names.
|
but not allowed as non-delimited SP variable names in sql_mode=ORACLE.
|
||||||
*/
|
*/
|
||||||
keyword_sp_data_type:
|
keyword_sp_data_type:
|
||||||
BIT_SYM {}
|
BIT_SYM {}
|
||||||
|
@ -16262,11 +16262,6 @@ opt_release:
|
||||||
| NO_SYM RELEASE_SYM { $$= TVL_NO; }
|
| NO_SYM RELEASE_SYM { $$= TVL_NO; }
|
||||||
;
|
;
|
||||||
|
|
||||||
opt_savepoint:
|
|
||||||
/* empty */ {}
|
|
||||||
| SAVEPOINT_SYM {}
|
|
||||||
;
|
|
||||||
|
|
||||||
commit:
|
commit:
|
||||||
COMMIT_SYM opt_work opt_chain opt_release
|
COMMIT_SYM opt_work opt_chain opt_release
|
||||||
{
|
{
|
||||||
|
@ -16289,13 +16284,18 @@ rollback:
|
||||||
lex->tx_chain= $3;
|
lex->tx_chain= $3;
|
||||||
lex->tx_release= $4;
|
lex->tx_release= $4;
|
||||||
}
|
}
|
||||||
| ROLLBACK_SYM opt_work
|
| ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident
|
||||||
TO_SYM opt_savepoint ident
|
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT;
|
lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT;
|
||||||
lex->ident= $5;
|
lex->ident= $5;
|
||||||
}
|
}
|
||||||
|
| ROLLBACK_SYM opt_work TO_SYM ident
|
||||||
|
{
|
||||||
|
LEX *lex=Lex;
|
||||||
|
lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT;
|
||||||
|
lex->ident= $4;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
savepoint:
|
savepoint:
|
||||||
|
|
Loading…
Reference in a new issue