Browse Source

fcl-db: fixed parsing param with underscore

mattias 1 week ago
parent
commit
391a8ec8df
2 changed files with 18 additions and 1 deletions
  1. 1 1
      packages/fcl-db/src/sql/fpsqlparser.pas
  2. 17 0
      packages/fcl-db/tests/tcparser.pas

+ 1 - 1
packages/fcl-db/src/sql/fpsqlparser.pas

@@ -2938,7 +2938,7 @@ begin
           Error(SErrUnexpectedToken,[CurrentTokenString]);
           Error(SErrUnexpectedToken,[CurrentTokenString]);
         GetNextToken;
         GetNextToken;
         N:=CurrentTokenString;
         N:=CurrentTokenString;
-        If (N='') or not (N[1] in ['a'..'z','A'..'Z']) then
+        If (N='') or not (N[1] in ['a'..'z','A'..'Z','_']) then
           Error(SerrTokenMismatch,[N,TokenInfos[tsqlIdentifier]]);
           Error(SerrTokenMismatch,[N,TokenInfos[tsqlIdentifier]]);
         Result:=TSQLParameterExpression(CreateElement(TSQLParameterExpression,AParent));
         Result:=TSQLParameterExpression(CreateElement(TSQLParameterExpression,AParent));
         TSQLParameterExpression(Result).Identifier:=CreateIdentifier(Result,N);
         TSQLParameterExpression(Result).Identifier:=CreateIdentifier(Result,N);

+ 17 - 0
packages/fcl-db/tests/tcparser.pas

@@ -497,6 +497,7 @@ type
     procedure TestWhereAny;
     procedure TestWhereAny;
     procedure TestWhereSome;
     procedure TestWhereSome;
     procedure TestParam;
     procedure TestParam;
+    procedure TestParam_Underscore;
     procedure TestParamExpr;
     procedure TestParamExpr;
     procedure TestNoTable;
     procedure TestNoTable;
     procedure TestSourcePosition;
     procedure TestSourcePosition;
@@ -5343,6 +5344,22 @@ begin
   AssertIdentifierName('Correct parameter name','A',P.Identifier);
   AssertIdentifierName('Correct parameter name','A',P.Identifier);
 end;
 end;
 
 
+procedure TTestSelectParser.TestParam_Underscore;
+var
+  F: TSQLSelectField;
+  P: TSQLParameterExpression;
+begin
+  TestSelect('SELECT :_A FROM B');
+  AssertEquals('1 table in select',1,Select.Tables.Count);
+  AssertTable(Select.Tables[0],'B','');
+  AssertEquals('1 fields in select',1,Select.Fields.Count);
+  AssertNotNull('Have field',Select.Fields[0]);
+  F:=TSQLSelectField(CheckClass(Select.Fields[0],TSQLSelectField));
+  AssertNotNull('Have field expresssion,',F.Expression);
+  P:=TSQLParameterExpression(CheckClass(F.Expression,TSQLParameterExpression));
+  AssertIdentifierName('Correct parameter name','_A',P.Identifier);
+end;
+
 procedure TTestSelectParser.TestParamExpr;
 procedure TTestSelectParser.TestParamExpr;
 
 
 Var
 Var