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

Reply via email to