Changeset: e4026dc87123 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e4026dc87123
Added Files:
sql/test/merge-partitions/Tests/mergepart03.stable.err
sql/test/merge-partitions/Tests/mergepart03.stable.out
sql/test/merge-partitions/Tests/mergepart04.sql
sql/test/merge-partitions/Tests/mergepart04.stable.err
sql/test/merge-partitions/Tests/mergepart04.stable.out
Modified Files:
sql/backends/monet5/sql_cat.c
sql/test/merge-partitions/Tests/All
sql/test/merge-partitions/Tests/mergepart03.sql
Branch: merge-partitions
Log Message:
When adding a table partition, validate if the column's inout is according to
the range or list of values of the partition
diffs (truncated from 526 to 300 lines):
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -148,11 +148,13 @@ alter_table_add_range_partition(mvc *sql
sql_table *mt = NULL, *pt = NULL;
sql_part *err = NULL;
str msg = MAL_SUCCEED, err_min = NULL, err_max = NULL;
- sql_column *col = NULL;
- int tp1 = 0, errcode = 0;
+ sql_column *col = NULL, *bcol = NULL;
+ BAT *diff1 = NULL, *diff2 = NULL, *cbind = NULL;
+ int tp1 = 0, errcode = 0, i = 0;
ptr pmin = NULL, pmax = NULL;
size_t smin = 0, smax = 0, serr_min = 0, serr_max = 0;
ssize_t (*atomtostr)(str *, size_t *, const void *);
+ int accesses[3] = {RDONLY, RD_INS, RD_UPD_VAL};
if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname, &mt,
&pt)))
return msg;
@@ -178,6 +180,45 @@ alter_table_add_range_partition(mvc *sql
goto finish;
}
+ bcol = mvc_bind_column(sql, pt, col->base.name);
+
+ for(i = 0 ; i < 3 ; i++) {
+ if(cbind) {
+ BBPunfix(cbind->batCacheid);
+ cbind = NULL;
+ }
+ if(diff1) {
+ BBPunfix(diff1->batCacheid);
+ diff1 = NULL;
+ }
+ if(diff2) {
+ BBPunfix(diff2->batCacheid);
+ diff2 = NULL;
+ }
+ if((cbind = store_funcs.bind_col(sql->session->tr, bcol,
accesses[i])) == NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if((diff1 = BATthetaselect(cbind, NULL, pmin, "<")) == NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if(BATcount(diff1) > 0) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
+ "ALTER
TABLE: there are values in the column %s with values lesser than the partition
minimum", col->base.name);
+ goto finish;
+ }
+ if((diff2 = BATthetaselect(cbind, NULL, pmax, ">")) == NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if(BATcount(diff2) > 0) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
+ "ALTER
TABLE: there are values in the column %s with values higher than the partition
maximum", col->base.name);
+ goto finish;
+ }
+ }
+
errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, tp1,
pmin, smin, pmax, smax, &err);
switch(errcode) {
case -1:
@@ -210,6 +251,12 @@ alter_table_add_range_partition(mvc *sql
}
finish:
+ if(cbind)
+ BBPunfix(cbind->batCacheid);
+ if(diff1)
+ BBPunfix(diff1->batCacheid);
+ if(diff2)
+ BBPunfix(diff2->batCacheid);
if(msg) {
if(pmin)
GDKfree(pmin);
@@ -224,11 +271,12 @@ alter_table_add_value_partition(mvc *sql
{
sql_table *mt = NULL, *pt = NULL;
str msg = MAL_SUCCEED;
- sql_column *col = NULL;
+ sql_column *col = NULL, *bcol = NULL;
sql_part *err = NULL;
int tp1 = 0, errcode = 0, i = 0, ninserts = 0;
- BAT *b = NULL, *sorted = NULL/*, *cbind = NULL, *diff = NULL*/;
+ BAT *b = NULL, *sorted = NULL, *cbind = NULL, *diff = NULL;
gdk_return ret = GDK_SUCCEED;
+ int accesses[3] = {RDONLY, RD_INS, RD_UPD_VAL};
if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_value_partition", msname, mtname, psname, ptname, &mt,
&pt)))
return msg;
@@ -275,6 +323,31 @@ alter_table_add_value_partition(mvc *sql
goto finish;
}
+ bcol = mvc_bind_column(sql, pt, col->base.name);
+ for(i = 0 ; i < 3 ; i++) {
+ if(cbind) {
+ BBPunfix(cbind->batCacheid);
+ cbind = NULL;
+ }
+ if(diff) {
+ BBPunfix(diff->batCacheid);
+ diff = NULL;
+ }
+ if((cbind = store_funcs.bind_col(sql->session->tr, bcol,
accesses[i])) == NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if((diff = BATdiff(cbind, sorted, NULL, NULL, 0, BUN_NONE)) ==
NULL) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto finish;
+ }
+ if(BATcount(diff) > 0) {
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+ "ALTER
TABLE: there are values in the column %s not according to the partition values
list", col->base.name);
+ goto finish;
+ }
+ }
+
errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt, tp1,
sorted, &err);
switch(errcode) {
case 0:
@@ -294,10 +367,10 @@ alter_table_add_value_partition(mvc *sql
finish:
if(b)
BBPunfix(b->batCacheid);
- /*if(cbind)
+ if(cbind)
+ BBPunfix(cbind->batCacheid);
+ if(diff)
BBPunfix(diff->batCacheid);
- if(diff)
- BBPunfix(diff->batCacheid);*/
if(sorted && msg)
BBPunfix(sorted->batCacheid);
else if(sorted)
diff --git a/sql/test/merge-partitions/Tests/All
b/sql/test/merge-partitions/Tests/All
--- a/sql/test/merge-partitions/Tests/All
+++ b/sql/test/merge-partitions/Tests/All
@@ -2,3 +2,4 @@ mergepart00
mergepart01
mergepart02
mergepart03
+mergepart04
diff --git a/sql/test/merge-partitions/Tests/mergepart03.sql
b/sql/test/merge-partitions/Tests/mergepart03.sql
--- a/sql/test/merge-partitions/Tests/mergepart03.sql
+++ b/sql/test/merge-partitions/Tests/mergepart03.sql
@@ -7,11 +7,17 @@ ALTER TABLE listparts ADD TABLE subtable
SELECT COUNT(*) from range_partitions;
ROLLBACK;
+INSERT INTO subtable2 VALUES (1, 'hello');
+
SELECT COUNT(*) from range_partitions;
ALTER TABLE listparts ADD TABLE subtable2 AS PARTITION BETWEEN '-4' AND '12';
SELECT COUNT(*) from range_partitions;
ALTER TABLE listparts DROP TABLE subtable2;
+
+INSERT INTO subtable2 VALUES (-5, 'oh no');
+ALTER TABLE listparts ADD TABLE subtable2 AS PARTITION BETWEEN '-1' AND 12000;
--error
+
SELECT COUNT(*) from range_partitions;
DROP TABLE listparts;
diff --git a/sql/test/merge-partitions/Tests/mergepart03.stable.err
b/sql/test/merge-partitions/Tests/mergepart03.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-partitions/Tests/mergepart03.stable.err
@@ -0,0 +1,40 @@
+stderr of test 'mergepart03` in directory 'sql/test/merge-partitions` itself:
+
+
+# 14:10:54 >
+# 14:10:54 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=32409" "--set"
"mapi_usock=/var/tmp/mtest-5513/.s.monetdb.32409" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-merge-partitions/BUILD/var/MonetDB/mTests_sql_test_merge-partitions"
"--set" "embedded_r=yes" "--set" "embedded_py=true"
+# 14:10:54 >
+
+# 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 = 32409
+# cmdline opt mapi_usock = /var/tmp/mtest-5513/.s.monetdb.32409
+# 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_r = yes
+# cmdline opt embedded_py = true
+# cmdline opt gdk_debug = 553648138
+
+# 14:10:55 >
+# 14:10:55 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-5513" "--port=32409"
+# 14:10:55 >
+
+MAPI = (monetdb) /var/tmp/mtest-5513/.s.monetdb.32409
+QUERY = ALTER TABLE listparts ADD TABLE subtable2 AS PARTITION BETWEEN '-1'
AND 12000; --error
+ERROR = !ALTER TABLE: there are values in the column a with values lesser than
the partition minimum
+CODE = 42000
+
+# 14:10:55 >
+# 14:10:55 > "Done."
+# 14:10:55 >
+
diff --git a/sql/test/merge-partitions/Tests/mergepart03.stable.out
b/sql/test/merge-partitions/Tests/mergepart03.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-partitions/Tests/mergepart03.stable.out
@@ -0,0 +1,114 @@
+stdout of test 'mergepart03` in directory 'sql/test/merge-partitions` itself:
+
+
+# 14:10:54 >
+# 14:10:54 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=32409" "--set"
"mapi_usock=/var/tmp/mtest-5513/.s.monetdb.32409" "--set" "monet_prompt="
"--forcemito"
"--dbpath=/home/ferreira/repositories/MonetDB-merge-partitions/BUILD/var/MonetDB/mTests_sql_test_merge-partitions"
"--set" "embedded_r=yes" "--set" "embedded_py=true"
+# 14:10:54 >
+
+# 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-23.eduroam.cwi.nl:32409/
+# Listening for UNIX domain connection requests on
mapi:monetdb:///var/tmp/mtest-5513/.s.monetdb.32409
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+# MonetDB/Python2 module loaded
+# MonetDB/R 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
+# loading sql script: 74_netcdf.sql
+# loading sql script: 75_lidar.sql
+# loading sql script: 75_shp.sql
+# loading sql script: 75_storagemodel.sql
+# loading sql script: 80_statistics.sql
+# loading sql script: 80_udf.sql
+# loading sql script: 80_udf_hge.sql
+# loading sql script: 85_bam.sql
+# loading sql script: 90_generator.sql
+# loading sql script: 90_generator_hge.sql
+# loading sql script: 97_comments.sql
+# loading sql script: 99_system.sql
+
+# 14:10:55 >
+# 14:10:55 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-5513" "--port=32409"
+# 14:10:55 >
+
+#CREATE MERGE TABLE listparts (a int, b varchar(32)) PARTITION BY RANGE (a);
+#CREATE TABLE subtable1 (a int, b varchar(32));
+#CREATE TABLE subtable2 (a int, b varchar(32));
+#START TRANSACTION;
+#ALTER TABLE listparts ADD TABLE subtable1 AS PARTITION BETWEEN '-4' AND '12';
+#SELECT COUNT(*) from range_partitions;
+% .L22 # table_name
+% L21 # name
+% bigint # type
+% 1 # length
+[ 1 ]
+#ROLLBACK;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list