Changeset: d45ff40b4030 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d45ff40b4030
Modified Files:
clients/Tests/MAL-signatures-hge.test
gdk/gdk_select.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/server/rel_optimize_sel.c
sql/server/rel_propagate.c
sql/test/merge-partitions/Tests/mergepart26.test
sql/test/merge-partitions/Tests/mergepart30.test
Branch: Dec2023
Log Message:
get min/max from parent.
Fixed checking of range/value list for partitioned tables, this is
now done always before adding the partition to the merge table
diffs (truncated from 511 to 300 lines):
diff --git a/clients/Tests/MAL-signatures-hge.test
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -50340,7 +50340,12 @@ SQLwindow_bound;
computes window ranges for each row
sqlcatalog
alter_add_range_partition
-pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int):void
+pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int, X_8:bat[:lng]):void
+SQLalter_add_range_partition;
+Catalog operation alter_add_range_partition
+sqlcatalog
+alter_add_range_partition
+pattern sqlcatalog.alter_add_range_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:any_1, X_5:any_1, X_6:bit, X_7:int, X_8:lng):void
SQLalter_add_range_partition;
Catalog operation alter_add_range_partition
sqlcatalog
@@ -50350,12 +50355,22 @@ SQLalter_add_table;
Catalog operation alter_add_table
sqlcatalog
alter_add_value_partition
-pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:bit, X_5:int):void
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:bit, X_5:int, X_6:bat[:lng]):void
SQLalter_add_value_partition;
Catalog operation alter_add_value_partition
sqlcatalog
alter_add_value_partition
-pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:bit, X_5:int, X_6:any...):void
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:bit, X_5:int, X_6:bat[:lng], X_7:any...):void
+SQLalter_add_value_partition;
+Catalog operation alter_add_value_partition
+sqlcatalog
+alter_add_value_partition
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:bit, X_5:int, X_6:lng):void
+SQLalter_add_value_partition;
+Catalog operation alter_add_value_partition
+sqlcatalog
+alter_add_value_partition
+pattern sqlcatalog.alter_add_value_partition(X_0:str, X_1:str, X_2:str,
X_3:str, X_4:bit, X_5:int, X_6:lng, X_7:any...):void
SQLalter_add_value_partition;
Catalog operation alter_add_value_partition
sqlcatalog
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1211,6 +1211,7 @@ BATrange(BATiter *bi, const void *tl, co
const ValRecord *minprop = NULL, *maxprop = NULL;
const void *minval = NULL, *maxval = NULL;
bool maxincl = true;
+ BAT *pb = NULL;
int c;
int (*atomcmp) (const void *, const void *) = ATOMcompare(bi->type);
@@ -1234,6 +1235,27 @@ BATrange(BATiter *bi, const void *tl, co
maxval = VALptr(maxprop);
maxincl = false;
}
+ if (minprop == NULL || maxprop == NULL) {
+ if (VIEWtparent(bi->b) &&
+ (pb = BATdescriptor(VIEWtparent(bi->b))) != NULL) {
+ bool keep = false;
+ MT_lock_set(&pb->theaplock);
+ if (minprop == NULL && (minprop = BATgetprop_nolock(pb,
GDK_MIN_BOUND)) != NULL) {
+ keep = true;
+ minval = VALptr(minprop);
+ }
+ if (maxprop == NULL && (maxprop = BATgetprop_nolock(pb,
GDK_MAX_BOUND)) != NULL) {
+ keep = true;
+ maxval = VALptr(maxprop);
+ maxincl = true;
+ }
+ if (!keep) {
+ MT_lock_unset(&pb->theaplock);
+ BBPreclaim(pb);
+ pb = NULL;
+ }
+ }
+ }
if (minprop == NULL && maxprop == NULL) {
range = range_inside; /* strictly: unknown */
@@ -1318,6 +1340,11 @@ BATrange(BATiter *bi, const void *tl, co
}
}
+ if (pb) {
+ MT_lock_unset(&pb->theaplock);
+ BBPreclaim(pb);
+ }
+
MT_lock_unset(&bi->b->theaplock);
return range;
}
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
@@ -6032,9 +6032,12 @@ pattern("sql", "decypher", SQLdecypher,
pattern("sqlcatalog", "alter_add_table", SQLalter_add_table, false, "Catalog
operation alter_add_table", args(0,5,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("action",int))),
pattern("sqlcatalog", "alter_del_table", SQLalter_del_table, false, "Catalog
operation alter_del_table", args(0,5,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("action",int))),
pattern("sqlcatalog", "alter_set_table", SQLalter_set_table, false, "Catalog
operation alter_set_table", args(0,3,
arg("sname",str),arg("tnme",str),arg("access",int))),
- pattern("sqlcatalog", "alter_add_range_partition",
SQLalter_add_range_partition, false, "Catalog operation
alter_add_range_partition", args(0,8,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),argany("min",1),argany("max",1),arg("nills",bit),arg("update",int))),
- pattern("sqlcatalog", "alter_add_value_partition",
SQLalter_add_value_partition, false, "Catalog operation
alter_add_value_partition", args(0,6,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("nills",bit),arg("update",int))),
- pattern("sqlcatalog", "alter_add_value_partition",
SQLalter_add_value_partition, false, "Catalog operation
alter_add_value_partition", args(0,7,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("nills",bit),arg("update",int),varargany("arg",0))),
+ pattern("sqlcatalog", "alter_add_range_partition",
SQLalter_add_range_partition, false, "Catalog operation
alter_add_range_partition", args(0,9,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),argany("min",1),argany("max",1),arg("nills",bit),arg("update",int),arg("assert",lng))),
+ pattern("sqlcatalog", "alter_add_range_partition",
SQLalter_add_range_partition, false, "Catalog operation
alter_add_range_partition", args(0,9,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),argany("min",1),argany("max",1),arg("nills",bit),arg("update",int),batarg("assert",lng))),
+ pattern("sqlcatalog", "alter_add_value_partition",
SQLalter_add_value_partition, false, "Catalog operation
alter_add_value_partition", args(0,7,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("nills",bit),arg("update",int),arg("assert",lng))),
+ pattern("sqlcatalog", "alter_add_value_partition",
SQLalter_add_value_partition, false, "Catalog operation
alter_add_value_partition", args(0,8,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("nills",bit),arg("update",int),arg("assert",lng),
varargany("arg",0))),
+ pattern("sqlcatalog", "alter_add_value_partition",
SQLalter_add_value_partition, false, "Catalog operation
alter_add_value_partition", args(0,7,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("nills",bit),arg("update",int),batarg("assert",lng))),
+ pattern("sqlcatalog", "alter_add_value_partition",
SQLalter_add_value_partition, false, "Catalog operation
alter_add_value_partition", args(0,8,
arg("sname",str),arg("mtnme",str),arg("psnme",str),arg("ptnme",str),arg("nills",bit),arg("update",int),batarg("assert",lng),
varargany("arg",0))),
pattern("sqlcatalog", "comment_on", SQLcomment_on, false, "Catalog operation
comment_on", args(0,2, arg("objid",int),arg("remark",str))),
pattern("sqlcatalog", "rename_schema", SQLrename_schema, false, "Catalog
operation rename_schema", args(0,2, arg("sname",str),arg("newnme",str))),
pattern("sqlcatalog", "rename_table", SQLrename_table, false, "Catalog
operation rename_table", args(0,4,
arg("osname",str),arg("nsname",str),arg("otname",str),arg("ntname",str))),
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
@@ -228,9 +228,10 @@ alter_table_add_table(mvc *sql, char *ms
return msg;
}
+
static char *
alter_table_add_range_partition(mvc *sql, char *msname, char *mtname, char
*psname, char *ptname, ptr min, ptr max,
- bit with_nills,
int update)
+ bit with_nills,
int update, lng cnt)
{
sql_table *mt = NULL, *pt = NULL;
sql_part *err = NULL;
@@ -239,8 +240,7 @@ alter_table_add_range_partition(mvc *sql
size_t length = 0;
sql_subtype tpe;
- if ((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname,
-
&mt, &pt, update))) {
+ 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 (!isRangePartitionTable(mt)) {
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
@@ -268,6 +268,16 @@ alter_table_add_range_partition(mvc *sql
goto finish;
}
+ if (cnt) {
+ if (isPartitionedByColumnTable(mt)) {
+ throw(SQL, "sql.alter_table_add_range_partition",
SQLSTATE(M0M29) "ALTER TABLE: there are values in column %s outside the
partition range", mt->part.pcol->base.name);
+ } else if (isPartitionedByExpressionTable(mt)) {
+ throw(SQL, "sql.alter_table_add_range_partition",
SQLSTATE(M0M29) "ALTER TABLE: there are values in the expression outside the
partition range");
+ } else {
+ assert(0);
+ }
+ }
+
errcode = sql_trans_add_range_partition(sql->session->tr, mt, pt, tpe,
min, max, with_nills, update, &err);
switch (errcode) {
case 0:
@@ -366,7 +376,7 @@ finish:
static char *
alter_table_add_value_partition(mvc *sql, MalStkPtr stk, InstrPtr pci, char
*msname, char *mtname, char *psname,
- char *ptname,
bit with_nills, int update)
+ char *ptname,
bit with_nills, int update, lng cnt)
{
sql_table *mt = NULL, *pt = NULL;
str msg = MAL_SUCCEED;
@@ -392,13 +402,24 @@ alter_table_add_value_partition(mvc *sql
}
find_partition_type(&tpe, mt);
- ninserts = pci->argc - pci->retc - 6;
+ ninserts = pci->argc - pci->retc - 7;
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;
}
+
+ if (cnt) {
+ if (isPartitionedByColumnTable(mt)) {
+ throw(SQL, "sql.alter_table_add_value_partition",
SQLSTATE(M0M29) "ALTER TABLE: there are values in column %s outside the
partition list of values", mt->part.pcol->base.name);
+ } else if (isPartitionedByExpressionTable(mt)) {
+ throw(SQL, "sql.alter_table_add_value_partition",
SQLSTATE(M0M29) "ALTER TABLE: there are values in the expression outside the
partition list of values");
+ } else {
+ assert(0);
+ }
+ }
+
values = list_create((fdestroy) &part_value_destroy);
- for ( i = pci->retc+6; i < pci->argc; i++){
+ for ( i = pci->retc+7; i < pci->argc; i++){
sql_part_value *nextv = NULL;
ValRecord *vnext = &(stk)->stk[(pci)->argv[i]];
ptr pnext = VALget(vnext);
@@ -1966,9 +1987,20 @@ SQLalter_add_range_partition(Client cntx
ValRecord *max = &(stk)->stk[(pci)->argv[6]];
bit with_nills = *getArgReference_bit(stk, pci, 7);
int update = *getArgReference_int(stk, pci, 8);
+ lng cnt = 0;
+
+ if (getArgType(mb, pci, 9) == TYPE_lng) {
+ cnt = *getArgReference_lng(stk, pci, 9);
+ } else {
+ BAT *c = BATdescriptor(*getArgReference_bat(stk, pci, 9));
+ if (c && BATcount(c) == 1)
+ cnt = *(lng*)Tloc(c, 0);
+ if (c)
+ BBPunfix(c->batCacheid);
+ }
initcontext();
- msg = alter_table_add_range_partition(sql, sname, mtname, psname,
ptname, VALget(min), VALget(max), with_nills, update);
+ msg = alter_table_add_range_partition(sql, sname, mtname, psname,
ptname, VALget(min), VALget(max), with_nills, update, cnt);
return msg;
}
@@ -1982,9 +2014,20 @@ SQLalter_add_value_partition(Client cntx
char *ptname = SaveArgReference(stk, pci, 4);
bit with_nills = *getArgReference_bit(stk, pci, 5);
int update = *getArgReference_int(stk, pci, 6);
+ lng cnt = 0;
+
+ if (getArgType(mb, pci, 7) == TYPE_lng) {
+ cnt = *getArgReference_lng(stk, pci, 7);
+ } else {
+ BAT *c = BATdescriptor(*getArgReference_bat(stk, pci, 7));
+ if (c && BATcount(c) == 1)
+ cnt = *(lng*)Tloc(c, 0);
+ if (c)
+ BBPunfix(c->batCacheid);
+ }
initcontext();
- msg = alter_table_add_value_partition(sql, stk, pci, sname, mtname,
psname, ptname, with_nills, update);
+ msg = alter_table_add_value_partition(sql, stk, pci, sname, mtname,
psname, ptname, with_nills, update, cnt);
return msg;
}
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -2397,6 +2397,11 @@ rel_join_order_(visitor *v, sql_rel *rel
{
if (!rel)
return rel;
+ /*
+ if (is_join(rel->op))
+ rel = reorder_join(v, rel);
+ return rel;
+ */
switch (rel->op) {
case op_basetable:
@@ -2454,6 +2459,10 @@ rel_join_order(visitor *v, global_props
{
(void) gp;
return rel_join_order_(v, rel);
+ /*
+ rel = rel_visitor_bottomup(v, rel, &rel_join_order_);
+ return rel;
+ */
}
run_optimizer
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -112,20 +112,6 @@ rel_generate_anti_insert_expression(mvc
return res;
}
-static void
-generate_alter_table_error_message(char* buf, sql_table *mt)
-{
- char *s1 = isRangePartitionTable(mt) ? "range":"list of values";
- if (isPartitionedByColumnTable(mt)) {
- sql_column* col = mt->part.pcol;
- snprintf(buf, BUFSIZ, "ALTER TABLE: there are values in column
%s outside the partition %s", col->base.name, s1);
- } else if (isPartitionedByExpressionTable(mt)) {
- snprintf(buf, BUFSIZ, "ALTER TABLE: there are values in the
expression outside the partition %s", s1);
- } else {
- assert(0);
- }
-}
-
static sql_exp *
generate_partition_limits(sql_query *query, sql_rel **r, symbol *s,
sql_subtype tpe, bool nilok)
{
@@ -164,14 +150,13 @@ generate_partition_limits(sql_query *que
}
}
-static sql_rel*
+static sql_exp*
create_range_partition_anti_rel(sql_query* query, sql_table *mt, sql_table
*pt, bit with_nills, sql_exp *pmin, sql_exp *pmax, bool all_ranges, bool
max_equal_min)
{
mvc *sql = query->sql;
sql_rel *anti_rel;
- sql_exp *exception, *aggr, *anti_exp = NULL, *anti_le, *e1, *e2,
*anti_nils;
+ sql_exp *aggr, *anti_exp = NULL, *anti_le, *e1, *e2, *anti_nils;
sql_subfunc *cf = sql_bind_func(sql, "sys", "count",
sql_bind_localtype("void"), NULL, F_AGGR, true);
- char buf[BUFSIZ];
sql_subtype tpe;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]