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