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]