Browse Source

sql parser: support "SELECT 'a' 'b'" syntax (MSSQL)

git-svn-id: trunk@46472 -
(cherry picked from commit 0b440758eacb6fa3d0f38c13ab0daba7f5d40dc8)
ondrej 5 years ago
parent
commit
6659ca26e5
2 changed files with 20 additions and 2 deletions
  1. 2 2
      packages/fcl-db/src/sql/fpsqlparser.pas
  2. 18 0
      packages/fcl-db/tests/tcparser.pas

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

@@ -501,11 +501,11 @@ begin
       F:=TSQLSelectField(CreateElement(TSQLSelectField,AParent));
       AList.Add(F);
       F.Expression:=Expression;
-      If CurrentToken in [tsqlAs,Tsqlidentifier] then
+      If CurrentToken in [tsqlAs,Tsqlidentifier,tsqlString] then
         begin
         If currentToken=tsqlAs then
           GetNextToken;
-        Expect(tsqlIdentifier);
+        Expect([tsqlIdentifier,tsqlString]);
         F.AliasName:=CreateIdentifier(F,CurrentTokenString);
         GetNextToken;
         end;

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

@@ -419,6 +419,7 @@ type
     procedure TestSelectTwoFieldsThreeBracketTablesJoin;
     procedure TestSelectTableWithSchema;
     procedure TestSelectFieldWithSchema;
+    procedure TestSelectFieldAsStringLiteral;
     procedure TestSelectFirst;
     procedure TestSelectFirstSkip;
     procedure TestSelectTop;
@@ -3839,6 +3840,23 @@ begin
   AssertException(ESQLParser,@TestParseError);
 end;
 
+procedure TTestSelectParser.TestSelectFieldAsStringLiteral;
+
+Var
+  F : TSQLSelectField;
+  L : TSQLStringLiteral;
+
+begin
+  TestSelect('SELECT ''B'' ''C'''); // 'B' as 'C'
+  AssertEquals('One field',1,Select.Fields.Count);
+  F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
+  AssertNotNull('Have field expresssion,',F.Expression);
+  L:=TSQLStringLiteral(AssertLiteralExpr('Field is a literal',F.Expression,TSQLStringLiteral));
+  AssertEquals('Field literal is B','B',L.Value);
+  AssertEquals('Field alias is C','C',F.AliasName.Name);
+  AssertEquals('No table',0,Select.Tables.Count);
+end;
+
 procedure TTestSelectParser.TestSelectFieldWithSchema;
 
 Var