Commit 4c57ab34 authored by Alexander Barkov's avatar Alexander Barkov

Merge remote-tracking branch 'origin/10.3' into 10.4

parents 3fbd9f15 ee9a19fb
#
# MDEV-17323: Backport INFORMATION_SCHEMA.CHECK_CONSTRAINTS to 10.2
#
CREATE user boo1;
GRANT select,create,alter,drop on foo.* to boo1;
SHOW GRANTS for boo1;
Grants for boo1@%
GRANT USAGE ON *.* TO 'boo1'@'%'
GRANT SELECT, CREATE, DROP, ALTER ON `foo`.* TO 'boo1'@'%'
CREATE user boo2;
create database foo;
CONNECT con1,localhost, boo1,, foo;
SET check_constraint_checks=1;
CREATE TABLE t0
(
t int, check (t>32) # table constraint
) ENGINE=myisam;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CONSTRAINT_1 t0 `t` > 32
ALTER TABLE t0
ADD CONSTRAINT CHK_t0_t CHECK(t<100);
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CHK_t0_t t0 `t` < 100
def foo CONSTRAINT_1 t0 `t` > 32
ALTER TABLE t0
DROP CONSTRAINT CHK_t0_t;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CONSTRAINT_1 t0 `t` > 32
ALTER TABLE t0
ADD CONSTRAINT CHECK(t<50);
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CONSTRAINT_1 t0 `t` > 32
def foo CONSTRAINT_2 t0 `t` < 50
CREATE TABLE t1
( t int CHECK(t>2), # field constraint
tt int,
CONSTRAINT CHECK (tt > 32), CONSTRAINT CHECK (tt <50),# autogenerated names table constraints
CONSTRAINT CHK_tt CHECK(tt<100) # named table constraint
) ENGINE=InnoDB;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CHK_tt t1 `tt` < 100
def foo CONSTRAINT_1 t0 `t` > 32
def foo CONSTRAINT_1 t1 `tt` > 32
def foo CONSTRAINT_2 t0 `t` < 50
def foo CONSTRAINT_2 t1 `tt` < 50
def foo t t1 `t` > 2
ALTER TABLE t1
DROP CONSTRAINT CHK_tt;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CONSTRAINT_1 t0 `t` > 32
def foo CONSTRAINT_1 t1 `tt` > 32
def foo CONSTRAINT_2 t0 `t` < 50
def foo CONSTRAINT_2 t1 `tt` < 50
def foo t t1 `t` > 2
CREATE TABLE t2
(
name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint
start_date DATE,
end_date DATE,
CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint
)ENGINE=Innodb;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CHK_dates t2 `start_date` is null
def foo CONSTRAINT_1 t0 `t` > 32
def foo CONSTRAINT_1 t1 `tt` > 32
def foo CONSTRAINT_2 t0 `t` < 50
def foo CONSTRAINT_2 t1 `tt` < 50
def foo name t2 char_length(`name`) > 2
def foo t t1 `t` > 2
ALTER TABLE t1
ADD CONSTRAINT CHK_new_ CHECK(t>tt);
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CHK_dates t2 `start_date` is null
def foo CHK_new_ t1 `t` > `tt`
def foo CONSTRAINT_1 t0 `t` > 32
def foo CONSTRAINT_1 t1 `tt` > 32
def foo CONSTRAINT_2 t0 `t` < 50
def foo CONSTRAINT_2 t1 `tt` < 50
def foo name t2 char_length(`name`) > 2
def foo t t1 `t` > 2
CREATE TABLE t3
(
a int,
b int check (b>0), # field constraint named 'b'
CONSTRAINT b check (b>10) # table constraint
) ENGINE=InnoDB;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
def foo CHK_dates t2 `start_date` is null
def foo CHK_new_ t1 `t` > `tt`
def foo CONSTRAINT_1 t0 `t` > 32
def foo CONSTRAINT_1 t1 `tt` > 32
def foo CONSTRAINT_2 t0 `t` < 50
def foo CONSTRAINT_2 t1 `tt` < 50
def foo b t3 `b` > 0
def foo b t3 `b` > 10
def foo name t2 char_length(`name`) > 2
def foo t t1 `t` > 2
disconnect con1;
CONNECT con2, localhost, boo2,, test;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
disconnect con2;
CONNECT con1, localhost, boo1,,foo;
DROP TABLE t0;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP DATABASE foo;
disconnect con1;
connection default;
DROP USER boo1;
DROP USER boo2;
# #
# MDEV-14474: Create INFORMATION_SCHEMA.CHECK_CONSTRAINTS # MDEV-14474: Create INFORMATION_SCHEMA.CHECK_CONSTRAINTS
# #
set check_constraint_checks=1; CREATE user boo1;
use test; GRANT select,create,alter,drop on foo.* to boo1;
create table t0 SHOW GRANTS for boo1;
Grants for boo1@%
GRANT USAGE ON *.* TO 'boo1'@'%'
GRANT SELECT, CREATE, DROP, ALTER ON `foo`.* TO 'boo1'@'%'
CREATE user boo2;
create database foo;
CONNECT con1,localhost, boo1,, foo;
SET check_constraint_checks=1;
CREATE TABLE t0
( (
t int, check (t>32) # table constraint t int, check (t>32) # table constraint
) ENGINE=myisam; ) ENGINE=myisam;
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA mysql def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME Priv
TABLE_NAME global_priv
CHECK_CLAUSE json_valid(`Priv`)
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CONSTRAINT_1
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
ALTER TABLE t0 ALTER TABLE t0
ADD CONSTRAINT CHK_t0_t CHECK(t<100); ADD CONSTRAINT CHK_t0_t CHECK(t<100);
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA mysql def foo t0 CHK_t0_t `t` < 100
CONSTRAINT_NAME Priv def foo t0 CONSTRAINT_1 `t` > 32
TABLE_NAME global_priv
CHECK_CLAUSE json_valid(`Priv`)
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CHK_t0_t
TABLE_NAME t0
CHECK_CLAUSE `t` < 100
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CONSTRAINT_1
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
ALTER TABLE t0 ALTER TABLE t0
DROP CONSTRAINT CHK_t0_t; DROP CONSTRAINT CHK_t0_t;
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA mysql def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME Priv ALTER TABLE t0
TABLE_NAME global_priv ADD CONSTRAINT CHECK(t<50);
CHECK_CLAUSE json_valid(`Priv`) SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA test def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME CONSTRAINT_1 def foo t0 CONSTRAINT_2 `t` < 50
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
CREATE TABLE t1 CREATE TABLE t1
( t int CHECK(t>2), # field constraint ( t int CHECK(t>2), # field constraint
tt int, CONSTRAINT CHK_tt CHECK(tt<100) # table constraint tt int,
CONSTRAINT CHECK (tt > 32), CONSTRAINT CHECK (tt <50),# autogenerated names table constraints
CONSTRAINT CHK_tt CHECK(tt<100) # named table constraint
) ENGINE=InnoDB; ) ENGINE=InnoDB;
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA mysql def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME Priv def foo t0 CONSTRAINT_2 `t` < 50
TABLE_NAME global_priv def foo t1 CHK_tt `tt` < 100
CHECK_CLAUSE json_valid(`Priv`) def foo t1 CONSTRAINT_1 `tt` > 32
CONSTRAINT_CATALOG def def foo t1 CONSTRAINT_2 `tt` < 50
CONSTRAINT_SCHEMA test def foo t1 t `t` > 2
CONSTRAINT_NAME CHK_tt
TABLE_NAME t1
CHECK_CLAUSE `tt` < 100
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME t
TABLE_NAME t1
CHECK_CLAUSE `t` > 2
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CONSTRAINT_1
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
ALTER TABLE t1 ALTER TABLE t1
DROP CONSTRAINT CHK_tt; DROP CONSTRAINT CHK_tt;
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA mysql def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME Priv def foo t0 CONSTRAINT_2 `t` < 50
TABLE_NAME global_priv def foo t1 CONSTRAINT_1 `tt` > 32
CHECK_CLAUSE json_valid(`Priv`) def foo t1 CONSTRAINT_2 `tt` < 50
CONSTRAINT_CATALOG def def foo t1 t `t` > 2
CONSTRAINT_SCHEMA test CREATE TABLE t2
CONSTRAINT_NAME t
TABLE_NAME t1
CHECK_CLAUSE `t` > 2
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CONSTRAINT_1
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
create table t2
( (
name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint
start_date DATE, start_date DATE,
end_date DATE, end_date DATE,
CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint
)ENGINE=Innodb; )ENGINE=Innodb;
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA test def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME name def foo t0 CONSTRAINT_2 `t` < 50
TABLE_NAME t2 def foo t1 CONSTRAINT_1 `tt` > 32
CHECK_CLAUSE char_length(`name`) > 2 def foo t1 CONSTRAINT_2 `tt` < 50
CONSTRAINT_CATALOG def def foo t1 t `t` > 2
CONSTRAINT_SCHEMA mysql def foo t2 CHK_dates `start_date` is null
CONSTRAINT_NAME Priv def foo t2 name char_length(`name`) > 2
TABLE_NAME global_priv
CHECK_CLAUSE json_valid(`Priv`)
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CHK_dates
TABLE_NAME t2
CHECK_CLAUSE `start_date` is null
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME t
TABLE_NAME t1
CHECK_CLAUSE `t` > 2
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CONSTRAINT_1
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
ALTER TABLE t1 ALTER TABLE t1
ADD CONSTRAINT CHK_new_ CHECK(t>tt); ADD CONSTRAINT CHK_new_ CHECK(t>tt);
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG def CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
CONSTRAINT_SCHEMA test def foo t0 CONSTRAINT_1 `t` > 32
CONSTRAINT_NAME name def foo t0 CONSTRAINT_2 `t` < 50
TABLE_NAME t2 def foo t1 CHK_new_ `t` > `tt`
CHECK_CLAUSE char_length(`name`) > 2 def foo t1 CONSTRAINT_1 `tt` > 32
CONSTRAINT_CATALOG def def foo t1 CONSTRAINT_2 `tt` < 50
CONSTRAINT_SCHEMA mysql def foo t1 t `t` > 2
CONSTRAINT_NAME Priv def foo t2 CHK_dates `start_date` is null
TABLE_NAME global_priv def foo t2 name char_length(`name`) > 2
CHECK_CLAUSE json_valid(`Priv`) CREATE TABLE t3
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CHK_dates
TABLE_NAME t2
CHECK_CLAUSE `start_date` is null
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME t
TABLE_NAME t1
CHECK_CLAUSE `t` > 2
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CONSTRAINT_1
TABLE_NAME t0
CHECK_CLAUSE `t` > 32
CONSTRAINT_CATALOG def
CONSTRAINT_SCHEMA test
CONSTRAINT_NAME CHK_new_
TABLE_NAME t1
CHECK_CLAUSE `t` > `tt`
create table t3
( (
a int, a int,
b int check (b>0), # field constraint named 'b' b int check (b>0), # field constraint named 'b'
CONSTRAINT b check (b>10) # table constraint CONSTRAINT b check (b>10) # table constraint
) ENGINE=InnoDB; ) ENGINE=InnoDB;
select * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
def test name t2 char_length(`name`) > 2 def foo t0 CONSTRAINT_1 `t` > 32
def mysql Priv global_priv json_valid(`Priv`) def foo t0 CONSTRAINT_2 `t` < 50
def test b t3 `b` > 0 def foo t1 CHK_new_ `t` > `tt`
def test b t3 `b` > 10 def foo t1 CONSTRAINT_1 `tt` > 32
def test CHK_dates t2 `start_date` is null def foo t1 CONSTRAINT_2 `tt` < 50
def test t t1 `t` > 2 def foo t1 t `t` > 2
def test CONSTRAINT_1 t0 `t` > 32 def foo t2 CHK_dates `start_date` is null
def test CHK_new_ t1 `t` > `tt` def foo t2 name char_length(`name`) > 2
drop table t0; def foo t3 b `b` > 0
drop table t1; def foo t3 b `b` > 10
drop table t2; disconnect con1;
drop table t3; CONNECT con2, localhost, boo2,, test;
SELECT * from information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
disconnect con2;
CONNECT con1, localhost, boo1,,foo;
DROP TABLE t0;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP DATABASE foo;
disconnect con1;
connection default;
DROP USER boo1;
DROP USER boo2;
#
# MDEV-18440: Information_schema.check_constraints possible data leak
#
CREATE USER foo;
CREATE DATABASE db;
USE db;
CREATE TABLE t1 (a int, b int, CONSTRAINT CHECK (b > 0));
INSERT INTO t1 VALUES (1, 2), (2, 3);
GRANT SELECT (a) ON t1 TO foo;
SHOW GRANTS FOR foo;
Grants for foo@%
GRANT USAGE ON *.* TO 'foo'@'%'
GRANT SELECT (a) ON `db`.`t1` TO 'foo'@'%'
SELECT * FROM information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
def db t1 CONSTRAINT_1 `b` > 0
def mysql global_priv Priv json_valid(`Priv`)
CONNECT con1,localhost, foo,, db;
SELECT a FROM t1;
a
1
2
SELECT * FROM information_schema.check_constraints;
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE
connection default;
DROP USER foo;
DROP DATABASE db;
...@@ -26,9 +26,9 @@ def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NU ...@@ -26,9 +26,9 @@ def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NU
def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) select NEVER NULL def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) select NEVER NULL
def information_schema CHECK_CONSTRAINTS CHECK_CLAUSE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema CHECK_CONSTRAINTS CHECK_CLAUSE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
def information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL
def information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
def information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
def information_schema CHECK_CONSTRAINTS TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema CHECK_CONSTRAINTS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL
def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL
def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double select NEVER NULL def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double select NEVER NULL
...@@ -568,8 +568,8 @@ COL_CML TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH C ...@@ -568,8 +568,8 @@ COL_CML TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH C
NULL information_schema CHARACTER_SETS MAXLEN bigint NULL NULL NULL NULL bigint(3) NULL information_schema CHARACTER_SETS MAXLEN bigint NULL NULL NULL NULL bigint(3)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CHECK_CONSTRAINTS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS CHECK_CLAUSE varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CHECK_CONSTRAINTS CHECK_CLAUSE varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CLIENT_STATISTICS CLIENT varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CLIENT_STATISTICS CLIENT varchar 64 192 utf8 utf8_general_ci varchar(64)
NULL information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS bigint NULL NULL NULL NULL bigint(21) NULL information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS bigint NULL NULL NULL NULL bigint(21)
......
...@@ -26,9 +26,9 @@ def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NU ...@@ -26,9 +26,9 @@ def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NU
def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) NEVER NULL def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) NEVER NULL
def information_schema CHECK_CONSTRAINTS CHECK_CLAUSE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema CHECK_CONSTRAINTS CHECK_CLAUSE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL
def information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL def information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) NEVER NULL
def information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL
def information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL
def information_schema CHECK_CONSTRAINTS TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL def information_schema CHECK_CONSTRAINTS TABLE_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) NEVER NULL
def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL
def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL
def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double NEVER NULL def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double NEVER NULL
...@@ -568,8 +568,8 @@ COL_CML TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH C ...@@ -568,8 +568,8 @@ COL_CML TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH C
NULL information_schema CHARACTER_SETS MAXLEN bigint NULL NULL NULL NULL bigint(3) NULL information_schema CHARACTER_SETS MAXLEN bigint NULL NULL NULL NULL bigint(3)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CHECK_CONSTRAINTS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CHECK_CONSTRAINTS CHECK_CLAUSE varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CHECK_CONSTRAINTS CHECK_CLAUSE varchar 64 192 utf8 utf8_general_ci varchar(64)
3.0000 information_schema CLIENT_STATISTICS CLIENT varchar 64 192 utf8 utf8_general_ci varchar(64) 3.0000 information_schema CLIENT_STATISTICS CLIENT varchar 64 192 utf8 utf8_general_ci varchar(64)
NULL information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS bigint NULL NULL NULL NULL bigint(21) NULL information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS bigint NULL NULL NULL NULL bigint(21)
......
--source include/have_innodb.inc
--source include/not_embedded.inc
--echo #
--echo # MDEV-17323: Backport INFORMATION_SCHEMA.CHECK_CONSTRAINTS to 10.2
--echo #
CREATE user boo1;
GRANT select,create,alter,drop on foo.* to boo1;
SHOW GRANTS for boo1;
CREATE user boo2;
create database foo;
# Connect with user boo1
CONNECT(con1,localhost, boo1,, foo);
SET check_constraint_checks=1;
CREATE TABLE t0
(
t int, check (t>32) # table constraint
) ENGINE=myisam;
--sorted_result
SELECT * from information_schema.check_constraints;
ALTER TABLE t0
ADD CONSTRAINT CHK_t0_t CHECK(t<100);
--sorted_result
SELECT * from information_schema.check_constraints;
ALTER TABLE t0
DROP CONSTRAINT CHK_t0_t;
--sorted_result
SELECT * from information_schema.check_constraints;
ALTER TABLE t0
ADD CONSTRAINT CHECK(t<50);
--sorted_result
SELECT * from information_schema.check_constraints;
CREATE TABLE t1
( t int CHECK(t>2), # field constraint
tt int,
CONSTRAINT CHECK (tt > 32), CONSTRAINT CHECK (tt <50),# autogenerated names table constraints
CONSTRAINT CHK_tt CHECK(tt<100) # named table constraint
) ENGINE=InnoDB;
--sorted_result
SELECT * from information_schema.check_constraints;
ALTER TABLE t1
DROP CONSTRAINT CHK_tt;
--sorted_result
SELECT * from information_schema.check_constraints;
CREATE TABLE t2
(
name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint
start_date DATE,
end_date DATE,
CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint
)ENGINE=Innodb;
--sorted_result
SELECT * from information_schema.check_constraints;
ALTER TABLE t1
ADD CONSTRAINT CHK_new_ CHECK(t>tt);
--sorted_result
SELECT * from information_schema.check_constraints;
# Create table with same field and table check constraint name
CREATE TABLE t3
(
a int,
b int check (b>0), # field constraint named 'b'
CONSTRAINT b check (b>10) # table constraint
) ENGINE=InnoDB;
--sorted_result
SELECT * from information_schema.check_constraints;
DISCONNECT con1;
CONNECT(con2, localhost, boo2,, test);
--sorted_result
SELECT * from information_schema.check_constraints;
DISCONNECT con2;
CONNECT(con1, localhost, boo1,,foo);
DROP TABLE t0;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP DATABASE foo;
DISCONNECT con1;
--CONNECTION default
DROP USER boo1;
DROP USER boo2;
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/not_embedded.inc
--echo # --echo #
--echo # MDEV-14474: Create INFORMATION_SCHEMA.CHECK_CONSTRAINTS --echo # MDEV-14474: Create INFORMATION_SCHEMA.CHECK_CONSTRAINTS
--echo # --echo #
set check_constraint_checks=1; CREATE user boo1;
GRANT select,create,alter,drop on foo.* to boo1;
SHOW GRANTS for boo1;
CREATE user boo2;
create database foo;
# Connect with user boo1
CONNECT(con1,localhost, boo1,, foo);
use test; SET check_constraint_checks=1;
create table t0 CREATE TABLE t0
( (
t int, check (t>32) # table constraint t int, check (t>32) # table constraint
) ENGINE=myisam; ) ENGINE=myisam;
--sorted_result
--vertical_results SELECT * from information_schema.check_constraints;
SELECT * from information_schema.check_constraints order by check_clause;
ALTER TABLE t0 ALTER TABLE t0
ADD CONSTRAINT CHK_t0_t CHECK(t<100); ADD CONSTRAINT CHK_t0_t CHECK(t<100);
--sorted_result
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
ALTER TABLE t0 ALTER TABLE t0
DROP CONSTRAINT CHK_t0_t; DROP CONSTRAINT CHK_t0_t;
--sorted_result
SELECT * from information_schema.check_constraints;
SELECT * from information_schema.check_constraints order by check_clause; ALTER TABLE t0
ADD CONSTRAINT CHECK(t<50);
--sorted_result
SELECT * from information_schema.check_constraints;
CREATE TABLE t1 CREATE TABLE t1
( t int CHECK(t>2), # field constraint ( t int CHECK(t>2), # field constraint
tt int, CONSTRAINT CHK_tt CHECK(tt<100) # table constraint tt int,
CONSTRAINT CHECK (tt > 32), CONSTRAINT CHECK (tt <50),# autogenerated names table constraints
CONSTRAINT CHK_tt CHECK(tt<100) # named table constraint
) ENGINE=InnoDB; ) ENGINE=InnoDB;
--sorted_result
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
ALTER TABLE t1 ALTER TABLE t1
DROP CONSTRAINT CHK_tt; DROP CONSTRAINT CHK_tt;
--sorted_result
SELECT * from information_schema.check_constraints;
SELECT * from information_schema.check_constraints order by check_clause; CREATE TABLE t2
create table t2
( (
name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint
start_date DATE, start_date DATE,
end_date DATE, end_date DATE,
CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint
)ENGINE=Innodb; )ENGINE=Innodb;
--sorted_result
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
ALTER TABLE t1 ALTER TABLE t1
ADD CONSTRAINT CHK_new_ CHECK(t>tt); ADD CONSTRAINT CHK_new_ CHECK(t>tt);
--sorted_result
SELECT * from information_schema.check_constraints order by check_clause; SELECT * from information_schema.check_constraints;
# Create table with same field and table check constraint name # Create table with same field and table check constraint name
create table t3 CREATE TABLE t3
( (
a int, a int,
b int check (b>0), # field constraint named 'b' b int check (b>0), # field constraint named 'b'
CONSTRAINT b check (b>10) # table constraint CONSTRAINT b check (b>10) # table constraint
) ENGINE=InnoDB; ) ENGINE=InnoDB;
--sorted_result
SELECT * from information_schema.check_constraints;
DISCONNECT con1;
CONNECT(con2, localhost, boo2,, test);
--sorted_result
SELECT * from information_schema.check_constraints;
DISCONNECT con2;
CONNECT(con1, localhost, boo1,,foo);
DROP TABLE t0;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
DROP DATABASE foo;
DISCONNECT con1;
--CONNECTION default
DROP USER boo1;
DROP USER boo2;
--echo #
--echo # MDEV-18440: Information_schema.check_constraints possible data leak
--echo #
CREATE USER foo;
CREATE DATABASE db;
USE db;
CREATE TABLE t1 (a int, b int, CONSTRAINT CHECK (b > 0));
INSERT INTO t1 VALUES (1, 2), (2, 3);
GRANT SELECT (a) ON t1 TO foo;
SHOW GRANTS FOR foo;
--sorted_result
SELECT * FROM information_schema.check_constraints;
CONNECT(con1,localhost, foo,, db);
SELECT a FROM t1;
--sorted_result
SELECT * FROM information_schema.check_constraints;
--horizontal_results --CONNECTION default
select * from information_schema.check_constraints order by check_clause;
drop table t0; DROP USER foo;
drop table t1; DROP DATABASE db;
drop table t2;
drop table t3;
...@@ -1092,19 +1092,6 @@ void Aggregator_distinct::endup() ...@@ -1092,19 +1092,6 @@ void Aggregator_distinct::endup()
} }
String *
Item_sum_num::val_str(String *str)
{
return val_string_from_real(str);
}
my_decimal *Item_sum_num::val_decimal(my_decimal *decimal_value)
{
return val_decimal_from_real(decimal_value);
}
String * String *
Item_sum_int::val_str(String *str) Item_sum_int::val_str(String *str)
{ {
...@@ -2183,7 +2170,7 @@ double Stddev::result(bool is_sample_variance) ...@@ -2183,7 +2170,7 @@ double Stddev::result(bool is_sample_variance)
Item_sum_variance::Item_sum_variance(THD *thd, Item_sum_variance *item): Item_sum_variance::Item_sum_variance(THD *thd, Item_sum_variance *item):
Item_sum_num(thd, item), Item_sum_double(thd, item),
m_stddev(item->m_stddev), sample(item->sample), m_stddev(item->m_stddev), sample(item->sample),
prec_increment(item->prec_increment) prec_increment(item->prec_increment)
{ } { }
...@@ -2305,13 +2292,6 @@ double Item_sum_variance::val_real() ...@@ -2305,13 +2292,6 @@ double Item_sum_variance::val_real()
} }
my_decimal *Item_sum_variance::val_decimal(my_decimal *dec_buf)
{
DBUG_ASSERT(fixed == 1);
return val_decimal_from_real(dec_buf);
}
void Item_sum_variance::reset_field() void Item_sum_variance::reset_field()
{ {
double nr; double nr;
......
...@@ -587,6 +587,7 @@ class Item_sum :public Item_func_or_sum ...@@ -587,6 +587,7 @@ class Item_sum :public Item_func_or_sum
virtual void setup_caches(THD *thd) {}; virtual void setup_caches(THD *thd) {};
bool with_sum_func() const { return true; } bool with_sum_func() const { return true; }
virtual void set_partition_row_count(ulonglong count) { DBUG_ASSERT(0); }
}; };
...@@ -733,13 +734,33 @@ class Item_sum_num :public Item_sum ...@@ -733,13 +734,33 @@ class Item_sum_num :public Item_sum
Item_sum_num(THD *thd, Item_sum_num *item): Item_sum_num(THD *thd, Item_sum_num *item):
Item_sum(thd, item) {} Item_sum(thd, item) {}
bool fix_fields(THD *, Item **); bool fix_fields(THD *, Item **);
longlong val_int() { return val_int_from_real(); /* Real as default */ } };
String *val_str(String*str);
my_decimal *val_decimal(my_decimal *);
class Item_sum_double :public Item_sum_num
{
public:
Item_sum_double(THD *thd): Item_sum_num(thd) {}
Item_sum_double(THD *thd, Item *item_par): Item_sum_num(thd, item_par) {}
Item_sum_double(THD *thd, List<Item> &list): Item_sum_num(thd, list) {}
Item_sum_double(THD *thd, Item_sum_double *item) :Item_sum_num(thd, item) {}
longlong val_int()
{
return val_int_from_real();
}
String *val_str(String*str)
{
return val_string_from_real(str);
}
my_decimal *val_decimal(my_decimal *to)
{
return val_decimal_from_real(to);
}
bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
{ {
return type_handler()->Item_get_date_with_warn(thd, this, ltime, fuzzydate); return get_date_from_real(thd, ltime, fuzzydate);
} }
const Type_handler *type_handler() const { return &type_handler_double; }
}; };
...@@ -753,6 +774,10 @@ class Item_sum_int :public Item_sum_num ...@@ -753,6 +774,10 @@ class Item_sum_int :public Item_sum_num
double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); } double val_real() { DBUG_ASSERT(fixed == 1); return (double) val_int(); }
String *val_str(String*str); String *val_str(String*str);
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
{
return get_date_from_int(thd, ltime, fuzzydate);
}
const Type_handler *type_handler() const { return &type_handler_longlong; } const Type_handler *type_handler() const { return &type_handler_longlong; }
bool fix_length_and_dec() bool fix_length_and_dec()
{ decimals=0; max_length=21; maybe_null=null_value=0; return FALSE; } { decimals=0; max_length=21; maybe_null=null_value=0; return FALSE; }
...@@ -794,6 +819,10 @@ class Item_sum_sum :public Item_sum_num, ...@@ -794,6 +819,10 @@ class Item_sum_sum :public Item_sum_num,
longlong val_int(); longlong val_int();
String *val_str(String*str); String *val_str(String*str);
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
{
return type_handler()->Item_get_date_with_warn(thd, this, ltime, fuzzydate);
}
const Type_handler *type_handler() const const Type_handler *type_handler() const
{ return Type_handler_hybrid_field_type::type_handler(); } { return Type_handler_hybrid_field_type::type_handler(); }
void fix_length_and_dec_double(); void fix_length_and_dec_double();
...@@ -985,7 +1014,7 @@ class Stddev ...@@ -985,7 +1014,7 @@ class Stddev
class Item_sum_variance : public Item_sum_num class Item_sum_variance : public Item_sum_double
{ {
Stddev m_stddev; Stddev m_stddev;
bool fix_length_and_dec(); bool fix_length_and_dec();
...@@ -995,7 +1024,7 @@ class Item_sum_variance : public Item_sum_num ...@@ -995,7 +1024,7 @@ class Item_sum_variance : public Item_sum_num
uint prec_increment; uint prec_increment;
Item_sum_variance(THD *thd, Item *item_par, uint sample_arg): Item_sum_variance(THD *thd, Item *item_par, uint sample_arg):
Item_sum_num(thd, item_par), Item_sum_double(thd, item_par),
sample(sample_arg) sample(sample_arg)
{} {}
Item_sum_variance(THD *thd, Item_sum_variance *item); Item_sum_variance(THD *thd, Item_sum_variance *item);
...@@ -1005,7 +1034,6 @@ class Item_sum_variance : public Item_sum_num ...@@ -1005,7 +1034,6 @@ class Item_sum_variance : public Item_sum_num
void clear(); void clear();
bool add(); bool add();
double val_real(); double val_real();
my_decimal *val_decimal(my_decimal *);
void reset_field(); void reset_field();
void update_field(); void update_field();
Item *result_item(THD *thd, Field *field); Item *result_item(THD *thd, Field *field);
...@@ -1014,11 +1042,10 @@ class Item_sum_variance : public Item_sum_num ...@@ -1014,11 +1042,10 @@ class Item_sum_variance : public Item_sum_num
{ return sample ? "var_samp(" : "variance("; } { return sample ? "var_samp(" : "variance("; }
Item *copy_or_same(THD* thd); Item *copy_or_same(THD* thd);
Field *create_tmp_field(bool group, TABLE *table); Field *create_tmp_field(bool group, TABLE *table);
const Type_handler *type_handler() const { return &type_handler_double; }
void cleanup() void cleanup()
{ {
m_stddev= Stddev(); m_stddev= Stddev();
Item_sum_num::cleanup(); Item_sum_double::cleanup();
} }
Item *get_copy(THD *thd) Item *get_copy(THD *thd)
{ return get_item_copy<Item_sum_variance>(thd, this); } { return get_item_copy<Item_sum_variance>(thd, this); }
...@@ -1725,15 +1752,15 @@ class Item_sum_udf_decimal :public Item_udf_sum ...@@ -1725,15 +1752,15 @@ class Item_sum_udf_decimal :public Item_udf_sum
#else /* Dummy functions to get sql_yacc.cc compiled */ #else /* Dummy functions to get sql_yacc.cc compiled */
class Item_sum_udf_float :public Item_sum_num class Item_sum_udf_float :public Item_sum_double
{ {
public: public:
Item_sum_udf_float(THD *thd, udf_func *udf_arg): Item_sum_udf_float(THD *thd, udf_func *udf_arg):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_float(THD *thd, udf_func *udf_arg, List<Item> &list): Item_sum_udf_float(THD *thd, udf_func *udf_arg, List<Item> &list):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_float(THD *thd, Item_sum_udf_float *item) Item_sum_udf_float(THD *thd, Item_sum_udf_float *item)
:Item_sum_num(thd, item) {} :Item_sum_double(thd, item) {}
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; } enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; } double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; }
void clear() {} void clear() {}
...@@ -1743,15 +1770,15 @@ class Item_sum_udf_float :public Item_sum_num ...@@ -1743,15 +1770,15 @@ class Item_sum_udf_float :public Item_sum_num
}; };
class Item_sum_udf_int :public Item_sum_num class Item_sum_udf_int :public Item_sum_double
{ {
public: public:
Item_sum_udf_int(THD *thd, udf_func *udf_arg): Item_sum_udf_int(THD *thd, udf_func *udf_arg):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_int(THD *thd, udf_func *udf_arg, List<Item> &list): Item_sum_udf_int(THD *thd, udf_func *udf_arg, List<Item> &list):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_int(THD *thd, Item_sum_udf_int *item) Item_sum_udf_int(THD *thd, Item_sum_udf_int *item)
:Item_sum_num(thd, item) {} :Item_sum_double(thd, item) {}
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; } enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
longlong val_int() { DBUG_ASSERT(fixed == 1); return 0; } longlong val_int() { DBUG_ASSERT(fixed == 1); return 0; }
double val_real() { DBUG_ASSERT(fixed == 1); return 0; } double val_real() { DBUG_ASSERT(fixed == 1); return 0; }
...@@ -1762,15 +1789,15 @@ class Item_sum_udf_int :public Item_sum_num ...@@ -1762,15 +1789,15 @@ class Item_sum_udf_int :public Item_sum_num
}; };
class Item_sum_udf_decimal :public Item_sum_num class Item_sum_udf_decimal :public Item_sum_double
{ {
public: public:
Item_sum_udf_decimal(THD *thd, udf_func *udf_arg): Item_sum_udf_decimal(THD *thd, udf_func *udf_arg):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_decimal(THD *thd, udf_func *udf_arg, List<Item> &list): Item_sum_udf_decimal(THD *thd, udf_func *udf_arg, List<Item> &list):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_decimal(THD *thd, Item_sum_udf_float *item) Item_sum_udf_decimal(THD *thd, Item_sum_udf_float *item)
:Item_sum_num(thd, item) {} :Item_sum_double(thd, item) {}
enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; } enum Sumfunctype sum_func () const { return UDF_SUM_FUNC; }
double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; } double val_real() { DBUG_ASSERT(fixed == 1); return 0.0; }
my_decimal *val_decimal(my_decimal *) { DBUG_ASSERT(fixed == 1); return 0; } my_decimal *val_decimal(my_decimal *) { DBUG_ASSERT(fixed == 1); return 0; }
...@@ -1781,15 +1808,15 @@ class Item_sum_udf_decimal :public Item_sum_num ...@@ -1781,15 +1808,15 @@ class Item_sum_udf_decimal :public Item_sum_num
}; };
class Item_sum_udf_str :public Item_sum_num class Item_sum_udf_str :public Item_sum_double
{ {
public: public:
Item_sum_udf_str(THD *thd, udf_func *udf_arg): Item_sum_udf_str(THD *thd, udf_func *udf_arg):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_str(THD *thd, udf_func *udf_arg, List<Item> &list): Item_sum_udf_str(THD *thd, udf_func *udf_arg, List<Item> &list):
Item_sum_num(thd) {} Item_sum_double(thd) {}
Item_sum_udf_str(THD *thd, Item_sum_udf_str *item) Item_sum_udf_str(THD *thd, Item_sum_udf_str *item)
:Item_sum_num(thd, item) {} :Item_sum_double(thd, item) {}
String *val_str(String *) String *val_str(String *)
{ DBUG_ASSERT(fixed == 1); null_value=1; return 0; } { DBUG_ASSERT(fixed == 1); null_value=1; return 0; }
double val_real() { DBUG_ASSERT(fixed == 1); null_value=1; return 0.0; } double val_real() { DBUG_ASSERT(fixed == 1); null_value=1; return 0.0; }
......
...@@ -166,28 +166,13 @@ class Item_func_dayofmonth :public Item_long_func_date_field ...@@ -166,28 +166,13 @@ class Item_func_dayofmonth :public Item_long_func_date_field
}; };
class Item_func_month :public Item_func class Item_func_month :public Item_long_func
{ {
public: public:
Item_func_month(THD *thd, Item *a): Item_func(thd, a) Item_func_month(THD *thd, Item *a): Item_long_func(thd, a)
{ collation.set_numeric(); } { }
longlong val_int(); longlong val_int();
double val_real()
{ DBUG_ASSERT(fixed == 1); return (double) Item_func_month::val_int(); }
String *val_str(String *str)
{
longlong nr= val_int();
if (null_value)
return 0;
str->set(nr, collation.collation);
return str;
}
bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
{
return get_date_from_int(thd, ltime, fuzzydate);
}
const char *func_name() const { return "month"; } const char *func_name() const { return "month"; }
const Type_handler *type_handler() const { return &type_handler_long; }
bool fix_length_and_dec() bool fix_length_and_dec()
{ {
decimals= 0; decimals= 0;
......
This diff is collapsed.
...@@ -6908,23 +6908,35 @@ static int get_check_constraints_record(THD *thd, TABLE_LIST *tables, ...@@ -6908,23 +6908,35 @@ static int get_check_constraints_record(THD *thd, TABLE_LIST *tables,
thd->clear_error(); thd->clear_error();
DBUG_RETURN(0); DBUG_RETURN(0);
} }
else if (!tables->view) if (!tables->view)
{ {
if (tables->table->s->table_check_constraints) StringBuffer<MAX_FIELD_WIDTH> str(system_charset_info);
#ifndef NO_EMBEDDED_ACCESS_CHECKS
TABLE_LIST table_acl_check;
bzero((char*) &table_acl_check, sizeof(table_acl_check));
#endif
for (uint i= 0; i < tables->table->s->table_check_constraints; i++)
{ {
for (uint i= 0; i < tables->table->s->table_check_constraints; i++) #ifndef NO_EMBEDDED_ACCESS_CHECKS
if (!(thd->col_access & TABLE_ACLS))
{ {
StringBuffer<MAX_FIELD_WIDTH> str(system_charset_info); table_acl_check.db= *db_name;
Virtual_column_info *check= tables->table->check_constraints[i]; table_acl_check.table_name= *table_name;
restore_record(table, s->default_values); table_acl_check.grant.privilege= thd->col_access;
table->field[0]->store(STRING_WITH_LEN("def"), system_charset_info); if (check_grant(thd, TABLE_ACLS, &table_acl_check, FALSE, 1, TRUE))
table->field[1]->store(db_name->str, db_name->length, system_charset_info); continue;
table->field[2]->store(check->name.str, check->name.length, system_charset_info);
table->field[3]->store(table_name->str, table_name->length, system_charset_info);
check->print(&str);
table->field[4]->store(str.ptr(), str.length(), system_charset_info);
schema_table_store_record(thd, table);
} }
#endif
Virtual_column_info *check= tables->table->check_constraints[i];
table->field[0]->store(STRING_WITH_LEN("def"), system_charset_info);
table->field[3]->store(check->name.str, check->name.length,
system_charset_info);
/* Make sure the string is empty between each print. */
str.length(0);
check->print(&str);
table->field[4]->store(str.ptr(), str.length(), system_charset_info);
if (schema_table_store_record(thd, table))
DBUG_RETURN(1);
} }
} }
DBUG_RETURN(res); DBUG_RETURN(res);
...@@ -9847,9 +9859,9 @@ ST_FIELD_INFO check_constraints_fields_info[]= ...@@ -9847,9 +9859,9 @@ ST_FIELD_INFO check_constraints_fields_info[]=
{"CONSTRAINT_CATALOG", FN_REFLEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FULL_TABLE}, {"CONSTRAINT_CATALOG", FN_REFLEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FULL_TABLE},
{"CONSTRAINT_SCHEMA", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, {"CONSTRAINT_SCHEMA", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0,
OPEN_FULL_TABLE}, OPEN_FULL_TABLE},
{"TABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FULL_TABLE},
{"CONSTRAINT_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, {"CONSTRAINT_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0,
OPEN_FULL_TABLE}, OPEN_FULL_TABLE},
{"TABLE_NAME", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, OPEN_FULL_TABLE},
{"CHECK_CLAUSE", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0, {"CHECK_CLAUSE", NAME_CHAR_LEN, MYSQL_TYPE_STRING, 0, 0, 0,
OPEN_FULL_TABLE}, OPEN_FULL_TABLE},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}
...@@ -9873,8 +9885,8 @@ ST_SCHEMA_TABLE schema_tables[]= ...@@ -9873,8 +9885,8 @@ ST_SCHEMA_TABLE schema_tables[]=
fill_schema_applicable_roles, 0, 0, -1, -1, 0, 0}, fill_schema_applicable_roles, 0, 0, -1, -1, 0, 0},
{"CHARACTER_SETS", charsets_fields_info, 0, {"CHARACTER_SETS", charsets_fields_info, 0,
fill_schema_charsets, make_character_sets_old_format, 0, -1, -1, 0, 0}, fill_schema_charsets, make_character_sets_old_format, 0, -1, -1, 0, 0},
{"CHECK_CONSTRAINTS", check_constraints_fields_info, 0, {"CHECK_CONSTRAINTS", check_constraints_fields_info, 0, get_all_tables, 0,
get_all_tables, 0, get_check_constraints_record, 1, 2, 0, OPTIMIZE_I_S_TABLE|OPEN_TABLE_ONLY}, get_check_constraints_record, 1, 2, 0, OPTIMIZE_I_S_TABLE|OPEN_TABLE_ONLY},
{"COLLATIONS", collation_fields_info, 0, {"COLLATIONS", collation_fields_info, 0,
fill_schema_collation, make_old_format, 0, -1, -1, 0, 0}, fill_schema_collation, make_old_format, 0, -1, -1, 0, 0},
{"COLLATION_CHARACTER_SET_APPLICABILITY", coll_charset_app_fields_info, {"COLLATION_CHARACTER_SET_APPLICABILITY", coll_charset_app_fields_info,
......
...@@ -1779,11 +1779,7 @@ class Frame_unbounded_following_set_count : public Frame_unbounded_following ...@@ -1779,11 +1779,7 @@ class Frame_unbounded_following_set_count : public Frame_unbounded_following
List_iterator_fast<Item_sum> it(sum_functions); List_iterator_fast<Item_sum> it(sum_functions);
Item_sum* item; Item_sum* item;
while ((item= it++)) while ((item= it++))
{ item->set_partition_row_count(num_rows_in_partition);
Item_sum_window_with_row_count* item_with_row_count =
static_cast<Item_sum_window_with_row_count *>(item);
item_with_row_count->set_row_count(num_rows_in_partition);
}
} }
}; };
......
...@@ -127,14 +127,6 @@ mlog_catenate_string( ...@@ -127,14 +127,6 @@ mlog_catenate_string(
const byte* str, /*!< in: string to write */ const byte* str, /*!< in: string to write */
ulint len); /*!< in: string length */ ulint len); /*!< in: string length */
/********************************************************//** /********************************************************//**
Catenates a compressed ulint to mlog. */
UNIV_INLINE
void
mlog_catenate_ulint_compressed(
/*===========================*/
mtr_t* mtr, /*!< in: mtr */
ulint val); /*!< in: value to write */
/********************************************************//**
Catenates a compressed 64-bit integer to mlog. */ Catenates a compressed 64-bit integer to mlog. */
UNIV_INLINE UNIV_INLINE
void void
......
...@@ -117,30 +117,6 @@ mlog_catenate_ulint( ...@@ -117,30 +117,6 @@ mlog_catenate_ulint(
mlog_catenate_ulint(mtr->get_log(), val, type); mlog_catenate_ulint(mtr->get_log(), val, type);
} }
/********************************************************//**
Catenates a compressed ulint to mlog. */
UNIV_INLINE
void
mlog_catenate_ulint_compressed(
/*===========================*/
mtr_t* mtr, /*!< in: mtr */
ulint val) /*!< in: value to write */
{
byte* log_ptr;
log_ptr = mlog_open(mtr, 10);
/* If no logging is requested, we may return now */
if (log_ptr == NULL) {
return;
}
log_ptr += mach_write_compressed(log_ptr, val);
mlog_close(mtr, log_ptr);
}
/********************************************************//** /********************************************************//**
Catenates a compressed 64-bit integer to mlog. */ Catenates a compressed 64-bit integer to mlog. */
UNIV_INLINE UNIV_INLINE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment