Skip to content

Commit d526679

Browse files
an3lcvicentiu
authored andcommitted
MDEV-14474 information_schema.check_constraints
Implement according to standard SQL specification 2008. The check_constraints table is used for fetching metadata about the constraints defined for tables in all databases.
1 parent 7f73f5e commit d526679

File tree

9 files changed

+334
-1
lines changed

9 files changed

+334
-1
lines changed

mysql-test/main/information_schema.result

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ c
5151
ALL_PLUGINS
5252
APPLICABLE_ROLES
5353
CHARACTER_SETS
54+
CHECK_CONSTRAINTS
5455
CLIENT_STATISTICS
5556
COLLATIONS
5657
COLLATION_CHARACTER_SET_APPLICABILITY
@@ -938,6 +939,7 @@ connection user10261;
938939
SELECT TABLE_NAME, COLUMN_NAME, PRIVILEGES FROM INFORMATION_SCHEMA.COLUMNS
939940
where COLUMN_NAME='TABLE_NAME' and table_name not like 'innodb%';
940941
TABLE_NAME COLUMN_NAME PRIVILEGES
942+
CHECK_CONSTRAINTS TABLE_NAME select
941943
COLUMNS TABLE_NAME select
942944
COLUMN_PRIVILEGES TABLE_NAME select
943945
FILES TABLE_NAME select

