Browse Source

fcl-db: parse float .3 and -.3

mattias 4 weeks ago
parent
commit
c307108748
2 changed files with 28 additions and 19 deletions
  1. 22 19
      packages/fcl-db/src/sql/fpsqlscanner.pp
  2. 6 0
      packages/fcl-db/tests/tcparser.pas

+ 22 - 19
packages/fcl-db/src/sql/fpsqlscanner.pp

@@ -590,10 +590,9 @@ Var
 
 begin
   TokenStart := TokenStr;
-  IsFloat:=False;
+  IsFloat := false;
   while true do
     begin
-    Inc(TokenStr);
     case TokenStr[0] of
       'x':
         If (TokenStart[0]='0') and ((TokenStr-TokenStart)=1) then
@@ -630,6 +629,7 @@ begin
       else
         break;
     end;
+    Inc(TokenStr);
   end;
   Len:=TokenStr-TokenStart;
   Setlength(FCurTokenString, Len);
@@ -765,12 +765,12 @@ begin
         Error(SErrUnknownToken,['`']);
       end;
     '0'..'9':
-       Result:=DoNumericLiteral;
+      Result:=DoNumericLiteral;
     '?':
-       begin
-       Inc(TokenStr);
-       Result:=tsqlPlaceHolder;
-       end;
+      begin
+      Inc(TokenStr);
+      Result:=tsqlPlaceHolder;
+      end;
     '!':
       begin
       Inc(TokenStr);
@@ -841,12 +841,13 @@ begin
     '-':
       begin
       Inc(TokenStr);
-      If (TokenStr[0]='-') then
+      If (TokenStr^='-') then
         begin
         Inc(TokenStr);
         Result:=DoSingleLineComment
         end
-      else if (TokenStr[0] in ['0'..'9']) then
+      else if (TokenStr^ in ['0'..'9'])
+          or ((TokenStr^='.') and (TokenStr[1] in ['0'..'9'])) then
         begin
         Result:=DoNumericLiteral;
         If (Result in [tsqlIntegerNumber,tsqlFloatNumber]) then
@@ -856,14 +857,16 @@ begin
         Result := tsqlMinus;
       end;
     '.':
-      begin
-      Inc(TokenStr);
-      if TokenStr^='.' then
+      case TokenStr[1] of
+      '.':
         begin
-        Inc(TokenStr);
+        Inc(TokenStr,2);
         Result := tsqlDotDot;
-        end
+        end;
+      '0'..'9':
+        Result := DoNumericLiteral;
       else
+        inc(TokenStr);
         Result := tsqlDot;
       end;
     ':':
@@ -911,11 +914,11 @@ begin
    'a'..'z',
    'A'..'Z', '_':
      Result:=DoIdentifier;
-   else
-     // Symbol of some sort
-     Result:=DoSymbolString;
-     //Error(SErrUnknownToken,[TokenStr[0]]);
-   end; // Case
+  else
+    // Symbol of some sort
+    Result:=DoSymbolString;
+    //Error(SErrUnknownToken,[TokenStr[0]]);
+  end; // Case
   Until (Not (Result in [tsqlComment,tsqlWhitespace])) or
         ((Result=tsqlComment) and (soReturnComments in options)) or
         ((Result=tsqlWhiteSpace) and (soReturnWhiteSpace in Options));

+ 6 - 0
packages/fcl-db/tests/tcparser.pas

@@ -497,6 +497,7 @@ type
     procedure TestWhereAny;
     procedure TestWhereSome;
     procedure TestWhereInRange;
+    procedure TestWhereDotFloat;
     procedure TestParam;
     procedure TestParam_Underscore;
     procedure TestParamExpr;
@@ -5331,6 +5332,11 @@ begin
   TestSelect('SELECT A FROM B WHERE A IN (4..6)');
 end;
 
+procedure TTestSelectParser.TestWhereDotFloat;
+begin
+  TestSelect('SELECT A FROM B WHERE (A + .3 > -.5)');
+end;
+
 procedure TTestSelectParser.TestParam;
 
 Var