Changeset: 004835f67db3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=004835f67db3 Added Files: sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql Removed Files: sql/test/pg_regress/Tests/oid.stable.out.oid32 sql/test/pg_regress/Tests/without_oid.stable.out.oid32 Modified Files: sql/server/rel_dump.c sql/server/rel_optimizer.c sql/server/rel_updates.c sql/server/sql_parser.y sql/test/BugTracker-2017/Tests/All sql/test/BugTracker-2017/Tests/crash-select_after_MAL_error.Bug-6332.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128 sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128 Branch: stratified_sampling Log Message:
Merge with default. diffs (truncated from 19763 to 300 lines): 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 @@ -1182,7 +1182,9 @@ rel_read(mvc *sql, char *r, int *pos, li gexps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 0); skipWS(r, pos); - exps = read_exps(sql, nrel, NULL, NULL, r, pos, '[', 1); + exps = read_exps(sql, nrel, NULL, gexps, r, pos, '[', 1); + if (!exps) + return NULL; rel = rel_groupby(sql, nrel, gexps); rel->exps = exps; 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 @@ -2461,7 +2461,8 @@ static sql_exp * math_unsafe_fixup( mvc *sql, sql_exp *e, sql_exp *cond, int lr ) { list *args = e->l; - if (args->h->next) + + if (args && args->h && args->h->next) return math_unsafe_fixup_binop(sql, e, args->h->data, args->h->next->data, cond, lr); else return math_unsafe_fixup_unop(sql, e, args->h->data, cond, lr); 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 @@ -23,6 +23,12 @@ insert_value(mvc *sql, sql_column *c, sq { if (s->token == SQL_NULL) { return exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL)); + } else if (s->token == SQL_DEFAULT) { + if (c->def) { + return rel_parse_val(sql, sa_message(sql->sa, "select CAST(%s AS %s);", c->def, c->type.type->sqlname), sql->emode); + } else { + return sql_error(sql, 02, "INSERT INTO: column '%s' has no valid default value", c->base.name); + } } else { int is_last = 0; exp_kind ek = {type_value, card_value, FALSE}; @@ -971,11 +977,19 @@ update_table(mvc *sql, dlist *qname, dli int status = sql->session->status; exp_kind ek = {type_value, (single)?card_column:card_relation, FALSE}; - if (single) + if(single && a->token == SQL_DEFAULT) { + char *colname = assignment->h->next->data.sval; + sql_column *col = mvc_bind_column(sql, t, colname); + if (col->def) { + v = rel_parse_val(sql, sa_message(sql->sa, "select CAST(%s AS %s);", col->def, col->type.type->sqlname), sql->emode); + } else { + return sql_error(sql, 02, "UPDATE: column '%s' has no valid default value", col->base.name); + } + } else if (single) { v = rel_value_exp(sql, &rel_val, a, sql_sel, ek); - else + } else { rel_val = rel_subquery(sql, NULL, a, ek, APPLY_JOIN); - + } if (!v) { sql->errstr[0] = 0; sql->session->status = status; diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -2893,6 +2893,7 @@ simple_atom: insert_atom: simple_atom + | DEFAULT { $$ = _symbol_create(SQL_DEFAULT, NULL ); } ; value: @@ -2913,7 +2914,12 @@ assignment_commalist: ; assignment: - column '=' search_condition + column '=' DEFAULT + { dlist *l = L(); + append_symbol(l, _symbol_create(SQL_DEFAULT, NULL ) ); + append_string(l, $1); + $$ = _symbol_create_list( SQL_ASSIGN, l); } + | column '=' search_condition { dlist *l = L(); append_symbol(l, $3 ); append_string(l, $1); diff --git a/sql/test/BugTracker-2017/Tests/All b/sql/test/BugTracker-2017/Tests/All --- a/sql/test/BugTracker-2017/Tests/All +++ b/sql/test/BugTracker-2017/Tests/All @@ -21,6 +21,7 @@ HAVE_NETCDF?rel2bin_project-assert.Bug-6 str2decimal.Bug-6206 integer_addition_overflow.Bug-6205 dce_bug-6177 +default-insert-update.Bug-6249 crash_on_NULL_ptr.Bug-6130 HAVE_SAMTOOLS?sqlsmith01 HAVE_NETCDF?sqlsmith02 diff --git a/sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql b/sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql @@ -0,0 +1,30 @@ +CREATE TABLE test1 (a INT DEFAULT -1); + +INSERT INTO test1 VALUES (1); +INSERT INTO test1 VALUES (DEFAULT); +INSERT INTO test1 VALUES (2), (DEFAULT), (3), (DEFAULT), (4); + +SELECT * FROM test1; + +UPDATE test1 SET a = DEFAULT WHERE a = 4; + +SELECT * FROM test1; + +DROP TABLE test1; + +CREATE TABLE test2 (a INT DEFAULT 0, b CLOB, c INT, d CLOB DEFAULT 'astring'); + +INSERT INTO test2 VALUES (1, 'a', 1, 'a'); +INSERT INTO test2 VALUES (DEFAULT, 'a', 1, DEFAULT); +INSERT INTO test2 VALUES (2, 'b', 2, 'b'), (100, 'other', -1, DEFAULT), (3, 'c', 3, 'c'), (DEFAULT, 'd', 4, 'd'); + +SELECT * FROM test2; + +UPDATE test2 SET d = DEFAULT, b = 'bbb' WHERE a = 1; + +SELECT * FROM test2; + +INSERT INTO test2 VALUES (1, 'a', DEFAULT, 'a'); --throw an error +UPDATE test2 SET b = DEFAULT; --throw an error + +DROP TABLE test2; diff --git a/sql/test/pg_regress/Tests/oid.stable.out.oid32 b/sql/test/pg_regress/Tests/oid.stable.out.oid32 deleted file mode 100644 --- a/sql/test/pg_regress/Tests/oid.stable.out.oid32 +++ /dev/null @@ -1,237 +0,0 @@ -stdout of test 'oid` in directory 'sql/test/pg_regress` itself: - - -# 17:11:18 > -# 17:11:18 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "mapi_open=true" "--set" "mapi_port=38959" "--set" "mapi_usock=/var/tmp/mtest-1142/.s.monetdb.38959" "--set" "monet_prompt=" "--forcemito" "--set" "mal_listing=2" "--dbpath=/ufs/dinther/INSTALL/var/MonetDB/mTests_sql_test_pg_regress" "--set" "mal_listing=0" -# 17:11:18 > - -# MonetDB 5 server v11.18.0 -# This is an unreleased version -# Serving database 'mTests_sql_test_pg_regress', using 8 threads -# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked -# Found 15.356 GiB available main-memory. -# Copyright (c) 1993-July 2008 CWI. -# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved -# Visit http://www.monetdb.org/ for further information -# Listening for connection requests on mapi:monetdb://uwakai.da.cwi.nl:38959/ -# Listening for UNIX domain connection requests on mapi:monetdb:///var/tmp/mtest-1142/.s.monetdb.38959 -# MonetDB/GIS module loaded -# MonetDB/SQL module loaded - -Ready. - -# 17:11:19 > -# 17:11:19 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-1142" "--port=38959" -# 17:11:19 > - -#-- -#-- OID -#-- -#CREATE TABLE OID_TBL(f1 oid); -#INSERT INTO OID_TBL(f1) VALUES ('1234'); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES ('1235'); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES ('987'); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES ('000'); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES (' '); -- in MonetDB this one is accepted -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES ('5 '); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES (' 10 '); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES (' 15 '); -[ 1 ] -#INSERT INTO OID_TBL(f1) VALUES (null); -[ 1 ] -#SELECT '' AS ten, OID_TBL.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL; -% .L2, sys.oid_tbl, sys.L6 # table_name -% ten, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -[ "", 1235@0, "1235@0" ] -[ "", 987@0, "987@0" ] -[ "", 0@0, "0@0" ] -[ "", NULL, NULL ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -[ "", NULL, NULL ] -#SELECT '' AS ten, OID_TBL.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL ORDER BY f1; -% .L2, sys.oid_tbl, sys.L6 # table_name -% ten, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", NULL, NULL ] -[ "", NULL, NULL ] -[ "", 0@0, "0@0" ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -[ "", 987@0, "987@0" ] -[ "", 1234@0, "1234@0" ] -[ "", 1235@0, "1235@0" ] -#DELETE FROM OID_TBL WHERE f1 < '0'; -[ 0 ] -#SELECT '' AS one, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 = cast(1234 as oid); -% .L3, sys.o, sys.L7 # table_name -% one, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -#SELECT '' AS one, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 = 1234@0; -% .L2, sys.o, sys.L6 # table_name -% one, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -#SELECT '' AS one, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 = '1234'; -% .L2, sys.o, sys.L6 # table_name -% one, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -#SELECT '' AS seven, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 <> cast(1234 as oid); -% .L3, sys.o, sys.L7 # table_name -% seven, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1235@0, "1235@0" ] -[ "", 987@0, "987@0" ] -[ "", 0@0, "0@0" ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -#SELECT '' AS seven, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 <> 1234@0; -% .L2, sys.o, sys.L6 # table_name -% seven, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1235@0, "1235@0" ] -[ "", 987@0, "987@0" ] -[ "", 0@0, "0@0" ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -#SELECT '' AS seven, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 <> '1234'; -% .L2, sys.o, sys.L6 # table_name -% seven, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1235@0, "1235@0" ] -[ "", 987@0, "987@0" ] -[ "", 0@0, "0@0" ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -#SELECT '' AS six, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 <= cast(1234 as oid); -% .L3, sys.o, sys.L7 # table_name -% six, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -[ "", 987@0, "987@0" ] -[ "", 0@0, "0@0" ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -#SELECT '' AS six, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 <= 1234@0; -% .L2, sys.o, sys.L6 # table_name -% six, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -[ "", 987@0, "987@0" ] -[ "", 0@0, "0@0" ] -[ "", 5@0, "5@0" ] -[ "", 10@0, "10@0" ] -[ "", 15@0, "15@0" ] -#SELECT '' AS six, o.*, cast(f1 as varchar(30)) as oid2str FROM OID_TBL o WHERE o.f1 <= '1234'; -% .L2, sys.o, sys.L6 # table_name -% six, f1, oid2str # name -% char, oid, varchar # type -% 0, 6, 6 # length -[ "", 1234@0, "1234@0" ] -[ "", 987@0, "987@0" ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list