Changeset: 968f579b3cd3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=968f579b3cd3
Modified Files:
        sql/server/rel_exp.c
        sql/test/SQLancer/Tests/sqlancer07.stable.out
Branch: Oct2020
Log Message:

When setting the prepared statement parameter type recursively, be carefull to 
not set the same parameter twice. Look for the expression name


diffs (49 lines):

diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2967,7 +2967,12 @@ exp_set_type_recurse(mvc *sql, sql_subty
 
        switch (e->type) {
                case e_atom: {
-                       return exp_set_list_recurse(sql, type, e, relname, 
expname);
+                       const char *next_exp = exp_name(e);
+                       if (e->f || (next_exp && !strcmp(next_exp, *expname))) {
+                               if (!e->f)
+                                       *expname = e->r ? (const char*) e->r : 
next_exp;
+                               return exp_set_list_recurse(sql, type, e, 
relname, expname);
+                       }
                } break;
                case e_convert:
                case e_column: {
diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.out 
b/sql/test/SQLancer/Tests/sqlancer07.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer07.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer07.stable.out
@@ -51,6 +51,28 @@ stdout of test 'sqlancer07` in directory
 % boolean # type
 % 5 # length
 #ROLLBACK;
+#START TRANSACTION;
+#CREATE TABLE "t0" ("c0" BOOLEAN NOT NULL);
+#CREATE TABLE "t1" ("c0" DECIMAL(18,3));
+#CREATE TABLE "t2" ("c0" DECIMAL(18,3),"c2" DATE);
+#PREPARE (SELECT DISTINCT t0.c0, INTERVAL '1734780053' SECOND FROM t0, t1) 
UNION ALL (SELECT ?, ? FROM t2);
+#PREPARE (SELECT DISTINCT t0.c0, INTERVAL '1734780053' SECOND FROM t0, t1) 
UNION ALL (SELECT ?, ? FROM t2);
+% .prepare,    .prepare,       .prepare,       .prepare,       .prepare,       
.prepare # table_name
+% type,        digits, scale,  schema, table,  column # name
+% varchar,     int,    int,    str,    str,    str # type
+% 12,  3,      1,      0,      3,      2 # length
+[ "boolean",   1,      0,      "",     "%10",  "c0"    ]
+[ "sec_interval",      13,     0,      "",     "%10",  "%2"    ]
+[ "boolean",   1,      0,      NULL,   NULL,   NULL    ]
+[ "sec_interval",      13,     0,      NULL,   NULL,   NULL    ]
+#ROLLBACK;
+#START TRANSACTION;
+#CREATE TABLE "t0" ("c0" INTERVAL MONTH NOT NULL,CONSTRAINT "t0_c0_pkey" 
PRIMARY KEY ("c0"),CONSTRAINT "t0_c0_unique" UNIQUE ("c0"),CONSTRAINT 
"t0_c0_unique" UNIQUE ("c0"));
+#INSERT INTO "t0" VALUES (INTERVAL '2101098338' MONTH);
+[ 1    ]
+#CREATE TABLE "t1" ("c0" INTERVAL MONTH,"c1" BOOLEAN);
+#CREATE TABLE "t2" ("c0" INTERVAL MONTH);
+#ROLLBACK;
 
 # 10:16:14 >  
 # 10:16:14 >  "Done."
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to