Changeset: ff40ce536e95 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ff40ce536e95
Modified Files:
sql/server/rel_basetable.c
sql/server/rel_basetable.h
sql/server/rel_dump.c
sql/server/rel_psm.c
sql/server/rel_rel.c
sql/server/rel_updates.c
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
sql/test/SQLancer/Tests/sqlancer15.test
Branch: Jul2021
Log Message:
Make TID usage more restrict. This fixes SQLancer issue
diffs (230 lines):
diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -16,6 +16,7 @@
#define USED_LEN(nr) ((nr+31)/32)
#define rel_base_set_used(b,nr) b->used[(nr)/32] |= (1<<((nr)%32))
+#define rel_base_set_not_used(b,nr) b->used[(nr)/32] &= ~(1<<((nr)%32))
#define rel_base_is_used(b,nr) ((b->used[(nr)/32]&(1<<((nr)%32))) != 0)
typedef struct rel_base_t {
@@ -74,7 +75,7 @@ rel_base_use_tid( mvc *sql, sql_rel *rt)
}
void
-rel_base_use_all( mvc *sql, sql_rel *rel)
+rel_base_use_all( mvc *sql, sql_rel *rel, int with_tid)
{
sql_table *t = rel->l;
rel_base_t *ba = rel->r;
@@ -91,6 +92,8 @@ rel_base_use_all( mvc *sql, sql_rel *rel
int len = USED_LEN(ol_length(t->columns) + 1 +
ol_length(t->idxs));
for (int i = 0; i < len; i++)
ba->used[i] = ~0;
+ if (!with_tid)
+ rel_base_set_not_used(ba, ol_length(t->columns));
}
}
@@ -108,7 +111,7 @@ rel_basetable(mvc *sql, sql_table *t, co
assert(atname);
if (strcmp(atname, t->base.name) != 0)
ba->name = sa_strdup(sa, atname);
- for(int i = nrcols; i<end; i++)
+ for(int i = nrcols + 1; i<end; i++) /* TID is not used at start */
rel_base_set_used(ba, i);
rel->l = t;
rel->r = ba;
@@ -356,7 +359,8 @@ rewrite_basetable(mvc *sql, sql_rel *rel
set_basecol(e);
append(rel->exps, e);
}
- append(rel->exps, exp_alias(sa, atname, TID, tname, TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
+ if (rel_base_is_used(ba, i) || list_empty(rel->exps)) /* Add
TID column if no column is used */
+ append(rel->exps, exp_alias(sa, atname, TID, tname,
TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
i++;
for (cn = ol_first_node(t->idxs); cn; cn = cn->next, i++) {
diff --git a/sql/server/rel_basetable.h b/sql/server/rel_basetable.h
--- a/sql/server/rel_basetable.h
+++ b/sql/server/rel_basetable.h
@@ -24,7 +24,7 @@ extern sql_rel *rel_basetable(mvc *sql,
extern void rel_base_disallow(sql_rel *r); /* set flag too check
per column access */
extern int rel_base_use(mvc *ql, sql_rel *rt, int nr); /* return error on
(read) access violation */
extern void rel_base_use_tid(mvc *sql, sql_rel *rt);
-extern void rel_base_use_all(mvc *sql, sql_rel *rel);
+extern void rel_base_use_all(mvc *sql, sql_rel *rel, int with_tid);
extern char *rel_base_name(sql_rel *r);
extern char *rel_base_rename(sql_rel *r, char *name);
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1815,7 +1815,7 @@ rel_read(mvc *sql, char *r, int *pos, li
return sql_error(sql, -1,
SQLSTATE(42000) "Access denied for %s to table '%s.%s'\n",
get_string_global_var(sql, "current_user"), s->base.name, tname);
}
- rel_base_use_all(sql, rel);
+ rel_base_use_all(sql, rel, 1);
rel = rewrite_basetable(sql, rel);
if (!r[*pos])
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -1240,7 +1240,7 @@ static sql_rel_view*
_stack_push_table(mvc *sql, const char *tname, sql_table *t)
{
sql_rel *r = rel_basetable(sql, t, tname );
- rel_base_use_all(sql, r);
+ rel_base_use_all(sql, r, 1);
r = rewrite_basetable(sql, r);
return stack_push_rel_view(sql, tname, r);
}
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -907,7 +907,7 @@ list *
return new_exp_list(sql->sa);
if (!tname && is_basetable(rel->op) && !is_processed(rel))
- rel_base_use_all( sql, rel);
+ rel_base_use_all( sql, rel, 1);
switch(rel->op) {
case op_join:
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -286,7 +286,7 @@ static sql_rel *
rel_insert_table(sql_query *query, sql_table *t, char *name, sql_rel *inserts)
{
sql_rel *rel = rel_basetable(query->sql, t, name);
- rel_base_use_all(query->sql, rel);
+ rel_base_use_all(query->sql, rel, 0);
rel = rewrite_basetable(query->sql, rel);
return rel_insert(query->sql, rel, inserts);
}
@@ -1183,8 +1183,8 @@ delete_table(sql_query *query, dlist *qn
if (rel_base_has_column_privileges(sql, r) == 0)
return sql_error(sql, 02,
SQLSTATE(42000) "DELETE FROM: insufficient privileges for user '%s' to delete
from table '%s'",
get_string_global_var(sql, "current_user"), tname);
- rel_base_use_tid(sql, r);
}
+ rel_base_use_tid(sql, r);
if (!(r = rel_logical_exp(query, r, opt_where,
sql_where)))
return NULL;
e = exp_column(sql->sa, rel_name(r), TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
@@ -1250,8 +1250,6 @@ merge_into_table(sql_query *query, dlist
if (rel_base_has_column_privileges(sql, bt) == 0)
return sql_error(sql, 02, SQLSTATE(42000) "MERGE:
access denied for %s to table %s%s%s'%s'",
get_string_global_var(sql, "current_user"), t->s ? "'":"", t->s ?
t->s->base.name : "", t->s ? "'.":"", tname);
- rel_base_use_tid(sql, bt);
- list_append(bt->exps, exp_column(sql->sa, alias ? alias :
tname, TID, sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
}
joined = table_ref(query, NULL, tref, 0, NULL);
if (!bt || !joined)
@@ -1279,6 +1277,7 @@ merge_into_table(sql_query *query, dlist
return sql_error(sql, 02, SQLSTATE(42000)
"MERGE: only one WHEN MATCHED clause is allowed");
processed |= MERGE_UPDATE_DELETE;
+ rel_base_use_tid(sql, bt);
if (uptdel == SQL_UPDATE) {
if (!update_allowed(sql, t, tname, "MERGE",
"update", 0))
return NULL;
diff --git
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
--- a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
+++ b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
@@ -3,15 +3,15 @@
% clob # type
% 193 # length
insert(
-| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ] COUNT
+| table("sys"."cm_tmp") [ "cm_tmp"."i" ] COUNT
| union (
| | project (
| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n",
varchar "NULL", varchar "null", varchar "/file1", bigint "-1", bigint "0", int
"0", varchar "NULL", int "0", int "1"),
-| | | ) [ "cm_tmp"."i" ] COUNT ,
+| | | ) [ "cm_tmp"."i" ] COUNT
| | ) [ "cm_tmp"."i" ],
| | project (
| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n",
varchar "NULL", varchar "null", varchar "/file2", bigint "-1", bigint "0", int
"0", varchar "NULL", int "0", int "1"),
| | | ) [ "cm_tmp"."i" ] COUNT
-| | ) [ "cm_tmp"."i" ],
+| | ) [ "cm_tmp"."i" ]
| ) [ int "NULL" ]
)
diff --git
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
---
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
+++
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out.Windows
@@ -5,7 +5,7 @@
% clob # type
% 194 # length
insert(
-| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ] COUNT
+| table("sys"."cm_tmp") [ "cm_tmp"."i" ] COUNT
| union (
| | project (
| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n",
varchar "NULL", varchar "null", varchar "\\file1", bigint "-1", bigint "0", int
"0", varchar "NULL", int "0", int "1"),
@@ -23,7 +23,7 @@ insert(
% clob # type
% 196 # length
insert(
-| table("sys"."cm_tmp") [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ] COUNT
+| table("sys"."cm_tmp") [ "cm_tmp"."i" ] COUNT
| union (
| | project (
| | | table ("sys"."copyfrom"(table("cm_tmp"), varchar "|", varchar "\n",
varchar "NULL", varchar "null", varchar "a:\\file1", bigint "-1", bigint "0",
int "0", varchar "NULL", int "0", int "1"),
diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
--- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
+++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
@@ -113,8 +113,8 @@ Select b.* FROM open_auctions o, bidder
----
REF 1 (2)
join (
-| table("sys"."open_auctions") [ "open_auctions"."open_auction_id" NOT NULL as
"o"."open_auction_id", "open_auctions"."%TID%" NOT NULL as "o"."%TID%" ] COUNT ,
-| table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as "b"."id",
"bidder"."open_auction_id" NOT NULL as "b"."open_auction_id", "bidder"."date"
NOT NULL as "b"."date", "bidder"."time" NOT NULL as "b"."time",
"bidder"."personref" NOT NULL as "b"."personref", "bidder"."increase" NOT NULL
as "b"."increase", "bidder"."%TID%" NOT NULL as "b"."%TID%" ] COUNT
+| table("sys"."open_auctions") [ "open_auctions"."open_auction_id" NOT NULL as
"o"."open_auction_id" ] COUNT ,
+| table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as "b"."id",
"bidder"."open_auction_id" NOT NULL as "b"."open_auction_id", "bidder"."date"
NOT NULL as "b"."date", "bidder"."time" NOT NULL as "b"."time",
"bidder"."personref" NOT NULL as "b"."personref", "bidder"."increase" NOT NULL
as "b"."increase" ] COUNT
) [ "o"."open_auction_id" NOT NULL = "b"."open_auction_id" NOT NULL ]
REF 2 (2)
single left outer join (
@@ -123,7 +123,7 @@ single left outer join (
| | select (
| | | project (
| | | | crossproduct (
-| | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b3"."id", "bidder"."increase" NOT NULL as "b3"."increase", "bidder"."%TID%"
NOT NULL as "b3"."%TID%" ] COUNT ,
+| | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b3"."id", "bidder"."increase" NOT NULL as "b3"."increase" ] COUNT ,
| | | | | group by (
| | | | | | join (
| | | | | | | group by (
@@ -131,13 +131,13 @@ single left outer join (
| | | | | | | | | & REF 1
| | | | | | | | ) [ "o"."open_auction_id" NOT NULL ]
| | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id" NOT
NULL ],
-| | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b3a"."id", "bidder"."open_auction_id" NOT NULL as "b3a"."open_auction_id",
"bidder"."%TID%" NOT NULL as "b3a"."%TID%" ] COUNT
+| | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b3a"."id", "bidder"."open_auction_id" NOT NULL as "b3a"."open_auction_id" ]
COUNT
| | | | | | ) [ "b3a"."open_auction_id" NOT NULL = "o"."open_auction_id" NOT
NULL ]
| | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "sys"."min" no nil
("b3a"."id" NOT NULL HASHCOL ) as "%1"."%1", "o"."open_auction_id" NOT NULL ]
| | | | ) [ ]
-| | | ) [ "o"."open_auction_id" NOT NULL, "b3"."id" NOT NULL HASHCOL ,
"b3"."increase" NOT NULL, "b3"."%TID%" NOT NULL, "%1"."%1", "b3"."increase" NOT
NULL as "%2"."%2" ]
+| | | ) [ "o"."open_auction_id" NOT NULL, "b3"."id" NOT NULL HASHCOL ,
"b3"."increase" NOT NULL, "%1"."%1", "b3"."increase" NOT NULL as "%2"."%2" ]
| | ) [ "b3"."id" NOT NULL HASHCOL = "%1"."%1" ]
-| ) [ "b3"."id" NOT NULL HASHCOL , "b3"."increase" NOT NULL, "b3"."%TID%" NOT
NULL, "%1"."%1", "%2"."%2" NOT NULL, "o"."open_auction_id" NOT NULL as
"%5"."%5" ]
+| ) [ "b3"."id" NOT NULL HASHCOL , "b3"."increase" NOT NULL, "%1"."%1",
"%2"."%2" NOT NULL, "o"."open_auction_id" NOT NULL as "%5"."%5" ]
) [ "o"."open_auction_id" NOT NULL * = "%5"."%5" NOT NULL ]
project (
| single select (
diff --git a/sql/test/SQLancer/Tests/sqlancer15.test
b/sql/test/SQLancer/Tests/sqlancer15.test
--- a/sql/test/SQLancer/Tests/sqlancer15.test
+++ b/sql/test/SQLancer/Tests/sqlancer15.test
@@ -678,7 +678,7 @@ INSERT INTO t0(c0) VALUES(INTERVAL '8' D
query T rowsort
SELECT t0.c0 FROM t0 WHERE (SELECT INTERVAL '2' DAY FROM t1 GROUP BY t1.c0)
NOT IN (t0.c0)
----
-8 days
+8
statement ok
ROLLBACK
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list