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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list