Changeset: 3a257ec17a80 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3a257ec17a80
Modified Files:
        sql/common/sql_types.c
        sql/server/sql_atom.c
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/test/BugTracker-2013/Tests/oid_handling.stable.err
        sql/test/BugTracker-2013/Tests/oid_handling.stable.out
Branch: default
Log Message:

implement OID parsing


diffs (221 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -1212,13 +1212,14 @@ sqltypeinit( sql_allocator *sa)
 
        BTE = *t++ = sql_create_type(sa, "TINYINT",   8, SCALE_FIX, 2, EC_NUM, 
"bte");
        SHT = *t++ = sql_create_type(sa, "SMALLINT", 16, SCALE_FIX, 2, EC_NUM, 
"sht");
-       OID = *t++ = sql_create_type(sa, "OID", 31, 0, 2, EC_NUM, "oid");
        INT = *t++ = sql_create_type(sa, "INT",      32, SCALE_FIX, 2, EC_NUM, 
"int");
 #if SIZEOF_WRD == SIZEOF_INT
+       OID = *t++ = sql_create_type(sa, "OID", 31, 0, 2, EC_NUM, "oid");
        WRD = *t++ = sql_create_type(sa, "WRD", 32, SCALE_FIX, 2, EC_NUM, 
"wrd");
 #endif
        LNG = *t++ = sql_create_type(sa, "BIGINT",   64, SCALE_FIX, 2, EC_NUM, 
"lng");
 #if SIZEOF_WRD == SIZEOF_LNG
+       OID = *t++ = sql_create_type(sa, "OID", 63, 0, 2, EC_NUM, "oid");
        WRD = *t++ = sql_create_type(sa, "WRD", 64, SCALE_FIX, 2, EC_NUM, 
"wrd");
 #endif
 
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -99,6 +99,9 @@ atom_int( sql_allocator *sa, sql_subtype
                case TYPE_wrd:
                        a->data.val.wval = (wrd) val;
                        break;
+               case TYPE_oid:
+                       a->data.val.oval = (oid) val;
+                       break;
                case TYPE_lng:
                        a->data.val.lval = val;
                        break;
@@ -130,6 +133,9 @@ atom_get_int(atom *a)
                case TYPE_int:
                        r = a->data.val.ival;
                        break;
+               case TYPE_oid:
+                       r = a->data.val.oval;
+                       break;
                case TYPE_wrd:
                        r = a->data.val.wval;
                        break;
@@ -271,6 +277,9 @@ atom2string(sql_allocator *sa, atom *a)
        case TYPE_wrd:
                sprintf(buf, SSZFMT, a->data.val.wval);
                break;
+       case TYPE_oid:
+               sprintf(buf, SSZFMT "@0", a->data.val.oval);
+               break;
        case TYPE_int:
                sprintf(buf, "%d", a->data.val.ival);
                break;
@@ -544,6 +553,7 @@ atom_cast(atom *a, sql_subtype *tp)
                                break;
                        case TYPE_int:
 #if SIZEOF_WRD == SIZEOF_INT
+                       case TYPE_oid:
                        case TYPE_wrd:
 #endif
                                if (at->type->localtype == TYPE_bte) 
@@ -555,6 +565,7 @@ atom_cast(atom *a, sql_subtype *tp)
                                break;
                        case TYPE_lng:
 #if SIZEOF_WRD == SIZEOF_LNG
+                       case TYPE_oid:
                        case TYPE_wrd:
 #endif
                                if (at->type->localtype == TYPE_bte) 
@@ -592,6 +603,7 @@ atom_cast(atom *a, sql_subtype *tp)
                                break;
                        case TYPE_int:
 #if SIZEOF_WRD == SIZEOF_INT
+                       case TYPE_oid:
                        case TYPE_wrd:
 #endif
                                if (at->type->localtype == TYPE_bte) 
@@ -603,6 +615,7 @@ atom_cast(atom *a, sql_subtype *tp)
                                break;
                        case TYPE_lng:
 #if SIZEOF_WRD == SIZEOF_LNG
+                       case TYPE_oid:
                        case TYPE_wrd:
 #endif
                                if (at->type->localtype == TYPE_bte) 
@@ -719,6 +732,7 @@ atom_cast(atom *a, sql_subtype *tp)
                                break;
                        case TYPE_int:
 #if SIZEOF_WRD == SIZEOF_INT
+                       case TYPE_oid:
                        case TYPE_wrd:
 #endif
                                if (at->type->localtype == TYPE_bte) 
@@ -730,6 +744,7 @@ atom_cast(atom *a, sql_subtype *tp)
                                break;
                        case TYPE_lng:
 #if SIZEOF_WRD == SIZEOF_LNG
+                       case TYPE_oid:
                        case TYPE_wrd:
 #endif
                                if (at->type->localtype == TYPE_bte) 
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -460,7 +460,7 @@ int yydebug=1;
 
 /* sql prefixes to avoid name clashes on various architectures */
 %token <sval>
-       IDENT aTYPE ALIAS AGGR AGGR2 RANK sqlINT HEXADECIMAL INTNUM APPROXNUM 
+       IDENT aTYPE ALIAS AGGR AGGR2 RANK sqlINT OIDNUM HEXADECIMAL INTNUM 
APPROXNUM 
        USING 
        GLOBAL CAST CONVERT
        CHARACTER VARYING LARGE OBJECT VARCHAR CLOB sqlTEXT BINARY sqlBLOB
@@ -3996,6 +3996,37 @@ literal:
                        $$ = _newAtomNode( atom_int(SA, &t, res));
                  }
                }
