Browse Source

sql parser: support SELECT without a FROM clause

git-svn-id: trunk@46438 -
ondrej 5 years ago
parent
commit
98036f52be
2 changed files with 22 additions and 2 deletions
  1. 4 2
      packages/fcl-db/src/sql/fpsqlparser.pas
  2. 18 0
      packages/fcl-db/tests/tcparser.pas

+ 4 - 2
packages/fcl-db/src/sql/fpsqlparser.pas

@@ -504,8 +504,8 @@ begin
         GetNextToken;
         end;
       end;
-    Expect([tsqlComma,tsqlFrom]);
-  until (CurrentToken=tsqlFROM);
+    Expect([tsqlComma,tsqlFrom,tsqlEOF]);
+  until (CurrentToken in [tsqlFROM,tsqlEOF]);
 end;
 
 procedure TSQLParser.ParseGroupBy(AParent: TSQLSelectStatement;
@@ -719,6 +719,8 @@ begin
       Result.TransactionName:=CreateIdentifier(Result,CurrentTokenString);
       end;
     ParseSelectFieldList(Result,Result.Fields,sfSingleton in Flags);
+    If CurrentToken=tsqlEOF then
+      Exit;
     // On return, we are on the FROM keyword.
     ParseFromClause(Result,Result.Tables);
     If CurrentToken=tsqlWhere then

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

@@ -493,6 +493,7 @@ type
     procedure TestWhereSome;
     procedure TestParam;
     procedure TestParamExpr;
+    procedure TestNoTable;
     procedure TestSourcePosition;
   end;
 
@@ -4769,6 +4770,23 @@ begin
   AssertAggregateExpression(H.Left,afCount,'C',aoNone);
 end;
 
+procedure TTestSelectParser.TestNoTable;
+
+Var
+  F : TSQLSelectField;
+  L : TSQLIntegerLiteral;
+
+begin
+  TestSelect('SELECT 1');
+  AssertEquals('0 tables in select',0,Select.Tables.Count);
+  AssertEquals('1 field in select',1,Select.Fields.Count);
+  AssertNotNull('Have field',Select.Fields[0]);
+  F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
+  AssertNotNull('Have field expresssion,',F.Expression);
+  L:=TSQLIntegerLiteral(AssertLiteralExpr('Field is a literal',F.Expression,TSQLIntegerLiteral));
+  AssertEquals('SELECT 1',1,L.Value);
+end;
+
 procedure TTestSelectParser.TestUnionSimple;
 
 Var