Changeset: 88e6bb266e81 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=88e6bb266e81 Modified Files: gdk/gdk.h gdk/gdk_calc.c gdk/gdk_value.c monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows monetdb5/mal/mal_instruction.c monetdb5/mal/mal_interpreter.c testing/Mfilter.py Branch: Nov2019 Log Message:
Treat TYPE_ptr value in ValRecord like any ordinary integer. This means, returning a pointer to the value in VALptr and VALget. Also, don't allow conversion to ptr. diffs (178 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -2284,6 +2284,7 @@ VALptr(const ValRecord *v) #ifdef HAVE_HGE case TYPE_hge: return (const void *) &v->val.hval; #endif + case TYPE_ptr: return (const void *) &v->val.pval; case TYPE_str: return (const void *) v->val.sval; default: return (const void *) v->val.pval; } diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -14433,6 +14433,12 @@ BATconvert(BAT *b, BAT *s, int tp, bool BATatoms[b->ttype].atomToStr == BATatoms[TYPE_str].atomToStr)) { return COLcopy(b, tp, false, TRANSIENT); } + if (ATOMstorage(tp) == TYPE_ptr) { + GDKerror("BATconvert: type combination (convert(%s)->%s) " + "not supported.\n", + ATOMname(b->ttype), ATOMname(tp)); + return NULL; + } bn = COLnew(b->hseqbase, tp, b->batCount, TRANSIENT); if (bn == NULL) @@ -14531,6 +14537,8 @@ VARconvert(ValPtr ret, const ValRecord * if (v->val.sval == NULL || strcmp(v->val.sval, str_nil) == 0) { if (VALinit(ret, ret->vtype, ATOMnilptr(ret->vtype)) == NULL) nils = BUN_NONE; + } else if (ATOMstorage(ret->vtype) == TYPE_ptr) { + nils = BUN_NONE + 1; } else { ssize_t l; size_t len; diff --git a/gdk/gdk_value.c b/gdk/gdk_value.c --- a/gdk/gdk_value.c +++ b/gdk/gdk_value.c @@ -102,6 +102,7 @@ VALget(ValPtr v) #ifdef HAVE_HGE case TYPE_hge: return (void *) &v->val.hval; #endif + case TYPE_ptr: return (void *) &v->val.pval; case TYPE_str: return (void *) v->val.sval; default: return (void *) v->val.pval; } @@ -317,6 +318,8 @@ VALisnil(const ValRecord *v) return is_dbl_nil(v->val.dval); case TYPE_oid: return is_oid_nil(v->val.oval); + case TYPE_ptr: + return v->val.pval == NULL; case TYPE_bat: return is_bat_nil(v->val.bval); default: diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out --- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out +++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out @@ -59,11 +59,11 @@ stdout of test 'opt_sql_append` in direc % .explain # table_name % mal # name % clob # type -% 180 # length +% 186 # length function user.s10_0():void; X_1:void := querylog.define("explain copy into ttt from \\'/tmp/xyz\\';":str, "sequential_pipe":str, 22:int); X_4:int := sql.mvc(); - (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(nil:ptr, "|":str, "\n":str, nil:str, "null":str, "/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); + (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(0x2e73790:ptr, "|":str, "\n":str, nil:str, "null":str, "/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); X_30:int := sql.append(X_4:int, "sys":str, "ttt":str, "a":str, X_26:bat[:int]); X_35:int := sql.append(X_30:int, "sys":str, "ttt":str, "b":str, X_27:bat[:int]); X_38:int := sql.append(X_35:int, "sys":str, "ttt":str, "c":str, X_28:bat[:int]); @@ -118,11 +118,11 @@ end user.s10_0; % .explain # table_name % mal # name % clob # type -% 180 # length +% 186 # length function user.s26_0():void; X_1:void := querylog.define("explain copy into ttt from \\'/tmp/xyz\\';":str, "user_0":str, 22:int); X_4:int := sql.mvc(); - (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(nil:ptr, "|":str, "\n":str, nil:str, "null":str, "/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); + (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(0x2e73790:ptr, "|":str, "\n":str, nil:str, "null":str, "/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); X_30:int := sql.append(X_4:int, "sys":str, "ttt":str, "a":str, X_26:bat[:int]); X_35:int := sql.append(X_30:int, "sys":str, "ttt":str, "b":str, X_27:bat[:int]); X_40:lng := aggr.count(X_28:bat[:int]); diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows --- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows +++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows @@ -74,7 +74,7 @@ stdout of test 'opt_sql_append` in direc function user.s10_0():void; X_1:void := querylog.define("explain copy into ttt from E\\'a:\\\\\\\\tmp/xyz\\';":str, "sequential_pipe":str, 22:int); X_4:int := sql.mvc(); - (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(nil:ptr, "|":str, "\n":str, nil:str, "null":str, "a:\\tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); + (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(0x2e73790:ptr, "|":str, "\n":str, nil:str, "null":str, "a:\\tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); X_30:int := sql.append(X_4:int, "sys":str, "ttt":str, "a":str, X_26:bat[:int]); X_35:int := sql.append(X_30:int, "sys":str, "ttt":str, "b":str, X_27:bat[:int]); X_38:int := sql.append(X_35:int, "sys":str, "ttt":str, "c":str, X_28:bat[:int]); @@ -129,7 +129,7 @@ end user.s10_0; function user.s26_0():void; X_1:void := querylog.define("explain copy into ttt from \\'Z:/tmp/xyz\\';":str, "user_0":str, 22:int); X_4:int := sql.mvc(); - (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(nil:ptr, "|":str, "\n":str, nil:str, "null":str, "Z:/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); + (X_26:bat[:int], X_27:bat[:int], X_28:bat[:int]) := sql.copy_from(0x2e73790:ptr,, "|":str, "\n":str, nil:str, "null":str, "Z:/tmp/xyz":str, -1:lng, 0:lng, 0:int, 0:int, nil:str, 0:int); X_30:int := sql.append(X_4:int, "sys":str, "ttt":str, "a":str, X_26:bat[:int]); X_35:int := sql.append(X_30:int, "sys":str, "ttt":str, "b":str, X_27:bat[:int]); X_40:lng := aggr.count(X_28:bat[:int]); diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c --- a/monetdb5/mal/mal_instruction.c +++ b/monetdb5/mal/mal_instruction.c @@ -1001,7 +1001,7 @@ convertConstant(int type, ValPtr vr) if (vr->vtype == TYPE_void) { VALclear(vr); vr->vtype = type; - vr->val.pval = 0; + vr->val.pval = NULL; return MAL_SUCCEED; } if (vr->vtype != type) diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c --- a/monetdb5/mal/mal_interpreter.c +++ b/monetdb5/mal/mal_interpreter.c @@ -1365,11 +1365,9 @@ str runMALsequence(Client cntxt, MalBlkP void garbageElement(Client cntxt, ValPtr v) { (void) cntxt; - if (v->vtype == TYPE_str) { - if (v->val.sval) { - GDKfree(v->val.sval); - v->val.sval = NULL; - } + if (ATOMstorage(v->vtype) == TYPE_str) { + GDKfree(v->val.sval); + v->val.sval = NULL; v->len = 0; } else if (v->vtype == TYPE_bat) { /* @@ -1390,8 +1388,7 @@ void garbageElement(Client cntxt, ValPtr return; BBPrelease(bid); } else if (0 < v->vtype && v->vtype < MAXATOMS && ATOMextern(v->vtype)) { - if (v->val.pval) - GDKfree(v->val.pval); + GDKfree(v->val.pval); v->val.pval = 0; v->len = 0; } diff --git a/testing/Mfilter.py b/testing/Mfilter.py --- a/testing/Mfilter.py +++ b/testing/Mfilter.py @@ -92,7 +92,7 @@ norm_in = re.compile('(?:'+')|(?:'.join r"^([Uu]sage: )(/.*/\.libs/|/.*/lt-|)([A-Za-z0-9_]+:?[ \t].*)\n", # 4: 3 r'^(ERROR = !.*Exception:remote\.[^:]*:\(mapi:monetdb://monetdb@)([^/]*)(/mTests_.*\).*)\n', # 5: 4 r"^(DBD::monetdb::db table_info warning: Catalog parameter c has to be an empty string, as MonetDB does not support multiple catalogs at )([\./].+/|[A-Z]:\\.+[/\\])([^/\\]+\.pl line \d+\.)\n", # 6: 3 - r'^(ERROR REPORTED: DBD:|SyntaxException:parseError)(:.+ at )([\./].+/|[A-Z]:[/\\].+[/\\])([^/\\]+\.pm line \d+\.)\n', # 7: 4 + r'^(ERROR REPORTED: DBD:|SyntaxException:parseError)(:.+ at )([\./].+/|[A-Z]:[/\\].+[/\\])([^/\\]+\.pm line \d+\.)\n', # 7: 4 # filter for geos 3.3 vs. geos 3.2, can be removed if we have 3.3 everywhere r"^(ERROR = !ParseException: Expected )('EMPTY' or '\(')( but encountered : '\)')\n", # 8: 3 # filter for AVG_of_SQRT.SF-2757642: result not always exactly 1.1 @@ -101,7 +101,8 @@ norm_in = re.compile('(?:'+')|(?:'.join r'^(\[.*POLYGON.*\(59\.0{16} 18\.0{16}, )(59\.0{16} 13\.0{16})(, 67\.0{16} 13\.0{16}, )(67\.0{16} 18\.0{16})(, 59\.0{16} 18\.0{16}\).*)', # 10: 5 # test geom/BugTracker/Tests/X_crash.SF-1971632.* might produce different error messages, depending on evaluation order r'^(ERROR = !MALException:geom.wkbGetCoordinate:Geometry ")(.*)(" not a Point)\n', # 11: 3 - r"^(QUERY = COPY\b.* INTO .* FROM *(?:\( *)?)(E?'.*')(.*)\n", # 12: 3 + r"^(QUERY = COPY\b.* INTO .* FROM *(?:\( *)?)(E?'.*')(.*)\n", # 12: 3 + r'^(.*)(0x[0-9a-fA-F]*:ptr)(.*)\n', # 13: 3 ])+')', re.MULTILINE) norm_hint = '# the original non-normalized output was: ' norm_out = ( @@ -117,6 +118,7 @@ norm_out = ( None, '67.0000000000000000 18.0000000000000000', None, '59.0000000000000000 13.0000000000000000', None, # 10: 5 None, '...', None, # 11: 3 None, '...', None, # 12: 3 + None, '0xXXXXXX:ptr', None, # 13: 3 ) # match "table_name" SQL table header line to normalize "(sys)?.L[0-9]*" to "(sys)?." _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list