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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list