Changeset: 17a3e90e65df for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=17a3e90e65df
Added Files:
        sql/test/merge-partitions/Tests/mergepart20.stable.err
        sql/test/merge-partitions/Tests/mergepart20.stable.out
Modified Files:
        sql/backends/monet5/sql.c
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/server/sql_partition.c
        sql/server/sql_partition.h
        sql/storage/store.c
        sql/test/merge-partitions/Tests/mergepart20.sql
Branch: merge-partitions
Log Message:

Perform proper initialization of an expression


diffs (truncated from 409 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -38,6 +38,8 @@
 #include "mal_instruction.h"
 #include "mal_resource.h"
 
+extern str bootstrap_partition_expression(mvc* sql, sql_table *mt);
+
 static int
 rel_is_table(sql_rel *rel)
 {
@@ -337,8 +339,20 @@ create_table_or_view(mvc *sql, char *sna
                if(isPartitionedByColumnTable(t) && c == t->part.pcol)
                        nt->part.pcol = copied;
        }
-       if(isPartitionedByExpressionTable(t))
+       if(isPartitionedByExpressionTable(t)) {
+               char *err = NULL;
                nt->part.pexp->exp = sa_strdup(sql->session->tr->sa, 
t->part.pexp->exp);
+
+               sql->sa = sa_create();
+               if(!sql->sa)
+                       throw(SQL, "sql.catalog",SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
+
+               if((err = bootstrap_partition_expression(sql, nt)))
+                       return err;
+
+               sa_destroy(sql->sa);
+               sql->sa = NULL;
+       }
        if(sql_trans_set_partition_table(sql->session->tr, nt))
                throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: %s_%s: 
an internal error occurred", s->base.name, t->base.name);
 
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
@@ -937,6 +937,7 @@ create_partition_definition(mvc *sql, sq
                                return SQL_ERR;
                        }
                } else if(tt == tt_list_partition_exp || tt == 
tt_range_partition_exp) {
+                       sql_subtype *empty = sql_bind_localtype("void");
                        char *query = symbol2string(sql, list2->h->data.sym, 
&err);
                        if (!query) {
                                (void) sql_error(sql, 02, SQLSTATE(42000) 
"CREATE MERGE TABLE: error compiling expression '%s'", err?err:"");
@@ -945,6 +946,7 @@ create_partition_definition(mvc *sql, sq
                        }
                        t->part.pexp = SA_ZNEW(sql->sa, sql_expression);
                        t->part.pexp->exp = sa_strdup(sql->sa, query);
+                       t->part.pexp->type = *empty;
                        _DELETE(query);
                }
        }
@@ -1024,8 +1026,6 @@ rel_create_table(mvc *sql, sql_schema *s
 
                if(create_partition_definition(sql, t, tt, partition_def) != 
SQL_OK)
                        return NULL;
-               if(sql_trans_set_partition_table(sql->session->tr, t))
-                       return NULL;
 
                temp = (tt == tt_table)?temp:SQL_PERSIST;
                return rel_table(sql, DDL_CREATE_TABLE, sname, t, temp);
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -22,6 +22,7 @@
 #include "gdk_logger.h"
 #include "wlc.h"
 
+extern str bootstrap_partition_expression(mvc* sql, sql_table *mt);
 extern str initialize_sql_parts(mvc* sql, sql_table *mt);
 
 static int mvc_debug = 0;
@@ -1310,6 +1311,7 @@ sql_table *
 mvc_create_table(mvc *m, sql_schema *s, const char *name, int tt, bit system, 
int persistence, int commit_action, int sz)
 {
        sql_table *t = NULL;
+       char *err = NULL;
 
        if (mvc_debug)
                fprintf(stderr, "#mvc_create_table %s %s %d %d %d %d\n", 
s->base.name, name, tt, system, persistence, commit_action);
@@ -1319,6 +1321,10 @@ mvc_create_table(mvc *m, sql_schema *s, 
                t->s = s;
        } else {
                t = sql_trans_create_table(m->session->tr, s, name, NULL, tt, 
system, persistence, commit_action, sz);
+               if(t && isPartitionedByExpressionTable(t) && (err = 
bootstrap_partition_expression(m, t))) {
+                       (void) sql_error(m, 02, "%s", err);
+                       return SQL_ERR;
+               }
                if(sql_trans_set_partition_table(m->session->tr, t))
                        return NULL;
        }
@@ -1339,8 +1345,6 @@ mvc_create_view(mvc *m, sql_schema *s, c
                t->query = sa_strdup(m->sa, sql);
        } else {
                t = sql_trans_create_table(m->session->tr, s, name, sql, 
tt_view, system, SQL_PERSIST, 0, 0);
-               if(sql_trans_set_partition_table(m->session->tr, t))
-                       return NULL;
        }
        return t;
 }
@@ -1359,8 +1363,6 @@ mvc_create_remote(mvc *m, sql_schema *s,
                t->query = sa_strdup(m->sa, loc);
        } else {
                t = sql_trans_create_table(m->session->tr, s, name, loc, 
tt_remote, 0, SQL_REMOTE, 0, 0);
-               if(sql_trans_set_partition_table(m->session->tr, t))
-                       return NULL;
        }
        return t;
 }
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -149,7 +149,7 @@ find_expression_type(sql_exp *e, sql_sub
        return NULL;
 }
 
-static str
+str
 bootstrap_partition_expression(mvc* sql, sql_table *mt)
 {
        sql_exp *exp;
@@ -162,6 +162,12 @@ bootstrap_partition_expression(mvc* sql,
        baset = rel_basetable(sql, mt, mt->base.name);
        query = mt->part.pexp->exp;
        if((exp = rel_parse_val(sql, sa_message(sql->sa, "select %s;", query), 
sql->emode, baset)) == NULL) {
+               if(*sql->errstr) {
+                       if (strlen(sql->errstr) > 6 && sql->errstr[5] == '!')
+                               throw(SQL, "sql.partition", "%s", sql->errstr);
+                       else
+                               throw(SQL, "sql.partition", SQLSTATE(42000) 
"%s", sql->errstr);
+               }
                throw(SQL,"sql.partition", SQLSTATE(42000) "Incorrect 
expression '%s'", query);
        }
 
diff --git a/sql/server/sql_partition.h b/sql/server/sql_partition.h
--- a/sql/server/sql_partition.h
+++ b/sql/server/sql_partition.h
@@ -12,6 +12,7 @@
 #include "sql_mvc.h"
 #include "sql_catalog.h"
 
+extern str bootstrap_partition_expression(mvc* sql, sql_table *mt);
 extern str find_partition_type(mvc* sql, sql_subtype *tpe, sql_table *mt);
 extern str initialize_sql_parts(mvc* sql, sql_table *mt);
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4957,7 +4957,7 @@ sql_trans_create_table(sql_trans *tr, sq
 int
 sql_trans_set_partition_table(sql_trans *tr, sql_table *t)
 {
-       if(t && !isDeclaredTable(t) && (isRangePartitionTable(t) || 
isListPartitionTable(t))) {
+       if(t && (isRangePartitionTable(t) || isListPartitionTable(t))) {
                sql_schema *syss = find_sql_schema(tr, isGlobal(t)?"sys":"tmp");
                sql_table *partitions = find_sql_table(syss, 
"_table_partitions");
                oid next = next_oid();
diff --git a/sql/test/merge-partitions/Tests/mergepart20.sql 
b/sql/test/merge-partitions/Tests/mergepart20.sql
--- a/sql/test/merge-partitions/Tests/mergepart20.sql
+++ b/sql/test/merge-partitions/Tests/mergepart20.sql
@@ -4,7 +4,7 @@ CREATE TABLE subtable2 (a int, b varchar
 SELECT column_id, expression FROM table_partitions;
 
 ALTER TABLE testme ADD TABLE subtable1 AS PARTITION BETWEEN 
'00000000000000000000000000000000' AND '7fffffffffffffffffffffffffffffff';
-ALTER TABLE testme ADD TABLE subtable2 AS PARTITION BETWEEN 
'f0000000000000000000000000000000' AND 'ffffffffffffffffffffffffffffffff';
+ALTER TABLE testme ADD TABLE subtable2 AS PARTITION BETWEEN 
'80000000000000000000000000000000' AND 'ffffffffffffffffffffffffffffffff';
 
 INSERT INTO testme VALUES (1, 'first'), (2000, 'second'), (3, 'third'), (4000, 
'fourth');
 
@@ -23,7 +23,7 @@ SELECT column_id, expression FROM table_
 
 CREATE MERGE TABLE testme (a int, b varchar(32)) PARTITION BY RANGE USING 
(iamdummy(a)); --error
 
-CREATE FUNCTION iamdummy(a int) RETURNS INT BEGIN return a + 1; END;
+CREATE FUNCTION iamdummy(a int) RETURNS INT BEGIN RETURN a + 1; END;
 
 CREATE MERGE TABLE testme (a int, b varchar(32)) PARTITION BY RANGE USING 
(iamdummy(a));
 CREATE TABLE subtable1 (a int, b varchar(32));
@@ -32,7 +32,7 @@ CREATE TABLE subtable3 (a int, b varchar
 
 ALTER TABLE testme ADD TABLE subtable1 AS PARTITION BETWEEN 11 AND 20;
 ALTER TABLE testme ADD TABLE subtable2 AS PARTITION BETWEEN 1 AND 10;
-ALTER TABLE testme ADD TABLE subtable3 AS PARTITION BETWEEN 'abc' AND 'cde';
+ALTER TABLE testme ADD TABLE subtable3 AS PARTITION BETWEEN 'abc' AND 'cde'; 
--error
 
 INSERT INTO testme VALUES (1, 'first'), (10, 'second'), (2, 'third'), (15, 
'fourth');
 INSERT INTO testme VALUES (12, 'this'), (6, 'not'), (50, 'ok'); --error
diff --git a/sql/test/merge-partitions/Tests/mergepart20.stable.err 
b/sql/test/merge-partitions/Tests/mergepart20.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-partitions/Tests/mergepart20.stable.err
@@ -0,0 +1,51 @@
+stderr of test 'mergepart20` in directory 'sql/test/merge-partitions` itself:
+
+
+# 10:47:20 >  
+# 10:47:20 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=31480" "--set" 
"mapi_usock=/var/tmp/mtest-26529/.s.monetdb.31480" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-merge-partitions/BUILD/var/MonetDB/mTests_sql_test_merge-partitions"
 "--set" "embedded_c=true"
+# 10:47:20 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-merge-partitions/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# 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  mapi_open = true
+# cmdline opt  mapi_port = 31480
+# cmdline opt  mapi_usock = /var/tmp/mtest-26529/.s.monetdb.31480
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-merge-partitions/BUILD/var/MonetDB/mTests_sql_test_merge-partitions
+# cmdline opt  embedded_c = true
+# cmdline opt  gdk_debug = 553648138
+
+# 10:47:20 >  
+# 10:47:20 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-26529" "--port=31480"
+# 10:47:20 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-26529/.s.monetdb.31480
+QUERY = CREATE MERGE TABLE testme (a int, b varchar(32)) PARTITION BY RANGE 
USING (iamdummy(a)); --error
+ERROR = !SELECT: no such unary operator 'iamdummy(int)'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-26529/.s.monetdb.31480
+QUERY = ALTER TABLE testme ADD TABLE subtable3 AS PARTITION BETWEEN 'abc' AND 
'cde'; --error
+ERROR = !ALTER TABLE: error while parsing minimum value
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-26529/.s.monetdb.31480
+QUERY = INSERT INTO testme VALUES (12, 'this'), (6, 'not'), (50, 'ok'); --error
+ERROR = !INSERT: the insert violates the partition range of values
+CODE  = M0M29
+MAPI  = (monetdb) /var/tmp/mtest-26529/.s.monetdb.31480
+QUERY = INSERT INTO subtable1 VALUES (2, 'seventh'); --error
+ERROR = !INSERT: table sys.subtable1 is part of merge table sys.testme and the 
insert violates the partition range of values
+CODE  = M0M29
+
+# 10:47:21 >  
+# 10:47:21 >  "Done."
+# 10:47:21 >  
+
diff --git a/sql/test/merge-partitions/Tests/mergepart20.stable.out 
b/sql/test/merge-partitions/Tests/mergepart20.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-partitions/Tests/mergepart20.stable.out
@@ -0,0 +1,160 @@
+stdout of test 'mergepart20` in directory 'sql/test/merge-partitions` itself:
+
+
+# 10:47:20 >  
+# 10:47:20 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=31480" "--set" 
"mapi_usock=/var/tmp/mtest-26529/.s.monetdb.31480" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-merge-partitions/BUILD/var/MonetDB/mTests_sql_test_merge-partitions"
 "--set" "embedded_c=true"
+# 10:47:20 >  
+
+# MonetDB 5 server v11.30.0
+# This is an unreleased version
+# Serving database 'mTests_sql_test_merge-partitions', using 8 threads
+# Compiled for x86_64-pc-linux-gnu/64bit with 128bit integers
+# Found 15.492 GiB available main-memory.
+# Copyright (c) 1993 - July 2008 CWI.
+# Copyright (c) August 2008 - 2018 MonetDB B.V., all rights reserved
+# Visit https://www.monetdb.org/ for further information
+# Listening for connection requests on 
mapi:monetdb://dhcp-193.eduroam.cwi.nl:31480/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-26529/.s.monetdb.31480
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+# SQL catalog created, loading sql scripts once
+# loading sql script: 09_like.sql
+# loading sql script: 10_math.sql
+# loading sql script: 11_times.sql
+# loading sql script: 12_url.sql
+# loading sql script: 13_date.sql
+# loading sql script: 14_inet.sql
+# loading sql script: 15_querylog.sql
+# loading sql script: 16_tracelog.sql
+# loading sql script: 17_temporal.sql
+# loading sql script: 18_index.sql
+# loading sql script: 20_vacuum.sql
+# loading sql script: 21_dependency_functions.sql
+# loading sql script: 21_dependency_views.sql
+# loading sql script: 22_clients.sql
+# loading sql script: 23_skyserver.sql
+# loading sql script: 25_debug.sql
+# loading sql script: 26_sysmon.sql
+# loading sql script: 27_rejects.sql
+# loading sql script: 39_analytics.sql
+# loading sql script: 39_analytics_hge.sql
+# loading sql script: 40_geom.sql
+# loading sql script: 40_json.sql
+# loading sql script: 40_json_hge.sql
+# loading sql script: 41_md5sum.sql
+# loading sql script: 45_uuid.sql
+# loading sql script: 46_profiler.sql
+# loading sql script: 51_sys_schema_extension.sql
+# loading sql script: 60_wlcr.sql
+# loading sql script: 72_fits.sql
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to