Changeset: cdb427549a87 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cdb427549a87
Added Files:
        
sql/test/BugTracker-2025/Tests/7670-missing-table-compatibility-checks.test
Modified Files:
        sql/server/rel_schema.c
        sql/test/BugTracker-2025/Tests/7674-rel_find_designated_index_crash.test
        sql/test/BugTracker-2025/Tests/All
Branch: Mar2025
Log Message:

added missing table compatibility checks
fixes issue #7670


diffs (82 lines):

diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -2028,22 +2028,31 @@ sql_alter_table(sql_query *query, dlist 
 
                if (!(pt = find_table_or_view_on_scope(sql, t->s, nsname, 
ntname, "ALTER TABLE", false)))
                        return NULL;
+               const char *errt = TABLE_TYPE_DESCRIPTION(t->type, 
t->properties);
+               const char *errpt = TABLE_TYPE_DESCRIPTION(pt->type, 
pt->properties);
                if (isView(pt))
-                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a view into a %s",
-                                                       
TABLE_TYPE_DESCRIPTION(t->type, t->properties));
+                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a view into a %s", errt);
                if (isDeclaredTable(pt))
-                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a declared table into a %s",
-                                                       
TABLE_TYPE_DESCRIPTION(t->type, t->properties));
+                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a declared table into a %s", errt);
                if (isTempSchema(pt->s))
-                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a temporary table into a %s",
-                                                       
TABLE_TYPE_DESCRIPTION(t->type, t->properties));
+                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a temporary table into a %s", errt);
                if (isReplicaTable(t) && isMergeTable(pt))
-                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a %s table into a %s",
-                                                       
TABLE_TYPE_DESCRIPTION(pt->type, pt->properties), 
TABLE_TYPE_DESCRIPTION(t->type, t->properties));
+                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a %s table into a %s", errpt, errt);
                nsname = pt->s->base.name;
                if (strcmp(sname, nsname) != 0)
-                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
all children tables of '%s.%s' must be part of schema '%s'",
-                                               sname, tname, sname);
+                       return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
all children tables of '%s.%s' must be part of schema '%s'", sname, tname, 
sname);
+
+               if (ol_length(t->columns) != ol_length(pt->columns))
+                       return sql_error(sql, 02, SQLSTATE(3F000) "ALTER %s: to 
be added table doesn't match %s definition", errt, errt);
+               for (node *n = ol_first_node(t->columns), *m = 
ol_first_node(pt->columns); n && m; n = n->next, m = m->next) {
+                       sql_column *nc = n->data;
+                       sql_column *mc = m->data;
+
+                       if (subtype_cmp(&nc->type, &mc->type) != 0)
+                       return sql_error(sql, 02, SQLSTATE(3F000) "ALTER %s: to 
be added table column type doesn't match %s definition", errt, errt);
+                       if (nc->null != mc->null)
+                               return sql_error(sql, 02, SQLSTATE(3F000) 
"ALTER %s: to be added table column NULL check doesn't match %s definition", 
errt, errt);
+               }
 
                if (te->token == SQL_TABLE) {
                        symbol *extra = dl->h->next->next->next->data.sym;
diff --git 
a/sql/test/BugTracker-2025/Tests/7670-missing-table-compatibility-checks.test 
b/sql/test/BugTracker-2025/Tests/7670-missing-table-compatibility-checks.test
new file mode 100644
--- /dev/null
+++ 
b/sql/test/BugTracker-2025/Tests/7670-missing-table-compatibility-checks.test
@@ -0,0 +1,8 @@
+statement ok
+CREATE TABLE table1 (column1 STRING, column2 INT)
+
+statement ok
+CREATE MERGE TABLE table2 (column3 INT, column4 VARCHAR(100)) PARTITION BY 
VALUES USING (UPPER(column4))
+
+statement error 3F000!ALTER LIST PARTITION TABLE: to be added table column 
type doesn't match LIST PARTITION TABLE definition
+ALTER TABLE table2 SET TABLE table1 AS PARTITION IN (4, 5, 6)
diff --git 
a/sql/test/BugTracker-2025/Tests/7674-rel_find_designated_index_crash.test 
b/sql/test/BugTracker-2025/Tests/7674-rel_find_designated_index_crash.test
--- a/sql/test/BugTracker-2025/Tests/7674-rel_find_designated_index_crash.test
+++ b/sql/test/BugTracker-2025/Tests/7674-rel_find_designated_index_crash.test
@@ -13,8 +13,7 @@ ALTER TABLE table1 SET SCHEMA schema1
 statement error 42000!syntax error, unexpected IDENT, expecting INSERT or READ 
or SCHEMA or TABLE in: "alter table table1 set access"
 ALTER TABLE table1 SET ACCESS READ ONLY
 
-skipif knownfail
-statement ok
+statement error 42S12!COMMENT ON: no such index 'index1'
 COMMENT ON INDEX index1 IS 'Index created for analytical queries'
 
 statement error 42S02!ALTER TABLE: no such table 'table1'
diff --git a/sql/test/BugTracker-2025/Tests/All 
b/sql/test/BugTracker-2025/Tests/All
--- a/sql/test/BugTracker-2025/Tests/All
+++ b/sql/test/BugTracker-2025/Tests/All
@@ -25,6 +25,7 @@ 7661_trigger_crash
 7662-drop-role-user
 7663-alter-user-role
 7664-session-user
+7670-missing-table-compatibility-checks
 7671-lag-over-empty-bat
 7674-rel_find_designated_index_crash
 7680-union-all
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to