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