sql parser: support []-identifiers

git-svn-id: trunk@46424 -
(cherry picked from commit 0ca6707e95)
This commit is contained in:
ondrej 2020-08-14 10:32:37 +00:00 committed by marcoonthegit
parent 431ac990a1
commit ffe7475cb4
2 changed files with 23 additions and 4 deletions

View File

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

View File

@ -235,6 +235,7 @@ type
procedure TestIdentifier3; procedure TestIdentifier3;
procedure TestIdentifier4; procedure TestIdentifier4;
procedure TestIdentifier5; procedure TestIdentifier5;
procedure TestIdentifier6;
procedure TestIdentifierDotIdentifier; procedure TestIdentifierDotIdentifier;
procedure TestEOLN; procedure TestEOLN;
procedure TestEOLN2; procedure TestEOLN2;
@ -1382,7 +1383,7 @@ begin
CheckToken(tsqlSequence,'sequence'); CheckToken(tsqlSequence,'sequence');
end; end;
procedure TTestSQLScanner.CheckTokens(ASource : String; ATokens : Array of TSQLToken); procedure TTestSQLScanner.CheckTokens(ASource: String; ATokens: array of TSQLToken);
Var Var
I : Integer; I : Integer;
@ -1440,6 +1441,13 @@ begin
CheckToken(tsqlSymbolString,'$0'); CheckToken(tsqlSymbolString,'$0');
end; 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; procedure TTestSQLScanner.TestIdentifierDotIdentifier;
begin begin
CheckTokens('something.different',[tsqlIdentifier,tsqldot,tsqlIdentifier]); CheckTokens('something.different',[tsqlIdentifier,tsqldot,tsqlIdentifier]);