Changeset: 8b1ec26e6da7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8b1ec26e6da7
Modified Files:
        sql/storage/store.c
Branch: default
Log Message:

Merge with Sep2022 branch.


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,
@@ -4524,11 +4538,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))) {
@@ -4610,7 +4626,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) {
@@ -5283,6 +5301,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)))
@@ -5418,6 +5440,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;
@@ -5686,6 +5712,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);
@@ -5725,7 +5752,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