Changeset: 05c641b3abb4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=05c641b3abb4
Added Files:
        sql/test/merge-partitions/Tests/mergepart18.sql
        sql/test/merge-partitions/Tests/mergepart18.stable.err
        sql/test/merge-partitions/Tests/mergepart18.stable.out
        sql/test/merge-partitions/Tests/mergepart19.sql
        sql/test/merge-partitions/Tests/mergepart19.stable.err
        sql/test/merge-partitions/Tests/mergepart19.stable.out
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        monetdb5/modules/mal/wlc.mal
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sqlcatalog.mal
        sql/backends/monet5/wlr.mal
        sql/include/sql_catalog.h
        sql/server/rel_schema.c
        sql/server/sql_parser.y
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/merge-partitions/Tests/All
Branch: merge-partitions
Log Message:

Implemented partition range/list of values update. The grammar is the follows: 
ALTER TABLE parent SET TABLE child AS PARTITION ...

Also fixed a bug in the partition by range, where previously the partitions 
list was kept in order, but the transaction manager wouldn't recognize new 
partitions if they were not appended at the end of the list. The list is no 
longer ordered so the transaction manager will always recognize properly.


diffs (truncated from 1222 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -10951,9 +10951,10 @@ Ready.
 [ "sqlblob",   "#tostr",       "command sqlblob.#tostr():void ",       
"SQLBLOBtostr;",        ""      ]
 [ "sqlblob",   "sqlblob",      "command sqlblob.sqlblob(s:sqlblob):sqlblob ",  
"BLOBblob_blob;",       "Noop routine." ]
 [ "sqlblob",   "sqlblob",      "command sqlblob.sqlblob(s:str):sqlblob ",      
"BLOBsqlblob_fromstr;", ""      ]
-[ "sqlcatalog",        "alter_add_range_partition",    "pattern 
sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, min:str, max:str, nills:int):void ",  
"SQLalter_add_range_partition;",        "Catalog operation 
alter_add_range_partition"   ]
+[ "sqlcatalog",        "alter_add_range_partition",    "pattern 
sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, min:str, max:str, nills:int, update:int):void ",      
"SQLalter_add_range_partition;",        "Catalog operation 
alter_add_range_partition"   ]
 [ "sqlcatalog",        "alter_add_table",      "pattern 
sqlcatalog.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, 
action:int):void ",     "SQLalter_add_table;",  "Catalog operation 
alter_add_table"     ]
-[ "sqlcatalog",        "alter_add_value_partition",    "pattern 
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, arg:str...):void ",   "SQLalter_add_value_partition;",        
"Catalog operation alter_add_value_partition"   ]
+[ "sqlcatalog",        "alter_add_value_partition",    "pattern 
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, nills:int, update:int):void ",        
"SQLalter_add_value_partition;",        "Catalog operation 
alter_add_value_partition"   ]
+[ "sqlcatalog",        "alter_add_value_partition",    "pattern 
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, nills:int, update:int, arg:str...):void ",    
"SQLalter_add_value_partition;",        "Catalog operation 
alter_add_value_partition"   ]
 [ "sqlcatalog",        "alter_del_table",      "pattern 
sqlcatalog.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, 
action:int):void ",     "SQLalter_del_table;",  "Catalog operation 
alter_del_table"     ]
 [ "sqlcatalog",        "alter_seq",    "pattern 
sqlcatalog.alter_seq(sname:str, seqname:str, seq:ptr, val:lng):void ", 
"SQLalter_seq;",        "Catalog operation alter_seq"   ]
 [ "sqlcatalog",        "alter_set_table",      "pattern 
sqlcatalog.alter_set_table(sname:str, tnme:str, access:int):void ",    
"SQLalter_set_table;",  "Catalog operation alter_set_table"     ]
@@ -11174,9 +11175,10 @@ Ready.
 [ "wkba",      "#tostr",       "command wkba.#tostr():void ",  "wkbaTOSTR;",   
""      ]
 [ "wkba",      "#write",       "command wkba.#write():void ",  "wkbaWRITE;",   
""      ]
 [ "wlc",       "action",       "pattern wlc.action(q:str):void ",      
"WLCaction;",   "Keep the database changing queries for replay. "       ]
-[ "wlc",       "alter_add_range_partition",    "pattern 
wlc.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int):void ", "WLCgeneric;",  "Catalog operation 
alter_add_range_partition"   ]
+[ "wlc",       "alter_add_range_partition",    "pattern 
wlc.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int):void ",     "WLCgeneric;",  "Catalog 
operation alter_add_range_partition"   ]
 [ "wlc",       "alter_add_table",      "pattern wlc.alter_add_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLCgeneric;",  
"Catalog operation alter_add_table"     ]
-[ "wlc",       "alter_add_value_partition",    "pattern 
wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
arg:str...):void ",  "WLCgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlc",       "alter_add_value_partition",    "pattern 
wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int):void ",       "WLCgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlc",       "alter_add_value_partition",    "pattern 
wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int, arg:str...):void ",   "WLCgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
 [ "wlc",       "alter_del_table",      "pattern wlc.alter_del_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLCgeneric;",  
"Catalog operation alter_del_table"     ]
 [ "wlc",       "alter_seq",    "pattern wlc.alter_seq(sname:str, seqname:str, 
val:lng):void ", "WLCgeneric;",  "Catalog operation alter_seq"   ]
 [ "wlc",       "alter_set_table",      "pattern wlc.alter_set_table(sname:str, 
tnme:str, access:int):void ",   "WLCgeneric;",  "Catalog operation 
alter_set_table"     ]
@@ -11235,9 +11237,10 @@ Ready.
 [ "wlc",       "transaction_rollback", "pattern 
wlc.transaction_rollback(chain:int, name:str):void ",  "WLCgeneric;",  "A 
transaction statement (type can be commit,release,rollback or start)"        ]
 [ "wlc",       "update",       "pattern wlc.update(sname:str, tname:str, 
cname:str, tid:any, val:any):int ",   "WLCupdate;",   "Keep the update in the 
workload-capture-replay list"   ]
 [ "wlr",       "action",       "pattern wlr.action(q:str):void ",      
"WLRaction;",   "A query producing updates"     ]
-[ "wlr",       "alter_add_range_partition",    "pattern 
wlr.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int):void ", "WLRgeneric;",  "Catalog operation 
alter_add_range_partition"   ]
+[ "wlr",       "alter_add_range_partition",    "pattern 
wlr.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int):void ",     "WLRgeneric;",  "Catalog 
operation alter_add_range_partition"   ]
 [ "wlr",       "alter_add_table",      "pattern wlr.alter_add_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLRgeneric;",  
"Catalog operation alter_add_table"     ]
-[ "wlr",       "alter_add_value_partition",    "pattern 
wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
arg:str...):void ",  "WLRgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlr",       "alter_add_value_partition",    "pattern 
wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int):void ",       "WLRgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlr",       "alter_add_value_partition",    "pattern 
wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int, arg:str...):void ",   "WLRgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
 [ "wlr",       "alter_del_table",      "pattern wlr.alter_del_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLRgeneric;",  
"Catalog operation alter_del_table"     ]
 [ "wlr",       "alter_seq",    "pattern wlr.alter_seq(sname:str, seqname:str, 
val:lng):void ", "WLRgeneric;",  "Catalog operation alter_seq"   ]
 [ "wlr",       "alter_set_table",      "pattern wlr.alter_set_table(sname:str, 
tnme:str, access:int):void ",   "WLRgeneric;",  "Catalog operation 
alter_set_table"     ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -15164,9 +15164,10 @@ Ready.
 [ "sqlblob",   "#tostr",       "command sqlblob.#tostr():void ",       
"SQLBLOBtostr;",        ""      ]
 [ "sqlblob",   "sqlblob",      "command sqlblob.sqlblob(s:sqlblob):sqlblob ",  
"BLOBblob_blob;",       "Noop routine." ]
 [ "sqlblob",   "sqlblob",      "command sqlblob.sqlblob(s:str):sqlblob ",      
"BLOBsqlblob_fromstr;", ""      ]
-[ "sqlcatalog",        "alter_add_range_partition",    "pattern 
sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, min:str, max:str, nills:int):void ",  
"SQLalter_add_range_partition;",        "Catalog operation 
alter_add_range_partition"   ]
+[ "sqlcatalog",        "alter_add_range_partition",    "pattern 
sqlcatalog.alter_add_range_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, min:str, max:str, nills:int, update:int):void ",      
"SQLalter_add_range_partition;",        "Catalog operation 
alter_add_range_partition"   ]
 [ "sqlcatalog",        "alter_add_table",      "pattern 
sqlcatalog.alter_add_table(sname:str, mtnme:str, psnme:str, ptnme:str, 
action:int):void ",     "SQLalter_add_table;",  "Catalog operation 
alter_add_table"     ]
-[ "sqlcatalog",        "alter_add_value_partition",    "pattern 
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, arg:str...):void ",   "SQLalter_add_value_partition;",        
"Catalog operation alter_add_value_partition"   ]
+[ "sqlcatalog",        "alter_add_value_partition",    "pattern 
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, nills:int, update:int):void ",        
"SQLalter_add_value_partition;",        "Catalog operation 
alter_add_value_partition"   ]
+[ "sqlcatalog",        "alter_add_value_partition",    "pattern 
sqlcatalog.alter_add_value_partition(sname:str, mtnme:str, psnme:str, 
ptnme:str, nills:int, update:int, arg:str...):void ",    
"SQLalter_add_value_partition;",        "Catalog operation 
alter_add_value_partition"   ]
 [ "sqlcatalog",        "alter_del_table",      "pattern 
sqlcatalog.alter_del_table(sname:str, mtnme:str, psnme:str, ptnme:str, 
action:int):void ",     "SQLalter_del_table;",  "Catalog operation 
alter_del_table"     ]
 [ "sqlcatalog",        "alter_seq",    "pattern 
sqlcatalog.alter_seq(sname:str, seqname:str, seq:ptr, val:lng):void ", 
"SQLalter_seq;",        "Catalog operation alter_seq"   ]
 [ "sqlcatalog",        "alter_set_table",      "pattern 
sqlcatalog.alter_set_table(sname:str, tnme:str, access:int):void ",    
"SQLalter_set_table;",  "Catalog operation alter_set_table"     ]
@@ -15388,9 +15389,10 @@ Ready.
 [ "wkba",      "#tostr",       "command wkba.#tostr():void ",  "wkbaTOSTR;",   
""      ]
 [ "wkba",      "#write",       "command wkba.#write():void ",  "wkbaWRITE;",   
""      ]
 [ "wlc",       "action",       "pattern wlc.action(q:str):void ",      
"WLCaction;",   "Keep the database changing queries for replay. "       ]
-[ "wlc",       "alter_add_range_partition",    "pattern 
wlc.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int):void ", "WLCgeneric;",  "Catalog operation 
alter_add_range_partition"   ]
+[ "wlc",       "alter_add_range_partition",    "pattern 
wlc.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int):void ",     "WLCgeneric;",  "Catalog 
operation alter_add_range_partition"   ]
 [ "wlc",       "alter_add_table",      "pattern wlc.alter_add_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLCgeneric;",  
"Catalog operation alter_add_table"     ]
-[ "wlc",       "alter_add_value_partition",    "pattern 
wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
arg:str...):void ",  "WLCgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlc",       "alter_add_value_partition",    "pattern 
wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int):void ",       "WLCgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlc",       "alter_add_value_partition",    "pattern 
wlc.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int, arg:str...):void ",   "WLCgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
 [ "wlc",       "alter_del_table",      "pattern wlc.alter_del_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLCgeneric;",  
"Catalog operation alter_del_table"     ]
 [ "wlc",       "alter_seq",    "pattern wlc.alter_seq(sname:str, seqname:str, 
val:lng):void ", "WLCgeneric;",  "Catalog operation alter_seq"   ]
 [ "wlc",       "alter_set_table",      "pattern wlc.alter_set_table(sname:str, 
tnme:str, access:int):void ",   "WLCgeneric;",  "Catalog operation 
alter_set_table"     ]
@@ -15449,9 +15451,10 @@ Ready.
 [ "wlc",       "transaction_rollback", "pattern 
wlc.transaction_rollback(chain:int, name:str):void ",  "WLCgeneric;",  "A 
transaction statement (type can be commit,release,rollback or start)"        ]
 [ "wlc",       "update",       "pattern wlc.update(sname:str, tname:str, 
cname:str, tid:any, val:any):int ",   "WLCupdate;",   "Keep the update in the 
workload-capture-replay list"   ]
 [ "wlr",       "action",       "pattern wlr.action(q:str):void ",      
"WLRaction;",   "A query producing updates"     ]
-[ "wlr",       "alter_add_range_partition",    "pattern 
wlr.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int):void ", "WLRgeneric;",  "Catalog operation 
alter_add_range_partition"   ]
+[ "wlr",       "alter_add_range_partition",    "pattern 
wlr.alter_add_range_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int):void ",     "WLRgeneric;",  "Catalog 
operation alter_add_range_partition"   ]
 [ "wlr",       "alter_add_table",      "pattern wlr.alter_add_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLRgeneric;",  
"Catalog operation alter_add_table"     ]
-[ "wlr",       "alter_add_value_partition",    "pattern 
wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
arg:str...):void ",  "WLRgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlr",       "alter_add_value_partition",    "pattern 
wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int):void ",       "WLRgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
+[ "wlr",       "alter_add_value_partition",    "pattern 
wlr.alter_add_value_partition(sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int, arg:str...):void ",   "WLRgeneric;",  "Catalog operation 
alter_add_value_partition"   ]
 [ "wlr",       "alter_del_table",      "pattern wlr.alter_del_table(sname:str, 
mtnme:str, psnme:str, ptnme:str, action:int):void ",    "WLRgeneric;",  
"Catalog operation alter_del_table"     ]
 [ "wlr",       "alter_seq",    "pattern wlr.alter_seq(sname:str, seqname:str, 
val:lng):void ", "WLRgeneric;",  "Catalog operation alter_seq"   ]
 [ "wlr",       "alter_set_table",      "pattern wlr.alter_set_table(sname:str, 
tnme:str, access:int):void ",   "WLRgeneric;",  "Catalog operation 
alter_set_table"     ]
diff --git a/monetdb5/modules/mal/wlc.mal b/monetdb5/modules/mal/wlc.mal
--- a/monetdb5/modules/mal/wlc.mal
+++ b/monetdb5/modules/mal/wlc.mal
@@ -222,7 +222,7 @@ pattern alter_set_table( sname:str, tnme
 address WLCgeneric
 comment "Catalog operation alter_set_table";
 
-pattern alter_add_range_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int)
+pattern alter_add_range_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int)
 address WLCgeneric
 comment "Catalog operation alter_add_range_partition";
 
