Changeset: 0480d530edcf for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0480d530edcf
Modified Files:
        monetdb5/mal/mal_parser.c
Branch: int128
Log Message:

MAL parser: enabled parsing of 128-bit literals


diffs (102 lines):

diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c
--- a/monetdb5/mal/mal_parser.c
+++ b/monetdb5/mal/mal_parser.c
@@ -403,7 +403,6 @@ int
 cstToken(Client cntxt, ValPtr cst)
 {
        int i = 0;
-       lng l;
        int hex = 0;
        str s = CURRENT(cntxt);
 
@@ -500,7 +499,7 @@ cstToken(Client cntxt, ValPtr cst)
                }
                if (*s == '@') {
                        int len = (int) sizeof(lng);
-                       lng *pval = &l;
+                       lng l, *pval = &l;
                        lngFromStr(CURRENT(cntxt), &len, &pval);
                        if (l == lng_nil || l < 0
 #if SIZEOF_OID < SIZEOF_LNG
@@ -520,9 +519,6 @@ cstToken(Client cntxt, ValPtr cst)
                        return i;
                }
                if (*s == 'L') {
-#ifdef HAVE_HGE
-                       assert(cst->vtype != TYPE_hge);
-#endif
                        if (cst->vtype == TYPE_int)
                                cst->vtype = TYPE_lng;
                        if (cst->vtype == TYPE_flt)
@@ -554,17 +550,58 @@ cstToken(Client cntxt, ValPtr cst)
                        }
                        return i;
                }
+#ifdef HAVE_HGE
+               if (*s == 'H' && cst->vtype == TYPE_int) {
+                       int len = i;
+                       hge *pval = 0;
+                       cst->vtype = TYPE_hge;
+                       i++;
+                       s++;
+                       if (*s == 'H') {
+                               i++;
+                               s++;
+                       }
+                       hgeFromStr(CURRENT(cntxt), &len, &pval);
+                       if (pval) {
+                               cst->val.hval = *pval;
+                               GDKfree(pval);
+                       } else
+                               cst->val.hval = 0;
+                       return i;
+               }
+#endif
 handleInts:
+               assert(cst->vtype != TYPE_lng);
 #ifdef HAVE_HGE
                assert(cst->vtype != TYPE_hge);
 #endif
-               if (cst->vtype == TYPE_int || cst->vtype == TYPE_lng) {
+               if (cst->vtype == TYPE_int) {
+#ifdef HAVE_HGE
+                       int len = (int) sizeof(hge);
+                       hge l, *pval = &l;
+                       if (hgeFromStr(CURRENT(cntxt), &len, &pval) <= 0 || l 
== hge_nil)
+                               l = hge_nil;
+
+                       if ((hge) GDK_int_min <= l && l <= (hge) GDK_int_max) {
+                               cst->vtype = TYPE_int;
+                               cst->val.ival = (int) l;
+                       } else
+                       if ((hge) GDK_lng_min <= l && l <= (hge) GDK_lng_max) {
+                               cst->vtype = TYPE_lng;
+                               cst->val.lval = (lng) l;
+                       } else {
+                               cst->vtype = TYPE_hge;
+                               cst->val.hval = l;
+                               if (l == hge_nil)
+                                       showException(cntxt->fdout, SYNTAX, 
"convertConstant", "integer parse error");
+                       }
+#else
                        int len = (int) sizeof(lng);
-                       lng *pval = &l;
-                       if (lngFromStr(CURRENT(cntxt), &len, &pval) <= 0 || l 
== lng_nil) 
+                       lng l, *pval = &l;
+                       if (lngFromStr(CURRENT(cntxt), &len, &pval) <= 0 || l 
== lng_nil)
                                l = lng_nil;
-                       
-                       if (INT_MIN < l && l <= INT_MAX) {
+
+                       if ((lng) GDK_int_min <= l && l <= (lng) GDK_int_max) {
                                cst->vtype = TYPE_int;
                                cst->val.ival = (int) l;
                        } else {
@@ -573,6 +610,7 @@ handleInts:
                                if (l == lng_nil)
                                        showException(cntxt->fdout, SYNTAX, 
"convertConstant", "integer parse error");
                        }
+#endif
                }
                return i;
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to