Changeset: 3a804d88df46 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3a804d88df46
Added Files:
        sql/test/bugs/Tests/default-error.test
Modified Files:
        sql/server/rel_schema.c
        sql/storage/store.c
        sql/test/bugs/Tests/All
Branch: Dec2023
Log Message:

check during alter and column creation the default value.


diffs (107 lines):

diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -612,10 +612,12 @@ column_options(sql_query *query, dlist *
                                        }
                                        used |= (1<<COL_DEFAULT);
 
-                                       if (sym->token == SQL_COLUMN || 
sym->token == SQL_IDENT) {
+                                       if (sym->token == SQL_COLUMN || 
sym->token == SQL_IDENT || sym->token == SQL_NEXT) {
                                                exp_kind ek = {type_value, 
card_value, FALSE};
                                                sql_exp *e = 
rel_logical_value_exp(query, NULL, sym, sql_sel, ek);
 
+                                               if (!e)
+                                                       return SQL_ERR;
                                                if (e && is_atom(e->type)) {
                                                        atom *a = 
exp_value(sql, e);
 
@@ -1087,6 +1089,34 @@ table_element(sql_query *query, symbol *
                        sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S22) "%s: no 
such column '%s'\n", action, cname);
                        return SQL_ERR;
                }
+               if (sym->token == SQL_COLUMN || sym->token == SQL_IDENT || 
sym->token == SQL_NEXT) {
+                               exp_kind ek = {type_value, card_value, FALSE};
+                               sql_exp *e = rel_logical_value_exp(query, NULL, 
sym, sql_sel, ek);
+
+                               if (!e)
+                                       return SQL_ERR;
+                               if (e && is_atom(e->type)) {
+                                       atom *a = exp_value(sql, e);
+
+                                       if (a && atom_null(a)) {
+                                               switch (mvc_default(sql, c, 
NULL)) {
+                                               case -1:
+                                                       (void) sql_error(sql, 
02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                                       return SQL_ERR;
+                                               case -2:
+                                               case -3:
+                                                       (void) sql_error(sql, 
02, SQLSTATE(42000) "DEFAULT: transaction conflict detected while setting 
default value");
+                                                       return SQL_ERR;
+                                               default:
+                                                       break;
+                                       }
+                                       break;
+                               }
+                       }
+                       /* reset error */
+                       sql->session->status = 0;
+                       sql->errstr[0] = '\0';
+               }
                r = symbol2string(sql, sym, 0, &err);
                if (!r) {
                        (void) sql_error(sql, 02, SQLSTATE(42000) "%s: 
incorrect default value '%s'\n", action, err?err:"");
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4464,9 +4464,10 @@ sys_drop_default_object(sql_trans *tr, s
 
                extract_schema_and_sequence_name(NULL, col->def + 
strlen(next_value_for), &schema, &seq_name);
                if (!schema || !seq_name || !(s = find_sql_schema(tr, schema))) 
{
+                       /* didn't find the schema so no generated sequence */
                        _DELETE(schema);
                        _DELETE(seq_name);
-                       return -1;
+                       return res;
                }
 
                seq = find_sql_sequence(tr, s, seq_name);
diff --git a/sql/test/bugs/Tests/All b/sql/test/bugs/Tests/All
--- a/sql/test/bugs/Tests/All
+++ b/sql/test/bugs/Tests/All
@@ -116,3 +116,4 @@ savepoint-release
 procedure-recompile
 rse_bug
 delete-or-not-in-bug
+default-error
diff --git a/sql/test/bugs/Tests/default-error.test 
b/sql/test/bugs/Tests/default-error.test
new file mode 100644
--- /dev/null
+++ b/sql/test/bugs/Tests/default-error.test
@@ -0,0 +1,27 @@
+statement ok
+CREATE TABLE "experiments" (
+       "id"           BIGINT        NOT NULL,
+       "host_id"      INTEGER,
+       "software_id"  INTEGER,
+       "name"         CHARACTER LARGE OBJECT,
+       "policy"       CHARACTER LARGE OBJECT,
+       "dbname"       CHARACTER LARGE OBJECT,
+       "tags"         VARCHAR(256),
+       "comment"      CHARACTER LARGE OBJECT,
+       "start_time"   TIMESTAMP,
+       "end_time"     TIMESTAMP,
+       "inserted_at"  TIMESTAMP,
+       "description"  CHARACTER LARGE OBJECT,
+       "sf"           CHARACTER LARGE OBJECT,
+       "benchmark_id" INTEGER       NOT NULL,
+       "tload"        DECIMAL(18,3),
+       "cpu_log"      UUID,
+       "memory_log"   UUID,
+       "disk_log"     UUID,
+       "proc_log"     UUID,
+       CONSTRAINT "experiments_id_pkey" PRIMARY KEY ("id"),
+       CONSTRAINT "experiments__uc" UNIQUE ("host_id", "software_id", "name", 
"sf", "policy")
+)
+
+statement error
+ALTER TABLE "experiments" ALTER COLUMN "id" SET DEFAULT next value for 
"results"."seq_8059"
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to