Changeset: 1f786430bb45 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1f786430bb45
Added Files:
        sql/test/mergetables/Tests/merge-tables-limitations.test
Modified Files:
        sql/storage/store.c
        sql/test/mergetables/Tests/All
Branch: Sep2022
Log Message:

Adding test for adding partition tables created in schema tmp to a merge table 
created in tmp or tst schema.
Also added asserts(res) in store.c after res = find_sql_table(tr, syss, 
"????e_partitions"); to find incorrect calling situations.
These find_sql_table(tr, syss, "????e_partitions") will fail if syss points to 
tmp schema struct instead of sys.
The test script tries to create these situations, see ALTER TABLE t??.mtbl ADD 
TABLE tmp.??tbl statements.


diffs (truncated from 527 to 300 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -565,10 +565,11 @@ load_column(sql_trans *tr, sql_table *t,
 static int
 load_range_partition(sql_trans *tr, sql_schema *syss, sql_part *pt)
 {
-       sql_table *ranges = find_sql_table(tr, syss, "range_partitions");
        oid rid;
        rids *rs;
        sqlstore *store = tr->store;
+       sql_table *ranges = find_sql_table(tr, syss, "range_partitions");
+       assert(ranges);
 
        rs = store->table_api.rids_select(tr, find_sql_column(ranges, 
"table_id"), &pt->member, &pt->member, NULL);
        if ((rid = store->table_api.rids_next(rs)) != oid_nil) {
@@ -593,9 +594,11 @@ static int
 load_value_partition(sql_trans *tr, sql_schema *syss, sql_part *pt)
 {
        sqlstore *store = tr->store;
-       sql_table *values = find_sql_table(tr, syss, "value_partitions");
        list *vals = NULL;
        oid rid;
+       sql_table *values = find_sql_table(tr, syss, "value_partitions");
+       assert(values);
+
        rids *rs = store->table_api.rids_select(tr, find_sql_column(values, 
"table_id"), &pt->member, &pt->member, NULL);
 
        vals = SA_LIST(tr->sa, (fdestroy) &part_value_destroy);
@@ -722,6 +725,8 @@ load_table(sql_trans *tr, sql_schema *s,
        TRC_DEBUG(SQL_STORE, "Load table: %s\n", t->base.name);
 
        sql_table *partitions = find_sql_table(tr, syss, "table_partitions");
+       assert(partitions);
+
        if (rt_parts->cur_row < rt_parts->nr_rows) {
                ntid = *(sqlid*)store->table_api.table_fetch_value(rt_parts, 
find_sql_column(partitions, "table_id"));
                if (ntid == tid) {
@@ -1248,6 +1253,15 @@ load_trans(sql_trans* tr)
        bool ok = true;
 
        TRC_DEBUG(SQL_STORE, "Load transaction\n");
+       assert(sysschema);
+       assert(systables);
+       assert(sysparts);
+       assert(syscols);
+       assert(sysidx);
+       assert(syskeys);
+       assert(systriggers);
+       assert(sysobjects);
+       assert(sysschema_ids);
 
        res_table *rt_schemas = store->table_api.table_orderby(tr, sysschema, 
NULL, NULL, NULL, NULL, sysschema_ids, NULL);
        res_table *rt_tables = store->table_api.table_orderby(tr, systables, 
NULL, NULL, NULL, NULL,
@@ -4529,11 +4543,13 @@ sys_drop_part(sql_trans *tr, sql_part *p
                return res;
        if (isRangePartitionTable(mt)) {
                sql_table *ranges = find_sql_table(tr, syss, 
"range_partitions");
+               assert(ranges);
                oid rid = store->table_api.column_find_row(tr, 
find_sql_column(ranges, "table_id"), &pt->member, NULL);
                if ((res = store->table_api.table_delete(tr, ranges, rid)))
                        return res;
        } else if (isListPartitionTable(mt)) {
                sql_table *values = find_sql_table(tr, syss, 
"value_partitions");
+               assert(values);
                rids *rs = store->table_api.rids_select(tr, 
find_sql_column(values, "table_id"), &pt->member, &pt->member, NULL);
                for (oid rid = store->table_api.rids_next(rs); 
!is_oid_nil(rid); rid = store->table_api.rids_next(rs)) {
                        if ((res = store->table_api.table_delete(tr, values, 
rid))) {
@@ -4615,7 +4631,9 @@ sys_drop_table(sql_trans *tr, sql_table 
 
        if (isRangePartitionTable(t) || isListPartitionTable(t)) {
                sql_table *partitions = find_sql_table(tr, syss, 
"table_partitions");
+               assert(partitions);
                sql_column *pcols = find_sql_column(partitions, "table_id");
+               assert(pcols);
                rids *rs = store->table_api.rids_select(tr, pcols, &t->base.id, 
&t->base.id, NULL);
                oid poid;
                if ((poid = store->table_api.rids_next(rs)) != oid_nil) {
@@ -5288,6 +5306,10 @@ sql_trans_add_range_partition(sql_trans 
        ptr ok;
        sql_table *dup = NULL;
 
+       assert(sysobj);
+       assert(partitions);
+       assert(ranges);
+
        vmin = vmax = (ValRecord) {.vtype = TYPE_void,};
 
        if ((res = new_table(tr, mt, &dup)))
@@ -5423,6 +5445,10 @@ sql_trans_add_value_partition(sql_trans 
        int localtype = tpe.type->localtype, i = 0, res = LOG_OK;
        sql_table *dup = NULL;
 
+       assert(sysobj);
+       assert(partitions);
+       assert(values);
+
        if ((res = new_table(tr, mt, &dup)))
                return res;
        mt = dup;
@@ -5691,6 +5717,7 @@ sql_trans_set_partition_table(sql_trans 
        if (t && (isRangePartitionTable(t) || isListPartitionTable(t))) {
                sql_schema *syss = find_sql_schema(tr, isGlobal(t)?"sys":"tmp");
                sql_table *partitions = find_sql_table(tr, syss, 
"table_partitions");
+               assert(partitions);
                sqlid next = next_oid(tr->store);
                if (isPartitionedByColumnTable(t)) {
                        assert(t->part.pcol);
@@ -5730,7 +5757,7 @@ create_sql_ukey(sqlstore *store, sql_all
        sql_ukey *tk;
 
        nk = (kt != fkey) ? (sql_key *) SA_ZNEW(sa, sql_ukey) : (sql_key *) 
SA_ZNEW(sa, sql_fkey);
-       tk = (sql_ukey *) nk;
+       tk = (sql_ukey *) nk;
        assert(name);
 
        base_init(sa, &nk->base, next_oid(store), true, name);
diff --git a/sql/test/mergetables/Tests/All b/sql/test/mergetables/Tests/All
--- a/sql/test/mergetables/Tests/All
+++ b/sql/test/mergetables/Tests/All
@@ -34,3 +34,4 @@ concurrent_merge_tables
 
 mergetabledependencies
 replicatabledependencies
+merge-tables-limitations
diff --git a/sql/test/mergetables/Tests/merge-tables-limitations.test 
b/sql/test/mergetables/Tests/merge-tables-limitations.test
new file mode 100644
--- /dev/null
+++ b/sql/test/mergetables/Tests/merge-tables-limitations.test
@@ -0,0 +1,397 @@
+-- This script test creation of merge tables in schemas tmp and tst,
+-- and creation of other (replica, remote, unlogged, view) tables in schemas 
tmp and tst,
+-- and adding them as partitions to the created merge tables in schemas tmp 
and tst.
+-- Many of them should generate an error as it is not allowed. This is tested 
also.
+
+statement ok
+CREATE SCHEMA tst
+
+statement ok
+SET SCHEMA tst
+
+statement ok
+CREATE VIEW tst.my_tables as
+ select (select name from sys.schemas s where s.id = t.schema_id) as schema, 
name, query, type, system, commit_action, access, temporary from tables t where 
not system
+
+statement error 42000!CREATE TABLE: cannot create persistent table 'tbl' in 
the schema 'tmp'
+CREATE TABLE tmp.tbl (c1 int)
+
+statement ok
+CREATE MERGE TABLE tmp.mtbl (c1 int)
+-- this succeeds strangely
+
+query TTTIIIII nosort
+select * from tst.my_tables where name = 'mtbl'
+----
+tmp
+mtbl
+NULL
+3
+0
+0
+0
+0
+
+statement error 42000!MERGE or REPLICA TABLE should have at least one table 
associated
+select * from tmp.mtbl
+----
+
+statement error 42S02!ALTER TABLE: can't alter temporary table 'mtbl'
+ALTER TABLE tmp.mtbl ADD TABLE tmp.mtbl
+
+statement ok
+CREATE MERGE TABLE tst.mtbl (c1 int)
+
+query TTTIIIII nosort
+select * from tst.my_tables where name = 'mtbl'
+----
+tmp
+mtbl
+NULL
+3
+0
+0
+0
+0
+tst
+mtbl
+NULL
+3
+0
+0
+0
+0
+
+statement error 42000!MERGE or REPLICA TABLE should have at least one table 
associated
+select * from tst.mtbl
+----
+
+statement error 42000!ALTER TABLE: can't add/drop a temporary table into a 
MERGE TABLE
+ALTER TABLE tst.mtbl ADD TABLE tmp.mtbl
+
+statement error 42000!ALTER TABLE: a MERGE TABLE can't be a child of itself
+ALTER TABLE tst.mtbl ADD TABLE tst.mtbl
+
+
+statement ok
+CREATE REPLICA TABLE tmp.rtbl (c1 int)
+-- this succeeds strangely
+
+query TTTIIIII nosort
+select * from tst.my_tables where name = 'rtbl'
+----
+tmp
+rtbl
+NULL
+6
+0
+0
+0
+0
+
+statement error 42000!MERGE or REPLICA TABLE should have at least one table 
associated
+select * from tmp.rtbl
+----
+
+statement error 42S02!ALTER TABLE: can't alter temporary table 'mtbl'
+ALTER TABLE tmp.mtbl ADD TABLE tmp.rtbl
+
+statement error 42000!ALTER TABLE: can't add/drop a temporary table into a 
MERGE TABLE
+ALTER TABLE tst.mtbl ADD TABLE tmp.rtbl
+
+statement ok
+CREATE REPLICA TABLE tst.rtbl (c1 int)
+
+query TTTIIIII nosort
+select * from tst.my_tables where name = 'rtbl'
+----
+tmp
+rtbl
+NULL
+6
+0
+0
+0
+0
+tst
+rtbl
+NULL
+6
+0
+0
+0
+0
+
+statement error 42000!MERGE or REPLICA TABLE should have at least one table 
associated
+select * from tst.rtbl
+----
+
+statement ok
+ALTER TABLE tst.mtbl ADD TABLE tst.rtbl
+
+statement error 42000!The REPLICA TABLE 'tst.rtbl' should have at least one 
table associated
+select * from tst.mtbl
+----
+
+statement ok
+ALTER TABLE tst.mtbl DROP TABLE tst.rtbl
+
+
+statement ok
+CREATE UNLOGGED TABLE tmp.utbl (c1 int)
+-- this succeeds strangely
+
+query TTTIIIII nosort
+select * from tst.my_tables where name = 'utbl'
+----
+tmp
+utbl
+NULL
+7
+0
+0
+0
+0
+
+query I nosort
+select * from tmp.utbl
+----
+
+statement error 42S02!ALTER TABLE: can't alter temporary table 'mtbl'
+ALTER TABLE tmp.mtbl ADD TABLE tmp.utbl
+
+statement error 42000!ALTER TABLE: can't add/drop a temporary table into a 
MERGE TABLE
+ALTER TABLE tst.mtbl ADD TABLE tmp.utbl
+
+statement ok
+CREATE UNLOGGED TABLE tst.utbl (c1 int)
+
+query TTTIIIII nosort
+select * from tst.my_tables where name = 'utbl'
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to