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

Reply via email to