Browse Source

sql parser: add source position information to element lists

git-svn-id: trunk@46439 -
(cherry picked from commit 672e59317afd0702cfeeb64aff47a5814f6f7d37)
ondrej 5 years ago
parent
commit
72e2a99b1f

+ 15 - 0
packages/fcl-db/src/sql/fpsqlparser.pas

@@ -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

+ 8 - 0
packages/fcl-db/src/sql/fpsqltree.pp

@@ -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);

+ 12 - 4
packages/fcl-db/tests/tcparser.pas

@@ -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;