Changeset: b2b9d5737695 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b2b9d5737695
Modified Files:
        sql/server/sql_parser.y
Branch: stratified_sampling
Log Message:

Revert parser change.


diffs (59 lines):

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
@@ -4669,25 +4669,45 @@ literal:
                  sql_find_subtype(&t, "boolean", 0, 0 );
                  $$ = _newAtomNode( atom_bool(SA, &t, TRUE)); }
  | sqlDBL
-               {
-                       sql_subtype *t= sql_bind_localtype("dbl");
+               { char *s = strip_extra_zeros(sa_strdup(SA, $1));
+                 char *dot = strchr(s, '.');
+                 int digits = _strlen(s) - 1;
+                 int scale = digits - (int) (dot-s);
+                 sql_subtype t;
+
+                 if (digits <= 0)
+                       digits = 1;
+                 if (digits <= MAX_DEC_DIGITS) {
+                       double val = strtod($1,NULL);
+#ifdef HAVE_HGE
+                       hge value = decimal_from_str(s, NULL);
+#else
+                       lng value = decimal_from_str(s, NULL);
+#endif
+
+                       if (*s == '+' || *s == '-')
+                               digits --;
+                       sql_find_subtype(&t, "decimal", digits, scale );
+                       $$ = _newAtomNode( atom_dec(SA, &t, value, val));
+                  } else {
+                       char *p = $1;
                        double val;
-                       char *p = $1;
-                       
+
                        errno = 0;
                        val = strtod($1,&p);
-                       if(errno) {
-                               char *msg = sql_message("\b22003!double value 
could not be parsed (%s)", $1);
-                               
+                       if (p == $1 || val == dbl_nil || (errno == ERANGE && 
(val < -1 || val > 1))) {
+                               char *msg = sql_message("\b22003!double value 
too large or not a number (%s)", $1);
+
                                yyerror(m, msg);
                                _DELETE(msg);
                                $$ = NULL;
                                YYABORT;
                        }
-                       
-                       $$ = _newAtomNode( atom_float(SA, t, val));
+                       sql_find_subtype(&t, "double", 51, 0 );
+                       $$ = _newAtomNode(atom_float(SA, &t, val));
+                  }
                }
- ;
+;
 
 interval_expression:
    INTERVAL opt_sign string interval_qualifier { 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to