[Commits] 3c422e60bbe: MDEV-11115 CHECK constraints are not shown in I_S.TABLE_CONSTRAINTS

jacob.mathew at mariadb.com jacob.mathew at mariadb.com
Wed Mar 29 22:45:04 EEST 2017


revision-id: 3c422e60bbee79bb636e65910c26ac193de70a84 (mariadb-10.2.4-102-g3c422e60bbe)
parent(s): 4ebdef2bcd28b641dc49aaef4a8c387442ae06dc
author: Jacob Mathew
committer: Jacob Mathew
timestamp: 2017-03-29 12:07:33 -0700
message:

MDEV-11115 CHECK constraints are not shown in I_S.TABLE_CONSTRAINTS

Added CHECK constraints to I_S.TABLE_CONSTRAINTS.
Fixed a bug regarding virtual column definitions whose name is the field name.
Added test case: check_constraint_show

---
 mysql-test/r/check_constraint_show.result | 17 +++++++++++++++++
 mysql-test/t/check_constraint_show.test   |  8 ++++++++
 sql/sql_show.cc                           | 13 +++++++++++++
 sql/table.cc                              |  4 ++++
 4 files changed, 42 insertions(+)

diff --git a/mysql-test/r/check_constraint_show.result b/mysql-test/r/check_constraint_show.result
new file mode 100644
index 00000000000..def1c488758
--- /dev/null
+++ b/mysql-test/r/check_constraint_show.result
@@ -0,0 +1,17 @@
+create or replace table t1( c1 int check( c1 > 0 ), c2 int check( c2 > 0 ), c3 int, constraint `range`  check( ( c3 >= c1 ) and ( c3 <= c2 ) ), primary key( c1 ) );
+show create table t1;
+Table	Create Table
+t1	CREATE TABLE `t1` (
+  `c1` int(11) NOT NULL CHECK (`c1` > 0),
+  `c2` int(11) DEFAULT NULL CHECK (`c2` > 0),
+  `c3` int(11) DEFAULT NULL,
+  PRIMARY KEY (`c1`),
+  CONSTRAINT `range` CHECK (`c3` >= `c1` and `c3` <= `c2`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+select * from information_schema.table_constraints where table_name = 't1';
+CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_TYPE
+def	test	PRIMARY	test	t1	PRIMARY KEY
+def	test	c1	test	t1	CHECK
+def	test	c2	test	t1	CHECK
+def	test	range	test	t1	CHECK
+drop table t1;
diff --git a/mysql-test/t/check_constraint_show.test b/mysql-test/t/check_constraint_show.test
new file mode 100644
index 00000000000..4d57f247b5b
--- /dev/null
+++ b/mysql-test/t/check_constraint_show.test
@@ -0,0 +1,8 @@
+# Table with 2 column-level check constraints and 1 table-level check constraint
+create or replace table t1( c1 int check( c1 > 0 ), c2 int check( c2 > 0 ), c3 int, constraint `range`  check( ( c3 >= c1 ) and ( c3 <= c2 ) ), primary key( c1 ) );
+show create table t1;
+
+# Show all constraints, including check constraints
+select * from information_schema.table_constraints where table_name = 't1';
+
+drop table t1;
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index c45e27a2794..adba7ab4d33 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -6386,6 +6386,19 @@ static int get_schema_constraints_record(THD *thd, TABLE_LIST *tables,
       }
     }
 
+    // Table check constraints
+    for ( uint i = 0; i < show_table->s->table_check_constraints; i++ )
+    {
+        Virtual_column_info *check = show_table->check_constraints[ i ];
+
+        if ( store_constraints( thd, table, db_name, table_name, check->name.str,
+                                check->name.length,
+                                STRING_WITH_LEN( "CHECK" ) ) )
+        {
+            DBUG_RETURN( 1 );
+        }
+    }
+
     show_table->file->get_foreign_key_list(thd, &f_key_list);
     FOREIGN_KEY_INFO *f_key_info;
     List_iterator_fast<FOREIGN_KEY_INFO> it(f_key_list);
diff --git a/sql/table.cc b/sql/table.cc
index 3a08d1e49ea..6b15c06cb91 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1987,6 +1987,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
     if (vcol_info)
     {
       vcol_info->name.str= const_cast<char*>(reg_field->field_name);
+      vcol_info->name.length = strlen(reg_field->field_name);
       if (mysql57_null_bits && !vcol_info->stored_in_db)
       {
         /* MySQL 5.7 has null bits last */
@@ -2374,7 +2375,10 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
         vcol_info->name.str= strmake_root(&share->mem_root,
                                           (char*)vcol_screen_pos, name_length);
       else
+      {
         vcol_info->name.str= const_cast<char*>(reg_field->field_name);
+        vcol_info->name.length = strlen(reg_field->field_name);
+      }
       vcol_screen_pos+= name_length + expr_length;
 
       switch (type) {


More information about the commits mailing list