sql parser: add source position information to element lists

git-svn-id: trunk@46439 -
This commit is contained in:
ondrej 2020-08-14 19:56:36 +00:00
parent 98036f52be
commit 672e59317a
3 changed files with 35 additions and 4 deletions

View File

@ -421,6 +421,9 @@ Var
begin
// On entry, we are on the FROM keyword.
AList.Source:=CurSource;
AList.SourceLine:=CurrentTokenLine;
AList.SourcePos:=CurrentTokenPos;
Consume(tsqlFrom);
Repeat
T:=ParseTableRef(AParent);
@ -441,6 +444,9 @@ Var
begin
// On entry, we're on the token preceding the field list.
AList.Source:=CurSource;
AList.SourceLine:=CurrentTokenLine;
AList.SourcePos:=CurrentTokenPos;
B:=True;
Repeat
GetNextToken;
@ -516,6 +522,9 @@ Var
begin
// On entry we're on the GROUP token.
AList.Source:=CurSource;
AList.SourceLine:=CurrentTokenLine;
AList.SourcePos:=CurrentTokenPos;
Consume(tsqlGroup);
Expect(tsqlBy);
Repeat
@ -565,6 +574,9 @@ Var
begin
// On entry we're on the ORDER token.
AList.Source:=CurSource;
AList.SourceLine:=CurrentTokenLine;
AList.SourcePos:=CurrentTokenPos;
Consume(tsqlOrder);
Expect(tsqlBy);
Repeat
@ -2629,6 +2641,9 @@ function TSQLParser.ParseIdentifierList(AParent: TSQLElement;
begin
// on entry, we're on first identifier
AList.Source:=CurSource;
AList.SourceLine:=CurrentTokenLine;
AList.SourcePos:=CurrentTokenPos;
Expect(tsqlIdentifier);
Result:=0;
repeat

View File

@ -91,10 +91,18 @@ Type
TSQLElementList = Class(TObjectList)
private
Fline: Integer;
FPos: Integer;
FSource: String;
function GetE(AIndex : Integer): TSQLElement;
procedure SetE(AIndex : Integer; const AValue: TSQLElement);
Public
Property Elements[AIndex : Integer] : TSQLElement Read GetE Write SetE; default;
Property Source : String Read FSource write FSource;
Property SourceLine : Integer Read Fline Write Fline;
Property SourcePos : Integer Read FPos Write FPos;
end;
TSQLLiteral = Class(TSQLElement);

View File

@ -4132,14 +4132,22 @@ end;
procedure TTestSelectParser.TestSourcePosition;
begin
TestSelect('SELECT X FROM ABC');
TestSelect('SELECT X FROM ABC ORDER BY Y');
AssertEquals('One table',1,Select.Tables.Count);
AssertEquals('Table source position = 1', 1, Select.Tables[0].SourceLine);
AssertEquals('FROM source line = 1', 1, Select.Tables.SourceLine);
AssertEquals('FROM source position = 10', 10, Select.Tables.SourcePos);
AssertEquals('ORDER BY source line = 1', 1, Select.Orderby.SourceLine);
AssertEquals('ORDER BY source position = 19', 19, Select.Orderby.SourcePos);
AssertEquals('Table source line = 1', 1, Select.Tables[0].SourceLine);
AssertEquals('Table source position = 15', 15, Select.Tables[0].SourcePos);
TestSelect('SELECT X'+sLineBreak+'FROM ABC');
TestSelect('SELECT X'+sLineBreak+'FROM ABC'+sLineBreak+'ORDER BY Y');
AssertEquals('One table',1,Select.Tables.Count);
AssertEquals('Table source position = 2', 2, Select.Tables[0].SourceLine);
AssertEquals('FROM source line = 2', 2, Select.Tables.SourceLine);
AssertEquals('FROM source position = 1', 1, Select.Tables.SourcePos);
AssertEquals('ORDER BY source line = 3', 3, Select.Orderby.SourceLine);
AssertEquals('ORDER BY source position = 1', 1, Select.Orderby.SourcePos);
AssertEquals('Table source line = 2', 2, Select.Tables[0].SourceLine);
AssertEquals('Table source position = 6', 6, Select.Tables[0].SourcePos);
end;