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

Reply via email to