@@ -246,10 +246,10 @@ unsafe pattern transaction()
 address WLCgeneric
 comment "Start an autocommit transaction";
 
-pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int)
+pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int)
 address WLCgeneric
 comment "Catalog operation alter_add_value_partition";
 
-pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, arg:str...)
+pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int, arg:str...)
 address WLCgeneric
 comment "Catalog operation alter_add_value_partition";
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
@@ -105,7 +105,8 @@ rel_check_tables(sql_table *nt, sql_tabl
 }
 
 static char*
-validate_alter_table_add_table(mvc *sql, char* call, char *msname, char 
*mtname, char *psname, char *ptname, sql_table **mt, sql_table **pt)
+validate_alter_table_add_table(mvc *sql, char* call, char *msname, char 
*mtname, char *psname, char *ptname,
+                                                          sql_table **mt, 
sql_table **pt, int update)
 {
        sql_schema *ms = mvc_bind_schema(sql, msname), *ps = 
mvc_bind_schema(sql, psname);
        sql_table *rmt = NULL, *rpt = NULL;
@@ -116,14 +117,16 @@ validate_alter_table_add_table(mvc *sql,
                rpt = mvc_bind_table(sql, ps, ptname);
        *mt = rmt;
        *pt = rpt;
-       if (rmt && (!isMergeTable(rmt) && !isReplicaTable(rmt)))
+       if (!update && rmt && (!isMergeTable(rmt) && !isReplicaTable(rmt)))
                throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: cannot add table 
'%s.%s' to table '%s.%s'", psname, ptname, msname, mtname);
        if (rmt && rpt) {
                char *msg;
                node *n = cs_find_id(&rmt->members, rpt->base.id);
 
-               if (n)
+               if (n && !update)
                        throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table 
'%s.%s' is already part of the MERGE TABLE '%s.%s'", psname, ptname, msname, 
mtname);
+               if(!n && update)
+                       throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: table 
'%s.%s' isn't part of the MERGE TABLE '%s.%s'", psname, ptname, msname, mtname);
                if ((msg = rel_check_tables(rmt, rpt)) != NULL)
                        return msg;
                return MAL_SUCCEED;
@@ -138,7 +141,7 @@ static char *
 alter_table_add_table(mvc *sql, char *msname, char *mtname, char *psname, char 
*ptname)
 {
        sql_table *mt = NULL, *pt = NULL;
-       str msg = validate_alter_table_add_table(sql, 
"sql.alter_table_add_table", msname, mtname, psname, ptname, &mt, &pt);
+       str msg = validate_alter_table_add_table(sql, 
"sql.alter_table_add_table", msname, mtname, psname, ptname, &mt, &pt, 0);
 
        if(msg == MAL_SUCCEED)
                sql_trans_add_table(sql->session->tr, mt, pt);
@@ -180,7 +183,8 @@ add_quotes(char *atom_str) /* always pro
 }
 
 static char *
-alter_table_add_range_partition(mvc *sql, char *msname, char *mtname, char 
*psname, char *ptname, char *min, char *max, int with_nills)
+alter_table_add_range_partition(mvc *sql, char *msname, char *mtname, char 
*psname, char *ptname, char *min, char *max,
+                                                               int with_nills, 
int update)
 {
        sql_table *mt = NULL, *pt = NULL;
        sql_part *err = NULL;
@@ -192,14 +196,14 @@ alter_table_add_range_partition(mvc *sql
        ssize_t (*atomtostr)(str *, size_t *, const void *);
        int free_pmin = 1, free_pmax = 1;
 
-       if((msg = validate_alter_table_add_table(sql, 
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname, &mt, 
&pt))) {
+       if((msg = validate_alter_table_add_table(sql, 
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname, &mt, 
&pt, update))) {
                return msg;
        } else if(mt->type != tt_range_partition) {
                msg = 
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
                                                                        "ALTER 
TABLE: cannot add range partition into a %s table",
                                                                        
(mt->type == tt_merge_table)?"merge":"list partition");
                goto finish;
-       } else if(pt->p) {
+       } else if(!update && pt->p) {
                msg = 
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
                                                                        "ALTER 
TABLE: table %s.%s is already part of another range partition table",
                                                                        psname, 
ptname);
@@ -271,7 +275,7 @@ alter_table_add_range_partition(mvc *sql
                free_pmax = 0;
        }
 
-       errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, 
col->type, pmin, smin, pmax, smax, with_nills, &err);
+       errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, 
col->type, pmin, smin, pmax, smax, with_nills, update, &err);
        switch(errcode) {
                case 0:
                        break;
@@ -327,7 +331,8 @@ finish:
 }
 
 static char *
-alter_table_add_value_partition(mvc *sql, MalStkPtr stk, InstrPtr pci, char 
*msname, char *mtname, char *psname, char *ptname, int with_nills)
+alter_table_add_value_partition(mvc *sql, MalStkPtr stk, InstrPtr pci, char 
*msname, char *mtname, char *psname,
+                                                               char *ptname, 
int with_nills, int update)
 {
        sql_table *mt = NULL, *pt = NULL;
        str msg = MAL_SUCCEED, escaped = NULL;
@@ -336,14 +341,14 @@ alter_table_add_value_partition(mvc *sql
        int tp1 = 0, errcode = 0, i = 0, ninserts = 0;
        list *values = list_new(sql->sa, (fdestroy) NULL);
 
-       if((msg = validate_alter_table_add_table(sql, 
"sql.alter_table_add_value_partition", msname, mtname, psname, ptname, &mt, 
&pt))) {
+       if((msg = validate_alter_table_add_table(sql, 
"sql.alter_table_add_value_partition", msname, mtname, psname, ptname, &mt, 
&pt, update))) {
                return msg;
        } else if(mt->type != tt_list_partition) {
                msg = 
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
                                                                        "ALTER 
TABLE: cannot add value partition into a %s table",
                                                                        
(mt->type == tt_merge_table)?"merge":"range partition");
                goto finish;
-       } else if(pt->p) {
+       } else if(!update && pt->p) {
                msg = 
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
                                                                        "ALTER 
TABLE: table %s.%s is already part of another list partition table",
                                                                        psname, 
ptname);
@@ -352,12 +357,12 @@ alter_table_add_value_partition(mvc *sql
 
        col = mt->pcol;
        tp1 = col->type.type->localtype;
-       ninserts = pci->argc - pci->retc - 5;
+       ninserts = pci->argc - pci->retc - 6;
        if(ninserts <= 0 && !with_nills) {
                msg = 
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000) 
"ALTER TABLE: no values in the list");
                goto finish;
        }
-       for( i = pci->retc+5; i < pci->argc; i++){
+       for( i = pci->retc+6; i < pci->argc; i++){
                ptr pnext = NULL;
                size_t len = 0;
                str next = *getArgReference_str(stk, pci, i);
@@ -409,7 +414,7 @@ alter_table_add_value_partition(mvc *sql
                GDKfree(pnext);
        }
 
-       errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt, 
col->type, values, with_nills, &err);
+       errcode = sql_trans_add_value_partition(sql->session->tr, mt, pt, 
col->type, values, with_nills, update, &err);
        switch(errcode) {
                case 0:
                        break;
@@ -1527,9 +1532,10 @@ SQLalter_add_range_partition(Client cntx
        char *min = *getArgReference_str(stk, pci, 5);
        char *max = *getArgReference_str(stk, pci, 6);
        int with_nills = *getArgReference_int(stk, pci, 7);
+       int update = *getArgReference_int(stk, pci, 8);
 
        initcontext();
-       msg = alter_table_add_range_partition(sql, sname, mtname, psname, 
ptname, min, max, with_nills);
+       msg = alter_table_add_range_partition(sql, sname, mtname, psname, 
ptname, min, max, with_nills, update);
        return msg;
 }
 
@@ -1542,9 +1548,10 @@ SQLalter_add_value_partition(Client cntx
        char *psname = SaveArgReference(stk, pci, 3);
        char *ptname = SaveArgReference(stk, pci, 4);
        int with_nills = *getArgReference_int(stk, pci, 5);
+       int update = *getArgReference_int(stk, pci, 6);
 
        initcontext();
-       msg = alter_table_add_value_partition(sql, stk, pci, sname, mtname, 
psname, ptname, with_nills);
+       msg = alter_table_add_value_partition(sql, stk, pci, sname, mtname, 
psname, ptname, with_nills, update);
        return msg;
 }
 
diff --git a/sql/backends/monet5/sqlcatalog.mal 
b/sql/backends/monet5/sqlcatalog.mal
--- a/sql/backends/monet5/sqlcatalog.mal
+++ b/sql/backends/monet5/sqlcatalog.mal
@@ -147,15 +147,15 @@ pattern alter_set_table( sname:str, tnme
 address SQLalter_set_table 
 comment "Catalog operation alter_set_table";
 
-pattern alter_add_range_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int)
+pattern alter_add_range_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int)
 address SQLalter_add_range_partition
 comment "Catalog operation alter_add_range_partition";
 
-pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int)
+pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int)
 address SQLalter_add_value_partition
 comment "Catalog operation alter_add_value_partition";
 
-pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, arg:str...)
+pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int, update:int, arg:str...)
 address SQLalter_add_value_partition
 comment "Catalog operation alter_add_value_partition";
 
diff --git a/sql/backends/monet5/wlr.mal b/sql/backends/monet5/wlr.mal
--- a/sql/backends/monet5/wlr.mal
+++ b/sql/backends/monet5/wlr.mal
@@ -227,7 +227,7 @@ pattern alter_set_table( sname:str, tnme
 address WLRgeneric
 comment "Catalog operation alter_set_table";
 
-pattern alter_add_range_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int)
+pattern alter_add_range_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
min:str, max:str, nills:int, update:int)
 address WLRgeneric
 comment "Catalog operation alter_add_range_partition";
 
@@ -251,10 +251,10 @@ unsafe pattern transaction()
 address WLRgeneric
 comment "Start an autocommit transaction";
 
-pattern alter_add_value_partition( sname:str, mtnme:str, psnme:str, ptnme:str, 
nills:int)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to