Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 7d02797

Browse files
committed
Make sure we only import directory
1 parent dfd765d commit 7d02797

File tree

3 files changed

+65
-13
lines changed

3 files changed

+65
-13
lines changed

src/SqlSquared/Parser.purs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,8 @@ import_
412412
import_ = asErrorMessage "import declaration" do
413413
_ ← keyword "import"
414414
s ← ident
415-
pure $ Sig.Import s
415+
path ← Sig.parseAnyDirPath P.fail s
416+
pure $ Sig.Import path
416417

417418
variable m t. SqlParser' m t
418419
variable = C.vari <$> variableString

src/SqlSquared/Signature.purs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ module SqlSquared.Signature
1111
, SqlDeclF(..)
1212
, SqlQueryF(..)
1313
, SqlModuleF(..)
14+
, AnyDirPath
15+
, parseAnyDirPath
1416
, printSqlF
1517
, printSqlDeclF
1618
, printSqlQueryF
@@ -58,6 +60,8 @@ import Data.Maybe (Maybe(..))
5860
import Data.Monoid (mempty)
5961
import Data.Newtype (class Newtype)
6062
import Data.NonEmpty ((:|))
63+
import Data.Path.Pathy as Pt
64+
import Data.Path.Pathy.Gen as PtGen
6165
import Data.Ord (class Ord1, compare1)
6266
import Data.String as S
6367
import Data.String.Gen as GenS
@@ -138,8 +142,20 @@ data SqlF literal a
138142
| Select (SelectR a)
139143
| Parens a
140144

145+
type AnyDirPath = E.Either (Pt.AbsDir Pt.Unsandboxed) (Pt.RelDir Pt.Unsandboxed)
146+
147+
printAnyDirPath :: AnyDirPath -> String
148+
printAnyDirPath = E.either Pt.unsafePrintPath Pt.unsafePrintPath
149+
150+
parseAnyDirPath :: forall m. Applicative m => (forall a. String -> m a) -> String -> m AnyDirPath
151+
parseAnyDirPath fail = Pt.parsePath
152+
(pure ∘ E.Right)
153+
(pure ∘ E.Left)
154+
(const $ fail "incorrect directory path")
155+
(const $ fail "incorrect directory path")
156+
141157
data SqlDeclF a
142-
= Import String
158+
= Import AnyDirPath
143159
| FunctionDecl (FunctionDeclR a)
144160

145161
newtype SqlModuleF a =
@@ -502,8 +518,8 @@ printSqlDeclF = case _ of
502518
<> "(" <> F.intercalate ", " (append ":"ID.printIdent <$> args) <> ") BEGIN "
503519
<> body
504520
<> " END"
505-
Import s
506-
"IMPORT " <> ID.printIdent s
521+
Import path
522+
"IMPORT " <> ID.printIdent (printAnyDirPath path)
507523

508524
printSqlQueryF Algebra SqlQueryF String
509525
printSqlQueryF (Query decls expr) = F.intercalate "; " $ L.snoc (printSqlDeclF <$> decls) expr
@@ -588,9 +604,9 @@ encodeJsonSqlDeclF = case _ of
588604
J.~> "args" J.:= args
589605
J.~> "body" J.:= body
590606
J.~> J.jsonEmptyObject
591-
Import s
607+
Import path
592608
"tag" J.:= "import"
593-
J.~> "value" J.:= s
609+
J.~> "value" J.:= printAnyDirPath path
594610
J.~> J.jsonEmptyObject
595611

596612
encodeJsonSqlQueryF Algebra SqlQueryF J.Json
@@ -712,7 +728,8 @@ decodeJsonSqlDeclF = J.decodeJson >=> \obj → do
712728

713729
decodeImport obj = do
714730
v ← obj J..? "value"
715-
pure $ Import v
731+
path ← parseAnyDirPath E.Left v
732+
pure $ Import path
716733

717734
decodeJsonSqlQueryF CoalgebraM (E.Either String) SqlQueryF J.Json
718735
decodeJsonSqlQueryF = J.decodeJson >=> \obj → do
@@ -761,16 +778,16 @@ genSqlF genLiteral n
761778
, genSelect n
762779
]
763780

