Changeset: 6cd986132b9e for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6cd986132b9e Added Files: sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.sql sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.err sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.out Modified Files: sql/server/rel_bin.c sql/test/BugTracker-2012/Tests/All Branch: Apr2012 Log Message:
fixed bug 3091. Handle single value (value lists) properly. diffs (217 lines): diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c --- a/sql/server/rel_bin.c +++ b/sql/server/rel_bin.c @@ -310,6 +310,9 @@ value_list( mvc *sql, list *vals) for( n = vals->h; n; n = n->next) { sql_exp *e = n->data; stmt *i = exp_bin(sql, e, NULL, NULL, NULL, NULL); + + if (list_length(vals) == 1) + return i; s = stmt_append(sql->sa, s, i); } @@ -2719,11 +2722,12 @@ insert_check_ukey(mvc *sql, list *insert if (list_length(k->columns) > 1) { node *m; - stmt *s = nth(inserts, 0)->op1; + stmt *s, *ins = nth(inserts, 0)->op1; sql_subaggr *sum; stmt *ssum = NULL; stmt *col = NULL; + s = ins; /* 1st stage: find out if original contains same values */ if (s->key && s->nrcols == 0) { s = stmt_relselect_init(sql->sa); @@ -2760,7 +2764,7 @@ insert_check_ukey(mvc *sql, list *insert s = stmt_binop(sql->sa, stmt_aggr(sql->sa, s, NULL, cnt, 1), stmt_atom_wrd(sql->sa, 0), ne); /* 2e stage: find out if inserted are unique */ - if ((!idx_inserts && nth(inserts,0)->nrcols) || (idx_inserts && idx_inserts->nrcols)) { /* insert columns not atoms */ + if ((!idx_inserts && ins->nrcols) || (idx_inserts && idx_inserts->nrcols)) { /* insert columns not atoms */ stmt *ss = NULL; sql_subfunc *or = sql_bind_func_result(sql->sa, sql->session->schema, "or", bt, bt, bt); /* implementation uses sort,refine, key check */ diff --git a/sql/test/BugTracker-2012/Tests/All b/sql/test/BugTracker-2012/Tests/All --- a/sql/test/BugTracker-2012/Tests/All +++ b/sql/test/BugTracker-2012/Tests/All @@ -42,3 +42,4 @@ aggregate_vs_positional_column_crash.Bug predicate_select.Bug-3090 hash_join_crash.Bug-3089 row-number-nyi.Bug-3087 +insert_serial_with_unique_key.Bug-3091 diff --git a/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.sql b/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.sql @@ -0,0 +1,47 @@ +CREATE SCHEMA "meta"; + +CREATE TABLE "meta"."program_specs" ( + "id" INT AUTO_INCREMENT PRIMARY KEY, + "namespace" CLOB NOT NULL, + "simple_name" CLOB NOT NULL, + "description" CLOB NOT NULL DEFAULT '', + "xml_spec" CLOB NOT NULL, + CONSTRAINT "program_spec_unique_name" UNIQUE ("namespace", "simple_name") +); + +INSERT INTO "meta"."program_specs" + ("namespace", "simple_name", "description", "xml_spec") +VALUES + ( 'example', 'access-control', '', '<?xml version="1.0" encoding="UTF-8"?>' +) +; + +DROP TABLE "meta"."program_specs"; +DROP SCHEMA "meta"; + +create table t30( + a varchar(100), + b varchar(100), + CONSTRAINT "t30_unique" UNIQUE ("a", "b") +); +insert into t30(a,b) values('x','y'); + +create table t31( + a varchar(100), + b varchar(100), + c varchar(100), + CONSTRAINT "t31_unique" UNIQUE ("a", "b") +); +insert into t31(a,b) values('x','y'); + +create table t32( + c varchar(100), + a varchar(100), + b varchar(100), + CONSTRAINT "t32_unique" UNIQUE ("a", "b") +); +insert into t32(c,a,b) values(NULL,'x','y'); + +drop table t30; +drop table t31; +drop table t32; diff --git a/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.err b/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.err new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.err @@ -0,0 +1,37 @@ +stderr of test 'insert_serial_with_unique_key.Bug-3091` in directory 'test/BugTracker-2012` itself: + + +# 15:04:13 > +# 15:04:13 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "gdk_dbfarm=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" "--set" "mapi_open=true" "--set" "mapi_port=35209" "--set" "monet_prompt=" "--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012" "--set" "mal_listing=0" +# 15:04:13 > + +# builtin opt gdk_dbname = demo +# builtin opt gdk_dbfarm = /home/niels/scratch/rc-clean/Linux-x86_64/var/monetdb5/dbfarm +# builtin opt gdk_debug = 0 +# builtin opt gdk_alloc_map = no +# builtin opt gdk_vmtrim = yes +# builtin opt monet_prompt = > +# builtin opt monet_daemon = no +# builtin opt mapi_port = 50000 +# builtin opt mapi_open = false +# builtin opt mapi_autosense = false +# builtin opt sql_optimizer = default_pipe +# builtin opt sql_debug = 0 +# cmdline opt gdk_nr_threads = 0 +# cmdline opt gdk_dbfarm = /home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB +# cmdline opt mapi_open = true +# cmdline opt mapi_port = 35209 +# cmdline opt monet_prompt = +# cmdline opt mal_listing = 2 +# cmdline opt gdk_dbname = mTests_test_BugTracker-2012 +# cmdline opt mal_listing = 0 + +# 15:04:13 > +# 15:04:13 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels" "--port=35209" +# 15:04:13 > + + +# 15:04:13 > +# 15:04:13 > "Done." +# 15:04:13 > + diff --git a/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.out b/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.out new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2012/Tests/insert_serial_with_unique_key.Bug-3091.stable.out @@ -0,0 +1,74 @@ +stdout of test 'insert_serial_with_unique_key.Bug-3091` in directory 'test/BugTracker-2012` itself: + + +# 15:04:13 > +# 15:04:13 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" "gdk_dbfarm=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" "--set" "mapi_open=true" "--set" "mapi_port=35209" "--set" "monet_prompt=" "--trace" "--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012" "--set" "mal_listing=0" +# 15:04:13 > + +# MonetDB 5 server v11.9.2 +# This is an unreleased version +# Serving database 'mTests_test_BugTracker-2012', using 4 threads +# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically linked +# Found 3.778 GiB available main-memory. +# Copyright (c) 1993-July 2008 CWI. +# Copyright (c) August 2008-2012 MonetDB B.V., all rights reserved +# Visit http://www.monetdb.org/ for further information +# Listening for connection requests on mapi:monetdb://niels.nesco.mine.nu:35209/ +# MonetDB/GIS module loaded +# MonetDB/SQL module loaded + +Ready. + +# 15:04:13 > +# 15:04:13 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels" "--port=35209" +# 15:04:13 > + +#CREATE SCHEMA "meta"; +#CREATE TABLE "meta"."program_specs" ( +# "id" INT AUTO_INCREMENT PRIMARY KEY, +# "namespace" CLOB NOT NULL, +# "simple_name" CLOB NOT NULL, +# "description" CLOB NOT NULL DEFAULT '', +# "xml_spec" CLOB NOT NULL, +# CONSTRAINT "program_spec_unique_name" UNIQUE ("namespace", "simple_name") +#); +#INSERT INTO "meta"."program_specs" +# ("namespace", "simple_name", "description", "xml_spec") +#VALUES +# ( 'example', 'access-control', '', '<?xml version="1.0" encoding="UTF-8"?>' +#) +#; +[ 1 ] +#DROP TABLE "meta"."program_specs"; +#DROP SCHEMA "meta"; +#create table t30( +# a varchar(100), +# b varchar(100), +# CONSTRAINT "t30_unique" UNIQUE ("a", "b") +#); +#insert into t30(a,b) values('x','y'); +[ 1 ] +#create table t31( +# a varchar(100), +# b varchar(100), +# c varchar(100), +# CONSTRAINT "t31_unique" UNIQUE ("a", "b") +#); +#insert into t31(a,b) values('x','y'); +[ 1 ] +#create table t32( +# c varchar(100), +# a varchar(100), +# b varchar(100), +# CONSTRAINT "t32_unique" UNIQUE ("a", "b") +#); +#insert into t32(c,a,b) values(NULL,'x','y'); +[ 1 ] +#drop table t30; +#drop table t31; +#drop table t32; + +# 15:04:13 > +# 15:04:13 > "Done." +# 15:04:13 > + _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list