+ |  OIDNUM
+               { int err = 0, len = sizeof(lng);
+                 lng value, *p = &value;
+                 sql_subtype t;
+
+                 lngFromStr($1, &len, &p);
+                 if (value == lng_nil)
+                       err = 2;
+
+                 if (!err) {
+                   if ((value > GDK_lng_min && value <= GDK_lng_max))
+#if SIZEOF_OID == SIZEOF_INT
+                         sql_find_subtype(&t, "oid", 31, 0 );
+#else
+                         sql_find_subtype(&t, "oid", 63, 0 );
+#endif
+                   else
+                         err = 1;
+                 }
+
+                 if (err) {
+                       char *msg = sql_message("\b22003!OID value too large or 
not a number (%s)", $1);
+
+                       yyerror(m, msg);
+                       _DELETE(msg);
+                       $$ = NULL;
+                       YYABORT;
+                 } else {
+                       $$ = _newAtomNode( atom_int(SA, &t, value));
+                 }
+               }
  |  sqlINT
                { int digits = _strlen($1), err = 0, len = sizeof(lng);
                  lng value, *p = &value;
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -721,6 +721,13 @@ number(mvc * c, int cur)
                if (isdigit(cur))
                        while ((cur = scanner_getc(lc)) != EOF && isdigit(cur)) 
                                ;
+               if (cur == '@') {
+                       token = OIDNUM;
+                       cur = scanner_getc(lc);
+                       if (cur == '0')
+                               cur = scanner_getc(lc);
+               }
+
                if (cur == '.') {
                        token = INTNUM;
        
@@ -1053,7 +1060,7 @@ sqllex(YYSTYPE * yylval, void *parm)
                mnstr_write(lc->log, lc->rs->buf+pos, lc->rs->pos + lc->yycur - 
pos, 1);
 
        /* Don't include literals in the calculation of the key */
-       if (token != STRING && token != sqlINT && token != INTNUM && token != 
APPROXNUM && token != sqlNULL)
+       if (token != STRING && token != sqlINT && token != OIDNUM && token != 
INTNUM && token != APPROXNUM && token != sqlNULL)
                lc->key ^= token;
        lc->started += (token != EOF);
        return token;
diff --git a/sql/test/BugTracker-2013/Tests/oid_handling.stable.err 
b/sql/test/BugTracker-2013/Tests/oid_handling.stable.err
--- a/sql/test/BugTracker-2013/Tests/oid_handling.stable.err
+++ b/sql/test/BugTracker-2013/Tests/oid_handling.stable.err
@@ -28,14 +28,8 @@ stderr of test 'oid_handling` in directo
 # 20:25:02 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-26643" "--port=34073"
 # 20:25:02 >  
 
-MAPI  = (monetdb) /var/tmp/mtest-26643/.s.monetdb.34073
-QUERY = insert into oidtable values( 123@0);
 
-MAPI  = (monetdb) /var/tmp/mtest-26643/.s.monetdb.34073
-QUERY = select * from oidtable where o in (123@0,234);
+# 17:15:17 >  
+# 17:15:17 >  "Done."
+# 17:15:17 >  
 
-
-# 20:25:02 >  
-# 20:25:02 >  "Done."
-# 20:25:02 >  
-
diff --git a/sql/test/BugTracker-2013/Tests/oid_handling.stable.out 
b/sql/test/BugTracker-2013/Tests/oid_handling.stable.out
--- a/sql/test/BugTracker-2013/Tests/oid_handling.stable.out
+++ b/sql/test/BugTracker-2013/Tests/oid_handling.stable.out
@@ -26,11 +26,18 @@ Ready.
 # 20:25:02 >  
 
 #create table oidtable( o oid);
+#insert into oidtable values( 123@0);
+[ 1    ]
 #insert into oidtable values (234);
 [ 1    ]
+#select * from oidtable where o in (123@0,234);
+% sys.oidtable # table_name
+% o # name
+% oid # type
+% 5 # length
+[ 123@0        ]
+[ 234@0        ]
 #drop table oidtable;
-#
-THIS NEEDS A PROPER TEST
 
 # 20:25:02 >  
 # 20:25:02 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to