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

Reply via email to