mysql-test/main/information_schema_all_engines.result

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Tables_in_information_schema
44
ALL_PLUGINS
55
APPLICABLE_ROLES
66
CHARACTER_SETS
7+
CHECK_CONSTRAINTS
78
CLIENT_STATISTICS
89
COLLATIONS
910
COLLATION_CHARACTER_SET_APPLICABILITY
@@ -83,6 +84,7 @@ table_name column_name
8384
ALL_PLUGINS PLUGIN_NAME
8485
APPLICABLE_ROLES GRANTEE
8586
CHARACTER_SETS CHARACTER_SET_NAME
87+
CHECK_CONSTRAINTS CONSTRAINT_SCHEMA
8688
CLIENT_STATISTICS CLIENT
8789
COLLATIONS COLLATION_NAME
8890
COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME
@@ -162,6 +164,7 @@ table_name column_name
162164
ALL_PLUGINS PLUGIN_NAME
163165
APPLICABLE_ROLES GRANTEE
164166
CHARACTER_SETS CHARACTER_SET_NAME
167+
CHECK_CONSTRAINTS CONSTRAINT_SCHEMA
165168
CLIENT_STATISTICS CLIENT
166169
COLLATIONS COLLATION_NAME
167170
COLLATION_CHARACTER_SET_APPLICABILITY COLLATION_NAME
@@ -247,6 +250,7 @@ table_name group_concat(t.table_schema, '.', t.table_name) num1
247250
ALL_PLUGINS information_schema.ALL_PLUGINS 1
248251
APPLICABLE_ROLES information_schema.APPLICABLE_ROLES 1
249252
CHARACTER_SETS information_schema.CHARACTER_SETS 1
253+
CHECK_CONSTRAINTS information_schema.CHECK_CONSTRAINTS 1
250254
CLIENT_STATISTICS information_schema.CLIENT_STATISTICS 1
251255
COLLATIONS information_schema.COLLATIONS 1
252256
COLLATION_CHARACTER_SET_APPLICABILITY information_schema.COLLATION_CHARACTER_SET_APPLICABILITY 1
@@ -315,6 +319,7 @@ Database: information_schema
315319
| ALL_PLUGINS |
316320
| APPLICABLE_ROLES |
317321
| CHARACTER_SETS |
322+
| CHECK_CONSTRAINTS |
318323
| CLIENT_STATISTICS |
319324
| COLLATIONS |
320325
| COLLATION_CHARACTER_SET_APPLICABILITY |
@@ -384,6 +389,7 @@ Database: INFORMATION_SCHEMA
384389
| ALL_PLUGINS |
385390
| APPLICABLE_ROLES |
386391
| CHARACTER_SETS |
392+
| CHECK_CONSTRAINTS |
387393
| CLIENT_STATISTICS |
388394
| COLLATIONS |
389395
| COLLATION_CHARACTER_SET_APPLICABILITY |
@@ -453,5 +459,5 @@ Wildcard: inf_rmation_schema
453459
| information_schema |
454460
SELECT table_schema, count(*) FROM information_schema.TABLES WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') GROUP BY TABLE_SCHEMA;
455461
table_schema count(*)
456-
information_schema64
462+
information_schema65
457463
mysql 31
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
#
2+
# MDEV-14474: Create INFORMATION_SCHEMA.CHECK_CONSTRAINTS
3+
#
4+
set check_constraint_checks=1;
5+
use test;
6+
create table t0
7+
(
8+
t int, check (t>32) # table constraint
9+
) ENGINE=myisam;
10+
SELECT * from information_schema.check_constraints;
11+
CONSTRAINT_CATALOG def
12+
CONSTRAINT_SCHEMA test
13+
CONSTRAINT_NAME CONSTRAINT_1
14+
TABLE_NAME t0
15+
CHECK_CLAUSE `t` > 32
16+
ALTER TABLE t0
17+
ADD CONSTRAINT CHK_t0_t CHECK(t<100);
18+
SELECT * from information_schema.check_constraints;
19+
CONSTRAINT_CATALOG def
20+
CONSTRAINT_SCHEMA test
21+
CONSTRAINT_NAME CONSTRAINT_1
22+
TABLE_NAME t0
23+
CHECK_CLAUSE `t` > 32
24+
CONSTRAINT_CATALOG def
25+
CONSTRAINT_SCHEMA test
26+
CONSTRAINT_NAME CHK_t0_t
27+
TABLE_NAME t0
28+
CHECK_CLAUSE `t` < 100
29+
ALTER TABLE t0
30+
DROP CONSTRAINT CHK_t0_t;
31+
SELECT * from information_schema.check_constraints;
32+
CONSTRAINT_CATALOG def
33+
CONSTRAINT_SCHEMA test
34+
CONSTRAINT_NAME CONSTRAINT_1
35+
TABLE_NAME t0
36+
CHECK_CLAUSE `t` > 32
37+
CREATE TABLE t1
38+
( t int CHECK(t>2), # field constraint
39+
tt int, CONSTRAINT CHK_tt CHECK(tt<100) # table constraint
40+
) ENGINE=InnoDB;
41+
SELECT * from information_schema.check_constraints;
42+
CONSTRAINT_CATALOG def
43+
CONSTRAINT_SCHEMA test
44+
CONSTRAINT_NAME t
45+
TABLE_NAME t1
46+
CHECK_CLAUSE `t` > 2
47+
CONSTRAINT_CATALOG def
48+
CONSTRAINT_SCHEMA test
49+
CONSTRAINT_NAME CHK_tt
50+
TABLE_NAME t1
51+
CHECK_CLAUSE `tt` < 100
52+
CONSTRAINT_CATALOG def
53+
CONSTRAINT_SCHEMA test
54+
CONSTRAINT_NAME CONSTRAINT_1
55+
TABLE_NAME t0
56+
CHECK_CLAUSE `t` > 32
57+
ALTER TABLE t1
58+
DROP CONSTRAINT CHK_tt;
59+
SELECT * from information_schema.check_constraints;
60+
CONSTRAINT_CATALOG def
61+
CONSTRAINT_SCHEMA test
62+
CONSTRAINT_NAME t
63+
TABLE_NAME t1
64+
CHECK_CLAUSE `t` > 2
65+
CONSTRAINT_CATALOG def
66+
CONSTRAINT_SCHEMA test
67+
CONSTRAINT_NAME CONSTRAINT_1
68+
TABLE_NAME t0
69+
CHECK_CLAUSE `t` > 32
70+
create table t2
71+
(
72+
name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint
73+
start_date DATE,
74+
end_date DATE,
75+
CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint
76+
)ENGINE=Innodb;
77+
SELECT * from information_schema.check_constraints;
78+
CONSTRAINT_CATALOG def
79+
CONSTRAINT_SCHEMA test
80+
CONSTRAINT_NAME name
81+
TABLE_NAME t2
82+
CHECK_CLAUSE char_length(`name`) > 2
83+
CONSTRAINT_CATALOG def
84+
CONSTRAINT_SCHEMA test
85+
CONSTRAINT_NAME CHK_dates
86+
TABLE_NAME t2
87+
CHECK_CLAUSE `start_date` is null
88+
CONSTRAINT_CATALOG def
89+
CONSTRAINT_SCHEMA test
90+
CONSTRAINT_NAME t
91+
TABLE_NAME t1
92+
CHECK_CLAUSE `t` > 2
93+
CONSTRAINT_CATALOG def
94+
CONSTRAINT_SCHEMA test
95+
CONSTRAINT_NAME CONSTRAINT_1
96+
TABLE_NAME t0
97+
CHECK_CLAUSE `t` > 32
98+
ALTER TABLE t1
99+
ADD CONSTRAINT CHK_new_ CHECK(t>tt);
100+
SELECT * from information_schema.check_constraints;
101+
CONSTRAINT_CATALOG def
102+
CONSTRAINT_SCHEMA test
103+
CONSTRAINT_NAME name
104+
TABLE_NAME t2
105+
CHECK_CLAUSE char_length(`name`) > 2
106+
CONSTRAINT_CATALOG def
107+
CONSTRAINT_SCHEMA test
108+
CONSTRAINT_NAME CHK_dates
109+
TABLE_NAME t2
110+
CHECK_CLAUSE `start_date` is null
111+
CONSTRAINT_CATALOG def
112+
CONSTRAINT_SCHEMA test
113+
CONSTRAINT_NAME t
114+
TABLE_NAME t1
115+
CHECK_CLAUSE `t` > 2
116+
CONSTRAINT_CATALOG def
117+
CONSTRAINT_SCHEMA test
118+
CONSTRAINT_NAME CHK_new_
119+
TABLE_NAME t1
120+
CHECK_CLAUSE `t` > `tt`
121+
CONSTRAINT_CATALOG def
122+
CONSTRAINT_SCHEMA test
123+
CONSTRAINT_NAME CONSTRAINT_1
124+
TABLE_NAME t0
125+
CHECK_CLAUSE `t` > 32
126+
create table t3
127+
(
128+
a int,
129+
b int check (b>0), # field constraint named 'b'
130+
CONSTRAINT b check (b>10) # table constraint
131+
) ENGINE=InnoDB;
132+
select * from information_schema.check_constraints;
133+
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_NAME CHECK_CLAUSE
134+
def test b t3 `b` > 0
135+
def test b t3 `b` > 10
136+
def test name t2 char_length(`name`) > 2
137+
def test CHK_dates t2 `start_date` is null
138+
def test t t1 `t` > 2
139+
def test CHK_new_ t1 `t` > `tt`
140+
def test CONSTRAINT_1 t0 `t` > 32
141+
drop table t0;
142+
drop table t1;
143+
drop table t2;
144+
drop table t3;

