Browse Source

sql parser: fix A*B, A/B and add tests

git-svn-id: trunk@46437 -
ondrej 5 years ago
parent
commit
f89650c470
2 changed files with 57 additions and 0 deletions
  1. 1 0
      packages/fcl-db/src/sql/fpsqlparser.pas
  2. 56 0
      packages/fcl-db/tests/tcparser.pas

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

@@ -2539,6 +2539,7 @@ begin
       Right:=ParseExprLevel5(AParent,EO);
       B:=TSQLBinaryExpression(CreateElement(TSQLBinaryExpression,AParent));
       B.Left:=Result;
+      Result:=B;
       B.Right:=Right;
       Case tt of
         tsqlMul : B.Operation:=boMultiply;

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

@@ -231,6 +231,10 @@ type
     procedure TestOr;
     procedure TestNotOr;
     procedure TestCase;
+    procedure TestAdd;
+    procedure TestSubtract;
+    procedure TestMultiply;
+    procedure TestDivide;
   end;
 
   { TTestDomainParser }
@@ -2123,6 +2127,19 @@ begin
   AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
 end;
 
+procedure TTestCheckParser.TestDivide;
+
+Var
+  B : TSQLBinaryExpression;
+
+begin
+  B:=TSQLBinaryExpression(TestCheck('VALUE / 1',TSQLBinaryExpression));
+  AssertEquals('Correct operator', boDivide, B.Operation);
+  AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
+  AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
+  AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
+end;
+
 procedure TTestCheckParser.TestNotContaining;
 
 Var
@@ -2177,6 +2194,19 @@ begin
   AssertLiteralExpr('Right is string',B.Right,TSQLStringLiteral);
 end;
 
+procedure TTestCheckParser.TestSubtract;
+
+Var
+  B : TSQLBinaryExpression;
+
+begin
+  B:=TSQLBinaryExpression(TestCheck('VALUE - 1',TSQLBinaryExpression));
+  AssertEquals('Correct operator', boSubtract, B.Operation);
+  AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
+  AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
+  AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
+end;
+
 procedure TTestCheckParser.TestNotStartingWith;
 
 Var
@@ -2264,6 +2294,19 @@ begin
   AssertLiteralExpr('Right is string',T.Right,TSQLStringLiteral);
 end;
 
+procedure TTestCheckParser.TestMultiply;
+
+Var
+  B : TSQLBinaryExpression;
+
+begin
+  B:=TSQLBinaryExpression(TestCheck('VALUE * 1',TSQLBinaryExpression));
+  AssertEquals('Correct operator', boMultiply, B.Operation);
+  AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
+  AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
+  AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
+end;
+
 procedure TTestCheckParser.TestNotLikeEscape;
 Var
   U : TSQLUnaryExpression;
@@ -2280,6 +2323,19 @@ begin
   AssertLiteralExpr('Right is string',T.Right,TSQLStringLiteral);
 end;
 
+procedure TTestCheckParser.TestAdd;
+
+Var
+  B : TSQLBinaryExpression;
+
+begin
+  B:=TSQLBinaryExpression(TestCheck('VALUE + 1',TSQLBinaryExpression));
+  AssertEquals('Correct operator', boAdd, B.Operation);
+  AssertLiteralExpr('Left is value',B.Left,TSQLValueLiteral);
+  AssertLiteralExpr('Right is integer',B.Right,TSQLIntegerLiteral);
+  AssertEquals('Right is 1',1, TSQLIntegerLiteral(TSQLLiteralExpression(B.Right).Literal).Value);
+end;
+
 procedure TTestCheckParser.TestAnd;
 
 Var