764-
genSqlDeclF m. Gen.MonadGen m CoalgebraM m SqlDeclF Int
781+
genSqlDeclF m. Gen.MonadGen m MonadRec m CoalgebraM m SqlDeclF Int
765782
genSqlDeclF n =
766783
Gen.oneOf $ genImport :|
767784
[ genFunctionDecl n
768785
]
769786

770-
genSqlQueryF m. Gen.MonadGen m CoalgebraM m SqlQueryF Int
787+
genSqlQueryF m. Gen.MonadGen m MonadRec m CoalgebraM m SqlQueryF Int
771788
genSqlQueryF n = Query <$> genDecls n <*> pure n
772789

773-
genSqlModuleF m. Gen.MonadGen m CoalgebraM m SqlModuleF Int
790+
genSqlModuleF m. Gen.MonadGen m MonadRec m CoalgebraM m SqlModuleF Int
774791
genSqlModuleF n = Module <$> genDecls n
775792

776793
genSetLiteral m l. Gen.MonadGen m CoalgebraM m (SqlF l) Int
@@ -878,16 +895,19 @@ genFunctionDecl n = do
878895
args ← L.foldM foldFn L.Nil $ L.range 0 len
879896
pure $ FunctionDecl { ident, args, body: n - 1 }
880897

881-
genImport m a. Gen.MonadGen m m (SqlDeclF a)
882-
genImport = Import <$> genIdent
898+
genImport m a. Gen.MonadGen m MonadRec m m (SqlDeclF a)
899+
genImport = map Import
900+
$ Gen.oneOf
901+
$ (Pt.unsandbox >>> E.Left <$> PtGen.genAbsDirPath)
902+
:| [Pt.unsandbox >>> E.Right <$> PtGen.genRelDirPath]
883903

884904
genIdent m. Gen.MonadGen m m String
885905
genIdent = do
886906
start ← Gen.elements $ "a" :| S.split (S.Pattern "") "bcdefghijklmnopqrstuvwxyz"
887907
body ← map (Int.toStringAs Int.hexadecimal) (Gen.chooseInt 0 100000)
888908
pure $ start <> body
889909

890-
genDecls m. Gen.MonadGen m Int m (L.List (SqlDeclF Int))
910+
genDecls m. Gen.MonadGen m MonadRec m Int m (L.List (SqlDeclF Int))
891911
genDecls n = do
892912
let
893913
foldFn acc _ = do

test/src/Parse.purs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,25 @@ parseFail s =
4040
E.Left err → pure unit
4141
E.Right (sql SqlQuery) → Assert.assert s false
4242

43+
parseFailWith e. String String TestSuite (testOutput Console.TESTOUTPUT | e)
44+
parseFailWith s err =
45+
test "parse/failWith"
46+
case parseQuery s of
47+
E.Left err' →
48+
if show err' == err
49+
then pure unit
50+
else Assert.assert
51+
("expected query:" <> s <>
52+
"\n\n to fail input error: " <> err <>
53+
"\n\n but instead fot error: " <> show err')
54+
false
55+
E.Right (sql SqlQuery) →
56+
Assert.assert
57+
("expected to fail with:" <> err <>
58+
"\n\tbut input query:" <> s <>
59+
"\n\twas parsed as:" <> printQuery sql)
60+
false
61+
4362
testSuite e. TestSuite (testOutput Console.TESTOUTPUT | e)
4463
testSuite = suite "parsers" do
4564
testSuite1
@@ -51,6 +70,14 @@ testSuite = suite "parsers" do
5170

5271
testSuite1 e. TestSuite (testOutput Console.TESTOUTPUT | e)
5372
testSuite1 = do
73+
parseFailWith """
74+
import `/path/To/Your/File/myModule`; SELECT id("HELLO")
75+
""" "(ParseError \"incorrect directory path\" (Position { line: 2, column: 12 }))"
76+
77+
parseSucc """
78+
import `/path/To/Your/File/myModule/`; SELECT id("HELLO")
79+
"""
80+
5481
parseSucc """
5582
a := 1; SELECT * FROM `/test`
5683
"""
@@ -157,6 +184,10 @@ testSuite1 = do
157184
"""
158185

159186
parseSucc """
187+
import `foo/`; select * from `/test`
188+
"""
189+
190+
parseFail """
160191
import foo; select * from `/test`
161192
"""
162193

0 commit comments

Comments
 (0)