mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-07 15:50:36 +02:00
sql parser: add source position information to element lists
git-svn-id: trunk@46439 -
This commit is contained in:
parent
98036f52be
commit
672e59317a
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user