Explorar el Código

sql parser: support []-identifiers

git-svn-id: trunk@46424 -
ondrej hace 5 años
padre
commit
0ca6707e95

+ 14 - 3
packages/fcl-db/src/sql/fpsqlscanner.pp

@@ -161,7 +161,8 @@ Type
                        soNoDoubleDelimIsChar,
                        soDoubleQuoteStringLiteral,  // Default: single quote is string literal
                        soSingleQuoteIdentifier,     // Default: double quote is identifier. Ignored if soDoubleQuoteStringLiteral is not specified
-                       soBackQuoteIdentifier        // Default: double quote is identifier
+                       soBackQuoteIdentifier,       // Default: double quote is identifier
+                       soSquareBracketsIdentifier   // Default: square brackets are not supported. (Enable for MSSQL support.)
                        );
   TSQLScannerOptions = Set of TSQLScannerOption;
 
@@ -513,6 +514,8 @@ Var
 
 begin
   Delim:=TokenStr[0];
+  if Delim='[' then
+    Delim:=']';
   Inc(TokenStr);
   TokenStart := TokenStr;
   OLen := 0;
@@ -792,8 +795,16 @@ begin
       end;
     '[':
       begin
-      Inc(TokenStr);
-      Result := tsqlSquareBraceOpen;
+      If (soSquareBracketsIdentifier in options) then
+        begin
+        Result:=DoStringLiteral;
+        Result:=tsqlIdentifier;
+        end
+      Else
+        begin
+        Inc(TokenStr);
+        Result := tsqlSquareBraceOpen;
+        end;
       end;
     ']':
       begin

+ 9 - 1
packages/fcl-db/tests/tcsqlscanner.pas

@@ -235,6 +235,7 @@ type
     procedure TestIdentifier3;
     procedure TestIdentifier4;
     procedure TestIdentifier5;
+    procedure TestIdentifier6;
     procedure TestIdentifierDotIdentifier;
     procedure TestEOLN;
     procedure TestEOLN2;
@@ -1382,7 +1383,7 @@ begin
   CheckToken(tsqlSequence,'sequence');
 end;
 
-procedure TTestSQLScanner.CheckTokens(ASource : String; ATokens : Array of TSQLToken);
+procedure TTestSQLScanner.CheckTokens(ASource: String; ATokens: array of TSQLToken);
 
 Var
   I : Integer;
@@ -1440,6 +1441,13 @@ begin
   CheckToken(tsqlSymbolString,'$0');
 end;
 
+procedure TTestSQLScanner.TestIdentifier6;
+begin
+  CreateScanner('[A]',[soSquareBracketsIdentifier]);
+  AssertEquals('Identifier is returned',tsqlIdentifier,FScanner.FetchToken);
+  AssertEquals('Correct identifier','A',FScanner.CurTokenString);
+end;
+
 procedure TTestSQLScanner.TestIdentifierDotIdentifier;
 begin
   CheckTokens('something.different',[tsqlIdentifier,tsqldot,tsqlIdentifier]);