From efbf6818cfb2e88de6fb17d0476956048f5a48ac Mon Sep 17 00:00:00 2001 From: Emrys Ingersoll Date: Wed, 31 Jan 2018 10:44:02 -0600 Subject: [PATCH] [qz-3635] Correct precedence when parsing join conditions --- src/SqlSquared/Parser.purs | 2 +- test/src/Main.purs | 2 ++ test/src/Precedence.purs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/src/Precedence.purs diff --git a/src/SqlSquared/Parser.purs b/src/SqlSquared/Parser.purs index ab2fec0..9fb9c56 100644 --- a/src/SqlSquared/Parser.purs +++ b/src/SqlSquared/Parser.purs @@ -601,7 +601,7 @@ stdJoinRelation = do _ ← keyword "join" right ← simpleRelation _ ← keyword "on" - clause ← expr + clause ← definedExpr pure \left → Sig.JoinRelation { left diff --git a/test/src/Main.purs b/test/src/Main.purs index 024063e..09c776b 100644 --- a/test/src/Main.purs +++ b/test/src/Main.purs @@ -15,6 +15,7 @@ import Test.Constructors as Constructors import Test.Argonaut as Argonaut import Test.Gen as Gen import Test.Parse as Parse +import Test.Precedence as Precedence type Effects = ( testOutput ∷ TESTOUTPUT @@ -30,5 +31,6 @@ main = do Constructors.testSuite Argonaut.testSuite Parse.testSuite + Precedence.testSuite Gen.test diff --git a/test/src/Precedence.purs b/test/src/Precedence.purs new file mode 100644 index 0000000..2f87e1b --- /dev/null +++ b/test/src/Precedence.purs @@ -0,0 +1,32 @@ +module Test.Precedence where + +import Prelude + +import Data.Either as E +import Matryoshka (project) + +import SqlSquared as S + +import Test.Unit (suite, test, Test, TestSuite) +import Test.Unit.Assert as Assert + +testParsedSql ∷ ∀ e. (S.Sql → Test e) → String → Test e +testParsedSql f s = + case S.prettyParse S.parse s of + E.Left err → Assert.assert ("\n" <> err) false + E.Right sql → f sql + +limitedJoinQuery ∷ String +limitedJoinQuery = "select * from a inner join b on a.id = b.id limit 10" + +expectLimit ∷ S.Sql → Boolean +expectLimit sql = + case project sql of + (S.Binop { lhs: _, rhs: _, op: S.Limit }) → true + _ → false + +testSuite ∷ ∀ e. TestSuite e +testSuite = do + suite "tests for parser precedence" do + test "limit should have higher precedence than join condition" + $ testParsedSql (Assert.assert "limit parsed incorrectly" <<< expectLimit) limitedJoinQuery