Changeset: 07d8966a20ad for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/07d8966a20ad
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/mergetables/Tests/addtable.test
        sql/test/mergetables/Tests/alter.test
        sql/test/mergetables/Tests/crash0.test
        sql/test/mergetables/Tests/doubletable.test
        sql/test/mergetables/Tests/emptymergequery.test
        sql/test/mergetables/Tests/forex.test
        sql/test/mergetables/Tests/mergedb_create.test
        sql/test/mergetables/Tests/mergedrop.test
        sql/test/mergetables/Tests/mergedrop1.test
        sql/test/mergetables/Tests/mergedropcascade.test
        sql/test/mergetables/Tests/mergedropcrash.test
        sql/test/mergetables/Tests/mergeinit.test
        sql/test/mergetables/Tests/mergekey.test
        sql/test/mergetables/Tests/mergeload.test
        sql/test/mergetables/Tests/mergeloadidx.test
        sql/test/mergetables/Tests/mergemergeload.test
        sql/test/mergetables/Tests/mergequery.test
        sql/test/mergetables/Tests/part-elim.test
        sql/test/mergetables/Tests/sqlsmith-exists.test
        sql/test/mergetables/Tests/sqlsmith-exists2.test
        sql/test/mergetables/Tests/types.test
Branch: Jul2021
Log Message:

While converting mergetable tests error messages I found out privileges and 
number of child tables from nested merge tables were not checked


diffs (truncated from 860 to 300 lines):

diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -19,6 +19,7 @@
 #include "rel_rewriter.h"
 #include "rel_remote.h"
 #include "sql_mvc.h"