mysql-test/suite/funcs_1/r/is_columns_is.result

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ def information_schema CHARACTER_SETS CHARACTER_SET_NAME 1 '' NO varchar 32 96 N
2424
def information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME 2 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL
2525
def information_schema CHARACTER_SETS DESCRIPTION 3 '' NO varchar 60 180 NULL NULL NULL utf8 utf8_general_ci varchar(60) select NEVER NULL
2626
def information_schema CHARACTER_SETS MAXLEN 4 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(3) select NEVER NULL
27+
def information_schema CHECK_CONSTRAINTS CHECK_CLAUSE 5 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
28+
def information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL
29+
def information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME 3 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
30+
def information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
31+
def information_schema CHECK_CONSTRAINTS TABLE_NAME 4 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL
2732
def information_schema CLIENT_STATISTICS ACCESS_DENIED 22 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL
2833
def information_schema CLIENT_STATISTICS BINLOG_BYTES_WRITTEN 9 0 NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL
2934
def information_schema CLIENT_STATISTICS BUSY_TIME 5 0 NO double NULL NULL 21 NULL NULL NULL NULL double select NEVER NULL
@@ -557,6 +562,11 @@ COL_CML TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE CHARACTER_MAXIMUM_LENGTH C
557562
3.0000 information_schema CHARACTER_SETS DEFAULT_COLLATE_NAME varchar 32 96 utf8 utf8_general_ci varchar(32)
558563
3.0000 information_schema CHARACTER_SETS DESCRIPTION varchar 60 180 utf8 utf8_general_ci varchar(60)
559564
NULL information_schema CHARACTER_SETS MAXLEN bigint NULL NULL NULL NULL bigint(3)
565+
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512)
566+
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64)
567+
3.0000 information_schema CHECK_CONSTRAINTS CONSTRAINT_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
568+
3.0000 information_schema CHECK_CONSTRAINTS TABLE_NAME varchar 64 192 utf8 utf8_general_ci varchar(64)
569+
3.0000 information_schema CHECK_CONSTRAINTS CHECK_CLAUSE varchar 64 192 utf8 utf8_general_ci varchar(64)
560570
3.0000 information_schema CLIENT_STATISTICS CLIENT varchar 64 192 utf8 utf8_general_ci varchar(64)
561571
NULL information_schema CLIENT_STATISTICS TOTAL_CONNECTIONS bigint NULL NULL NULL NULL bigint(21)
562572
NULL information_schema CLIENT_STATISTICS CONCURRENT_CONNECTIONS bigint NULL NULL NULL NULL bigint(21)

