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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org