+#include "sql_privileges.h"
 #include "gdk_time.h"
 
 typedef struct global_props {
@@ -8978,16 +8979,21 @@ rel_merge_table_rewrite(visitor *v, sql_
                                        for (node *nt = t->members->h; nt; nt = 
nt->next) {
                                                sql_part *pd = nt->data;
                                                sql_table *pt = 
find_sql_table_id(v->sql->session->tr, t->s, pd->member);
-                                               sql_rel *prel = 
rel_basetable(v->sql, pt, tname), *bt = NULL;
-                                               int skip = 0;
+                                               sql_rel *prel = NULL, *bt = 
NULL;
+                                               int skip = 0, allowed = 1;
                                                list *exps = NULL;
                                                sqlstore *store = 
v->sql->session->tr->store;
 
+                                               /* At the moment we throw an 
error in the optimizer, but later this rewriter should move out from the 
optimizers */
+                                               if ((isMergeTable(pt) || 
isReplicaTable(pt)) && list_empty(pt->members))
+                                                       return 
sql_error(v->sql, 02, SQLSTATE(42000) "The %s '%s.%s' should have at least one 
table associated",
+                                                                               
         TABLE_TYPE_DESCRIPTION(pt->type, pt->properties), pt->s->base.name, 
pt->base.name);
                                                /* Do not include empty 
partitions */
                                                if (pt && isTable(pt) && 
pt->access == TABLE_READONLY && 
!store->storage_api.count_col(v->sql->session->tr, 
ol_first_node(pt->columns)->data, 0))
                                                        continue;
-
-                                               prel = rel_rename_part(v->sql, 
prel, rel, tname, t);
+                                               prel = rel_rename_part(v->sql, 
rel_basetable(v->sql, pt, tname), rel, tname, t);
+                                               if (!table_privs(v->sql, pt, 
PRIV_SELECT)) /* Test for privileges */
+                                                       allowed = 0;
 
                                                exps = sa_list(v->sql->sa);
                                                for (node *n = rel->exps->h; n 
&& !skip; n = n->next) { /* for each column of the child table */
@@ -8997,8 +9003,12 @@ rel_merge_table_rewrite(visitor *v, sql_
                                                        bool first_attempt = 
true;
                                                        atom *cmin = NULL, 
*cmax = NULL, *rmin = NULL, *rmax = NULL;
                                                        list *inlist = NULL;
+                                                       char *cname = e->r;
 
                                                        assert(e && e->type == 
e_column);
+                                                       if (!allowed && 
cname[0] != '%' && !column_privs(v->sql, mvc_bind_column(v->sql, pt, cname), 
PRIV_SELECT))
+                                                               return 
sql_error(v->sql, 02, SQLSTATE(42000) "The user %s SELECT permissions on table 
'%s.%s' don't match %s '%s.%s'", get_string_global_var(v->sql, "current_user"),
+                                                                               
                 pt->s->base.name, pt->base.name, 
TABLE_TYPE_DESCRIPTION(t->type, t->properties), t->s->base.name, t->base.name);
                                                        if (cols && sel && 
ATOMlinear(exp_subtype(e)->type->localtype))
                                                                for (node *nn = 
cols->h ; nn && !skip; nn = nn->next) { /* test if it passes all predicates 
around it */
                                                                        if 
(nn->data == e) {
@@ -9008,7 +9018,7 @@ rel_merge_table_rewrite(visitor *v, sql_
                                                                                
        list *values = next->values;
 
                                                                                
        if (!col) /* first predicate around the column */
-                                                                               
                col = name_find_column(prel, e->l, e->r, -2, &bt);
+                                                                               
                col = name_find_column(prel, e->l, cname, -2, &bt);
 
                                                                                
        /* I don't handle cmp_in or cmp_notin cases with anti or null semantics 
yet */
                                                                                
        if (next->flag == cmp_in && (next->anti || next->semantics))
@@ -9241,9 +9251,9 @@ rel_merge_table_rewrite(visitor *v, sql_
                                                                        i++;
                                                                }
                                                        if (!skip) {
-                                                               sql_exp *ne = 
exps_bind_column2(prel->exps, e->l, e->r, NULL);
+                                                               sql_exp *ne = 
exps_bind_column2(prel->exps, e->l, cname, NULL);
                                                                assert(ne);
-                                                               
exp_setname(v->sql->sa, ne, e->l, e->r);
+                                                               
exp_setname(v->sql->sa, ne, e->l, cname);
                                                                append(exps, 
ne);
                                                        }
                                                }
diff --git a/sql/test/mergetables/Tests/addtable.test 
b/sql/test/mergetables/Tests/addtable.test
--- a/sql/test/mergetables/Tests/addtable.test
+++ b/sql/test/mergetables/Tests/addtable.test
@@ -1,16 +1,16 @@
 statement ok
 create table tmp1(i int)
 
-statement ok
+statement ok rowcount 1
 insert into tmp1 values(1)
 
 statement ok
 create table tmp2(i int)
 
-statement ok
+statement ok rowcount 1
 insert into tmp2 values(2)
 
-statement error
+statement error 42S02!ALTER TABLE: cannot add table 'sys.tmp2' to TABLE 
'sys.tmp1'
 alter table tmp1 add table tmp2
 
 query I rowsort
diff --git a/sql/test/mergetables/Tests/alter.test 
b/sql/test/mergetables/Tests/alter.test
--- a/sql/test/mergetables/Tests/alter.test
+++ b/sql/test/mergetables/Tests/alter.test
@@ -1,7 +1,7 @@
 statement ok
 create merge table smalltable(i integer, j integer)
 
-statement error
+statement error 42S02!ALTER TABLE: no such table 'unknowntable'
 alter table smalltable add table unknowntable
 
 statement ok
@@ -19,16 +19,16 @@ create merge table mys.smalltable(i inte
 statement ok
 create table mys.part (i integer, j integer)
 
-statement ok
+statement ok rowcount 1
 insert into mys.part values(1,2)
 
-statement error
+statement error 42S02!ALTER TABLE: no such table 'part1'
 alter table mys.smalltable add table part1
 
-statement error
+statement error 42S02!ALTER TABLE: no such table 'mys'.'part1'
 alter table mys.smalltable add table mys.part1
 
-statement error
+statement error 42000!MERGE or REPLICA TABLE should have at least one table 
associated
 select * from mys.smalltable
 
 statement ok
diff --git a/sql/test/mergetables/Tests/crash0.test 
b/sql/test/mergetables/Tests/crash0.test
--- a/sql/test/mergetables/Tests/crash0.test
+++ b/sql/test/mergetables/Tests/crash0.test
@@ -4,24 +4,24 @@ START TRANSACTION
 statement ok
 CREATE TABLE cpart1 ( x double, y double, z double)
 
-statement ok
+statement ok rowcount 4
 COPY 4 RECORDS INTO cpart1 FROM stdin USING DELIMITERS ' ',E'\n'
 <COPY_INTO_DATA>
 0.0 0.0 0.0
-1.0 0.0 0.0
-0.0 1.0 0.0
-1.0 1.0 0.0
+1.0 0.0 0.0 
+0.0 1.0 0.0 
+1.0 1.0 0.0 
 
 statement ok
 CREATE TABLE cpart2 ( x double, y double, z double)
 
-statement ok
+statement ok rowcount 4
 COPY 4 RECORDS INTO cpart2 FROM stdin USING DELIMITERS ' ',E'\n'
 <COPY_INTO_DATA>
 2.0 0.0 0.0
-3.0 0.0 0.0
-2.0 1.0 0.0
-3.0 1.0 0.0
+3.0 0.0 0.0 
+2.0 1.0 0.0 
+3.0 1.0 0.0 
 
 statement ok
 CREATE MERGE TABLE complete ( x double, y double, z double)
@@ -32,7 +32,7 @@ ALTER TABLE complete ADD TABLE cpart1
 statement ok
 ALTER TABLE complete ADD TABLE cpart2
 
-statement error
+statement error 42S02!ALTER TABLE: read only MERGE TABLES are not supported
 ALTER TABLE complete SET READ ONLY
 
 statement ok
diff --git a/sql/test/mergetables/Tests/doubletable.test 
b/sql/test/mergetables/Tests/doubletable.test
--- a/sql/test/mergetables/Tests/doubletable.test
+++ b/sql/test/mergetables/Tests/doubletable.test
@@ -13,10 +13,10 @@ ALTER TABLE complete ADD TABLE part1
 statement ok
 ALTER TABLE complete ADD TABLE part2
 
-statement error
+statement error 42S02!ALTER TABLE: table 'sys.part1' is already part of MERGE 
TABLE 'sys.complete'
 ALTER TABLE complete ADD TABLE part1
 
-statement error
+statement error 42S02!ALTER TABLE: table 'sys.part2' is already part of MERGE 
TABLE 'sys.complete'
 ALTER TABLE complete ADD TABLE part2
 
 statement ok
diff --git a/sql/test/mergetables/Tests/emptymergequery.test 
b/sql/test/mergetables/Tests/emptymergequery.test
--- a/sql/test/mergetables/Tests/emptymergequery.test
+++ b/sql/test/mergetables/Tests/emptymergequery.test
@@ -1,7 +1,7 @@
 statement ok
 create merge table emptym(i integer, j integer)
 
-statement error
+statement error 42000!MERGE or REPLICA TABLE should have at least one table 
associated
 select * from emptym
 
 statement ok
diff --git a/sql/test/mergetables/Tests/forex.test 
b/sql/test/mergetables/Tests/forex.test
--- a/sql/test/mergetables/Tests/forex.test
+++ b/sql/test/mergetables/Tests/forex.test
@@ -4,7 +4,7 @@ CREATE TABLE day1 ( clk timestamp, curre
 statement ok
 CREATE TABLE day1stage ( clk bigint, currency string, ts bigint, bid 
decimal(12,6), offer decimal(12,6), spread decimal(12,6) )
 
-statement ok
+statement ok rowcount 10
 COPY 10 RECORDS INTO day1stage FROM STDIN USING DELIMITERS '|',E'\n'
 <COPY_INTO_DATA>
 1413267171000|EUR/USD|1413267158643|1.271810|1.271890|0.000080
@@ -82,7 +82,7 @@ 107.121
 107.127
 0.006
 
-statement ok
+statement ok rowcount 10
 INSERT INTO day1
 SELECT epoch(clk), currency, epoch(ts), bid, offer,spread
 FROM day1stage
@@ -163,7 +163,7 @@ CREATE TABLE day2 ( clk timestamp, curre
 statement ok
 CREATE TABLE day2stage ( clk bigint, currency string, ts bigint, bid 
decimal(12,6), offer decimal(12,6), spread decimal(12,6) )
 
-statement ok
+statement ok rowcount 10
 COPY 10 RECORDS INTO day2stage FROM STDIN USING DELIMITERS '|',E'\n'
 <COPY_INTO_DATA>
 1413267176000|EUR/USD|1413267177168|1.271780|1.271880|0.000100
@@ -177,7 +177,7 @@ 1413267176000|USD/CAD|1413267173063|1.12
 1413267176000|AUD/USD|1413267176076|0.878680|0.878760|0.000080
 1413267176000|GBP/JPY|1413267176950|172.122000|172.142000|0.020000
 
-statement ok
+statement ok rowcount 10
 INSERT INTO day2
 SELECT epoch(clk), currency, epoch(ts), bid, offer,spread
 FROM day2stage
@@ -255,34 +255,34 @@ ALTER TABLE day2 SET READ ONLY
 statement ok
 CREATE TABLE day3 ( clk timestamp, currency string, ts timestamp, bid 
decimal(12,6), offer decimal(12,6), spread decimal(12,6) )
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'EUR/USD', 
epoch(1413267182327), 1.271910, 1.271990, 0.000080)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'USD/JPY', 
epoch(1413267181647), 107.114000,107.121000,0.007000)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'GBP/USD', 
epoch(1413267182048), 1.606870, 1.606980, 0.000110)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'EUR/GBP', 
epoch(1413267181968), 0.791490, 0.791600, 0.000110)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'USD/CHF', 
epoch(1413267182041), 0.950350, 0.950460, 0.000110)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'EUR/JPY', 
epoch(1413267182406), 136.241000,136.253000,0.012000)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'EUR/CHF', 
epoch(1413267181950), 1.208770, 1.208950, 0.000180)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'USD/CAD', 
epoch(1413267181830), 1.121120, 1.121230, 0.000110)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'AUD/USD', 
epoch(1413267181549), 0.878730, 0.878810, 0.000080)
 
-statement ok
+statement ok rowcount 1
 INSERT INTO day3 VALUES( epoch(1413267181000), 'GBP/JPY', 
epoch(1413267181618), 172.116000,172.138000,0.022000)
 
 query TTTRRR rowsort
diff --git a/sql/test/mergetables/Tests/mergedb_create.test 
b/sql/test/mergetables/Tests/mergedb_create.test
--- a/sql/test/mergetables/Tests/mergedb_create.test
+++ b/sql/test/mergetables/Tests/mergedb_create.test
@@ -4,35 +4,35 @@ START TRANSACTION
 statement ok
 CREATE TABLE R1 ( x integer primary key, y integer, z string)
 
-statement ok
+statement ok rowcount 4
 COPY 4 RECORDS INTO R1 FROM stdin USING DELIMITERS ' ',E'\n'
 <COPY_INTO_DATA>
 0 0 hello
 1 0 hello
-2 1 world
-3 1 world
+2 1 world 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to