mysql-test/suite/funcs_1/r/is_tables_is.result

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,31 @@ user_comment
8989
Separator -----------------------------------------------------
9090
TABLE_CATALOG def
9191
TABLE_SCHEMA information_schema
92+
TABLE_NAME CHECK_CONSTRAINTS
93+
TABLE_TYPE SYSTEM VIEW
94+
ENGINE MEMORY
95+
VERSION 11
96+
ROW_FORMAT Fixed
97+
TABLE_ROWS #TBLR#
98+
AVG_ROW_LENGTH #ARL#
99+
DATA_LENGTH #DL#
100+
MAX_DATA_LENGTH #MDL#
101+
INDEX_LENGTH #IL#
102+
DATA_FREE #DF#
103+
AUTO_INCREMENT NULL
104+
CREATE_TIME #CRT#
105+
UPDATE_TIME #UT#
106+
CHECK_TIME #CT#
107+
TABLE_COLLATION utf8_general_ci
108+
CHECKSUM NULL
109+
CREATE_OPTIONS #CO#
110+
TABLE_COMMENT #TC#
111+
MAX_INDEX_LENGTH #MIL#
112+
TEMPORARY Y
113+
user_comment
114+
Separator -----------------------------------------------------
115+
TABLE_CATALOG def
116+
TABLE_SCHEMA information_schema
92117
TABLE_NAME CLIENT_STATISTICS
93118
TABLE_TYPE SYSTEM VIEW
94119
ENGINE MEMORY
@@ -1105,6 +1130,31 @@ user_comment
11051130
Separator -----------------------------------------------------
11061131
TABLE_CATALOG def
11071132
TABLE_SCHEMA information_schema
1133+
TABLE_NAME CHECK_CONSTRAINTS
1134+
TABLE_TYPE SYSTEM VIEW
1135+
ENGINE MEMORY
1136+
VERSION 11
1137+
ROW_FORMAT Fixed
1138+
TABLE_ROWS #TBLR#
1139+
AVG_ROW_LENGTH #ARL#
1140+
DATA_LENGTH #DL#
1141+
MAX_DATA_LENGTH #MDL#
1142+
INDEX_LENGTH #IL#
1143+
DATA_FREE #DF#
1144+
AUTO_INCREMENT NULL
1145+
CREATE_TIME #CRT#
1146+
UPDATE_TIME #UT#
1147+
CHECK_TIME #CT#
1148+
TABLE_COLLATION utf8_general_ci
1149+
CHECKSUM NULL
1150+
CREATE_OPTIONS #CO#
1151+
TABLE_COMMENT #TC#
1152+
MAX_INDEX_LENGTH #MIL#
1153+
TEMPORARY Y
1154+
user_comment
1155+
Separator -----------------------------------------------------
1156+
TABLE_CATALOG def
1157+
TABLE_SCHEMA information_schema
11081158
TABLE_NAME CLIENT_STATISTICS
11091159
TABLE_TYPE SYSTEM VIEW
11101160
ENGINE MEMORY
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
--source include/have_innodb.inc
2+
--echo #
3+
--echo # MDEV-14474: Create INFORMATION_SCHEMA.CHECK_CONSTRAINTS
4+
--echo #
5+
6+
set check_constraint_checks=1;
7+
8+
use test;
9+
create table t0
10+
(
11+
t int, check (t>32) # table constraint
12+
) ENGINE=myisam;
13+
14+
--vertical_results
15+
SELECT * from information_schema.check_constraints;
16+
17+
ALTER TABLE t0
18+
ADD CONSTRAINT CHK_t0_t CHECK(t<100);
19+
20+
SELECT * from information_schema.check_constraints;
21+
22+
ALTER TABLE t0
23+
DROP CONSTRAINT CHK_t0_t;
24+
25+
SELECT * from information_schema.check_constraints;
26+
27+
CREATE TABLE t1
28+
( t int CHECK(t>2), # field constraint
29+
tt int, CONSTRAINT CHK_tt CHECK(tt<100) # table constraint
30+
) ENGINE=InnoDB;
31+
32+
SELECT * from information_schema.check_constraints;
33+
34+
ALTER TABLE t1
35+
DROP CONSTRAINT CHK_tt;
36+
37+
SELECT * from information_schema.check_constraints;
38+
39+
create table t2
40+
(
41+
name VARCHAR(30) CHECK(CHAR_LENGTH(name)>2), #field constraint
42+
start_date DATE,
43+
end_date DATE,
44+
CONSTRAINT CHK_dates CHECK(start_date IS NULL) #table constraint
45+
)ENGINE=Innodb;
46+
47+
SELECT * from information_schema.check_constraints;
48+
49+
ALTER TABLE t1
50+
ADD CONSTRAINT CHK_new_ CHECK(t>tt);
51+
52+
SELECT * from information_schema.check_constraints;
53+
54+
55+
# Create table with same field and table check constraint name
56+
create table t3
57+
(
58+
a int,
59+
b int check (b>0), # field constraint named 'b'
60+
CONSTRAINT b check (b>10) # table constraint
61+
) ENGINE=InnoDB;
62+
63+
--horizontal_results
64+
select * from information_schema.check_constraints;
65+
66+
drop table t0;
67+
drop table t1;
68+
drop table t2;
69+
drop table t3;

sql/handler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,7 @@ enum enum_schema_tables
950950
SCH_ALL_PLUGINS,
951951
SCH_APPLICABLE_ROLES,
952952
SCH_CHARSETS,
953+
SCH_CHECK_CONSTRAINTS,
953954
SCH_COLLATIONS,
954955
SCH_COLLATION_CHARACTER_SET_APPLICABILITY,
955956
SCH_COLUMNS,

sql/sql_parse.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2565,6 +2565,7 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
25652565

25662566
case SCH_TABLE_NAMES:
25672567
case SCH_TABLES:
2568+
case SCH_CHECK_CONSTRAINTS:
25682569
case SCH_VIEWS:
25692570
case SCH_TRIGGERS:
25702571
case SCH_EVENTS:

0 commit comments

Comments
 (0)