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