Changeset: a826dc3956b3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a826dc3956b3 Added Files: sql/test/BugTracker-2019/Tests/prepared-merge-statement.Bug-6706.sql sql/test/BugTracker-2019/Tests/prepared-merge-statement.Bug-6706.stable.err sql/test/BugTracker-2019/Tests/prepared-merge-statement.Bug-6706.stable.out Removed Files: sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out.int128 sql/test/BugTracker-2008/Tests/groupby_with_NULL.SF-2155606.stable.out.int128 sql/test/BugTracker-2008/Tests/mul_div_bug.SF-2075135.stable.out.int128 sql/test/BugTracker-2009/Tests/TribooleanFailureWithSubquery.SF-2679434.stable.out.int128 sql/test/BugTracker-2009/Tests/arithmetic-small-values-null.SF-2921310.stable.out.int128 sql/test/BugTracker-2009/Tests/avg-bug.SF-2132666.stable.out.int128 sql/test/BugTracker-2009/Tests/case_evaluates_all_branches.SF-2893484.stable.out.int128 sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out.int128 sql/test/Tests/outerref_in_selection.sql.src Modified Files: buildtools/scripts/mal2h.py buildtools/scripts/sql2h.py embedded/monetdb_embedded.c monetdb5/mal/mal.c monetdb5/mal/mal_namespace.c monetdb5/mal/mal_private.h sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_scenario.h sql/server/rel_psm.c sql/server/rel_select.c sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.sql sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out sql/test/BugTracker-2008/Tests/groupby_with_NULL.SF-2155606.sql sql/test/BugTracker-2008/Tests/groupby_with_NULL.SF-2155606.stable.out sql/test/BugTracker-2008/Tests/mul_div_bug.SF-2075135.sql sql/test/BugTracker-2009/Tests/TribooleanFailureWithSubquery.SF-2679434.sql sql/test/BugTracker-2009/Tests/TribooleanFailureWithSubquery.SF-2679434.stable.out sql/test/BugTracker-2009/Tests/avg-bug.SF-2132666.sql sql/test/BugTracker-2009/Tests/avg-bug.SF-2132666.stable.out sql/test/BugTracker-2009/Tests/bit_and.SF-2850341.stable.out.int128 sql/test/BugTracker-2009/Tests/case_evaluates_all_branches.SF-2893484.sql sql/test/BugTracker-2009/Tests/case_evaluates_all_branches.SF-2893484.stable.out sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.sql sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out sql/test/BugTracker-2017/Tests/prepare.Bug-6133.stable.err sql/test/BugTracker-2019/Tests/All sql/test/Tests/outerref_in_selection.stable.out sql/test/merge-partitions/Tests/mergepart28.stable.err Branch: cmake-monetdblite Log Message:
Merge with cmake-fun. diffs (truncated from 1613 to 300 lines): diff --git a/buildtools/scripts/mal2h.py b/buildtools/scripts/mal2h.py --- a/buildtools/scripts/mal2h.py +++ b/buildtools/scripts/mal2h.py @@ -33,7 +33,7 @@ insert1 = ''.join([ '*/\n', '\n', '// This file was generated automatically with mal2h.py. Do not edit this file directly.\n', - 'char ', output_file_split[0], '[] = {']) + 'static char ', output_file_split[0], '[] = {']) mal_h_output_file.write(insert1) file_stat = os.stat(sys.argv[1]) diff --git a/buildtools/scripts/sql2h.py b/buildtools/scripts/sql2h.py --- a/buildtools/scripts/sql2h.py +++ b/buildtools/scripts/sql2h.py @@ -33,7 +33,7 @@ insert1 = ''.join([ '*/\n', '\n', '// This file was generated automatically with sql2h.py. Do not edit this file directly.\n', - 'char ', output_file_split[0], '[] = {']) + 'static char ', output_file_split[0], '[] = {']) sql_h_output_file.write(insert1) file_stat = os.stat(sys.argv[1]) diff --git a/embedded/monetdb_embedded.c b/embedded/monetdb_embedded.c --- a/embedded/monetdb_embedded.c +++ b/embedded/monetdb_embedded.c @@ -393,15 +393,8 @@ monetdb_append(monetdb_connection conn, if (m->session->status < 0 && m->session->auto_commit == 0) return createException(MAL, "embedded.monetdb_append", SQLSTATE(25005) "Current transaction is aborted (please ROLLBACK)"); - SQLtrans(m); - if (*m->errstr) { - if (strlen(m->errstr) > 6 && m->errstr[5] == '!') - msg = createException(MAL, "embedded.monetdb_append", "%s", m->errstr); - else - msg = createException(MAL, "embedded.monetdb_append", SQLSTATE(42000) "%s", m->errstr); - *m->errstr=0; + if ((msg = SQLtrans(m)) != MAL_SUCCEED) return msg; - } if (!m->sa) { // unclear why this is required m->sa = sa_create(); if (!m->sa) diff --git a/monetdb5/mal/mal_namespace.c b/monetdb5/mal/mal_namespace.c --- a/monetdb5/mal/mal_namespace.c +++ b/monetdb5/mal/mal_namespace.c @@ -16,26 +16,25 @@ #include "mal_exception.h" #include "mal_private.h" -MT_Lock mal_namespaceLock = MT_LOCK_INITIALIZER("mal_namespaceLk"); - #define MAXIDENTIFIERS 4096 #define HASHMASK 4095 +MT_Lock mal_namespaceLock = MT_LOCK_INITIALIZER("mal_namespaceLk"); + /* taken from gdk_atoms */ #define NME_HASH(_key,y,K) \ - do { \ - size_t _i; \ - for (_i = y = 0; _i < K && _key[_i]; _i++) { \ - y += _key[_i]; \ - y += (y << 10); \ - y ^= (y >> 6); \ - } \ - y += (y << 3); \ - y ^= (y >> 11); \ - y += (y << 15); \ + do { \ + size_t _i; \ + for (_i = y = 0; _i < K && _key[_i]; _i++) { \ + y += _key[_i]; \ + y += (y << 10); \ + y ^= (y >> 6); \ + } \ + y += (y << 3); \ + y ^= (y >> 11); \ + y += (y << 15); \ y = y & HASHMASK; \ - } while (0) - + } while (0) typedef struct NAME{ struct NAME *next; diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c --- a/sql/backends/monet5/rel_bin.c +++ b/sql/backends/monet5/rel_bin.c @@ -388,9 +388,12 @@ value_list(backend *be, list *vals, stmt { node *n; stmt *s; - + sql_subtype *type = exp_subtype(vals->h->data); + + if (!type) + return sql_error(be->mvc, 02, SQLSTATE(42000) "Could not infer the type of a value list column"); /* create bat append values */ - s = stmt_temp(be, exp_subtype(vals->h->data)); + s = stmt_temp(be, type); for( n = vals->h; n; n = n->next) { sql_exp *e = n->data; stmt *i = exp_bin(be, e, left, NULL, NULL, NULL, NULL, sel); @@ -400,7 +403,6 @@ value_list(backend *be, list *vals, stmt if (list_length(vals) == 1) return i; - s = stmt_append(be, s, i); } return s; diff --git a/sql/backends/monet5/sql_execute.c b/sql/backends/monet5/sql_execute.c --- a/sql/backends/monet5/sql_execute.c +++ b/sql/backends/monet5/sql_execute.c @@ -484,13 +484,7 @@ SQLstatementIntern(Client c, str *expr, /* create private allocator */ m->sa = NULL; - SQLtrans(m); - if(*m->errstr) { - if (strlen(m->errstr) > 6 && m->errstr[5] == '!') - msg = createException(SQL, "sql.statement", "%s", m->errstr); - else - msg = createException(SQL, "sql.statement", SQLSTATE(42000) "%s", m->errstr); - *m->errstr=0; + if ((msg = SQLtrans(m)) != MAL_SUCCEED) { if (inited) SQLresetClient(c); return msg; diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -674,11 +674,11 @@ backend_dumpstmt(backend *be, MalBlkPtr return -1; be->mvc_var = getDestVar(q); be->mb = mb; - s = sql_relation2stmt(be, r); + s = sql_relation2stmt(be, r); if (!s) { if (querylog) (void) pushInt(mb, querylog, mb->stop); - return 0; + return (be->mvc->errstr[0] == '\0') ? 0 : -1; } be->mvc_var = old_mv; @@ -777,8 +777,8 @@ backend_dumpproc(backend *be, Client c, sql_type *tpe = atom_type(a)->type; int type, varid = 0; - if(!tpe) { - sql_error(m, 003, SQLSTATE(42000) "Could not determine type for argument %d\n", argc+1); + if (!tpe) { + sql_error(m, 003, SQLSTATE(42000) "Could not determine type for argument number %d\n", argc+1); goto cleanup; } type = tpe->localtype; @@ -798,8 +798,8 @@ backend_dumpproc(backend *be, Client c, sql_type *tpe = a->type.type; int type, varid = 0; - if(!tpe) { - sql_error(m, 003, SQLSTATE(42000) "Could not determine type for argument %d\n", argc+1); + if (!tpe) { + sql_error(m, 003, SQLSTATE(42000) "Could not determine type for argument number %d\n", argc+1); goto cleanup; } type = tpe->localtype; diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -656,32 +656,30 @@ SQLautocommit(mvc *m) return msg; } -void +str SQLtrans(mvc *m) { m->caching = m->cache; if (!m->session->active) { sql_session *s; - if(mvc_trans(m) < 0) { - (void) sql_error(m, 02, SQLSTATE(HY001) "Allocation failure while starting the transaction"); - return; - } + if (mvc_trans(m) < 0) + throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL); s = m->session; if (!s->schema) { if (s->schema_name) GDKfree(s->schema_name); s->schema_name = monet5_user_get_def_schema(m, m->user_id); - if(!s->schema_name) { + if (!s->schema_name) { mvc_cancel_session(m); - (void) sql_error(m, 02, SQLSTATE(HY001) "Allocation failure while starting the transaction"); - return; + throw(SQL, "sql.trans", SQLSTATE(HY001) MAL_MALLOC_FAIL); } assert(s->schema_name); s->schema = find_sql_schema(s->tr, s->schema_name); assert(s->schema); } } + return MAL_SUCCEED; } str @@ -1023,16 +1021,11 @@ SQLparser(Client c) #endif m = be->mvc; m->type = Q_PARSE; - if (be->language != 'X') - SQLtrans(m); - if(*m->errstr) { - if (strlen(m->errstr) > 6 && m->errstr[5] == '!') - msg = createException(PARSE, "SQLparser", "%s", m->errstr); - else - msg = createException(PARSE, "SQLparser", SQLSTATE(42000) "%s", m->errstr); - *m->errstr=0; - c->mode = FINISHCLIENT; - return msg; + if (be->language != 'X') { + if ((msg = SQLtrans(m)) != MAL_SUCCEED) { + c->mode = FINISHCLIENT; + return msg; + } } pstatus = m->session->status; @@ -1054,7 +1047,8 @@ SQLparser(Client c) n = sscanf(in->buf + in->pos + 7, "%d %d %d", &v, &off, &len); if (n == 2 || n == 3) { - mvc_export_chunk(be, out, v, off, n == 3 ? len : m->reply_size); + if (mvc_export_chunk(be, out, v, off, n == 3 ? len : m->reply_size)) + throw(SQL, "SQLparser", SQLSTATE(45000) "Result set construction failed"); in->pos = in->len; /* HACK: should use parsed length */ return MAL_SUCCEED; diff --git a/sql/backends/monet5/sql_scenario.h b/sql/backends/monet5/sql_scenario.h --- a/sql/backends/monet5/sql_scenario.h +++ b/sql/backends/monet5/sql_scenario.h @@ -20,7 +20,7 @@ sql5_export str SQLprelude(Client cntxt, sql5_export str SQLepilogue(void *ret); sql5_export str SQLautocommit(mvc *m); -sql5_export void SQLtrans(mvc *m); +sql5_export str SQLtrans(mvc *m); sql5_export str SQLexit(Client c); sql5_export str SQLexitClient(Client c); diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -856,7 +856,7 @@ rel_create_func(sql_query *query, dlist arg_list = tpe; } } - (void)sql_error(sql, 02, SQLSTATE(42000) "CREATE %s%s: name '%s' (%s) already in use", KF, F, fname, arg_list); + (void)sql_error(sql, 02, SQLSTATE(42000) "CREATE %s%s: name '%s' (%s) already in use", KF, F, fname, arg_list ? arg_list : ""); _DELETE(arg_list); list_destroy(type_list); return NULL; diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1157,7 +1157,7 @@ exp_fix_scale(mvc *sql, sql_subtype *ct, static int rel_set_type_param(mvc *sql, sql_subtype *type, sql_exp *param, int upcast) { - if (!type || !param || param->type != e_atom) + if (!type || !param || (param->type != e_atom && param->type != e_column)) return -1; /* use largest numeric types */ diff --git a/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.sql b/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.sql --- a/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.sql +++ b/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.sql @@ -4,8 +4,8 @@ CREATE TABLE A (FIPS2 TIMESTAMP); INSERT INTO A VALUES ( TIMESTAMP '1996-08-24 16:03:00.999999'); -SELECT EXTRACT (SECOND FROM FIPS2) -* 1000000 - 999990 FROM A; +SELECT CAST( EXTRACT (SECOND FROM FIPS2) +* 1000000 - 999990 as decimal(18,6)) FROM A; select EXTRACT (SECOND FROM FIPS2) FROM A; diff --git a/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out b/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out --- a/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out +++ b/sql/test/BugTracker-2008/Tests/extract_bug.SF-2075266.stable.out @@ -26,8 +26,8 @@ stdout of test 'extract_bug.SF-2075266` # 13:27:40 > _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list