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