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

Commit 405c6ed

Browse files
committed
Escape identifiers that match keywords
1 parent 0b722b5 commit 405c6ed

File tree

4 files changed

+24
-14
lines changed

4 files changed

+24
-14
lines changed

src/SqlSquared/Parser/Tokenizer.purs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module SqlSquared.Parser.Tokenizer
22
( tokenize
3+
, keywords
34
, Token(..)
45
, Literal(..)
56
, PositionedToken
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
module SqlSquared.Signature.Ident where
22

3-
import SqlSquared.Utils (escapeIdent)
3+
import Prelude
4+
5+
import Data.Set as Set
6+
import Data.String as S
7+
import Data.String.Regex (test, replace) as Regex
8+
import Data.String.Regex.Flags (ignoreCase, global) as Regex
9+
import Data.String.Regex.Unsafe (unsafeRegex) as Regex
10+
import SqlSquared.Parser.Tokenizer (keywords)
411

512
printIdent String String
6-
printIdent = escapeIdent "`"
13+
printIdent ident =
14+
if Regex.test identifier ident && not (Set.member (S.toLower ident) keywords)
15+
then ident
16+
else "`" <> Regex.replace tick ("\\`") ident <> "`"
17+
where
18+
identifier = Regex.unsafeRegex "^[a-z][_a-z0-9]*$" Regex.ignoreCase
19+
tick = Regex.unsafeRegex "`" Regex.global

src/SqlSquared/Utils.purs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@ module SqlSquared.Utils where
22

33
import Prelude
44
import Data.Functor.Coproduct (Coproduct, coproduct)
5-
import Data.String.Regex (test, replace) as Regex
6-
import Data.String.Regex.Flags (ignoreCase, global) as Regex
7-
import Data.String.Regex.Unsafe (unsafeRegex) as Regex
85
import Data.Tuple (Tuple(..))
96

107
infixr 4 type Tuple as ×
@@ -17,12 +14,3 @@ composeFlipped ∷ ∀ a b c d. Semigroupoid a ⇒ a b c → a c d → a b d
1714
composeFlipped f g = compose g f
1815

1916
infixr 9 composeFlipped as
20-
21-
escapeIdent String String String
22-
escapeIdent delim ident =
23-
if Regex.test identifier ident
24-
then ident
25-
else delim <> Regex.replace tick ("\\" <> delim) ident <> delim
26-
where
27-
identifier = Regex.unsafeRegex "^[a-z][_a-z0-9]*$" Regex.ignoreCase
28-
tick = Regex.unsafeRegex delim Regex.global

test/src/Parse.purs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,14 @@ testSuite1 = do
176176
industry
177177
"""
178178

179+
parseFail """
180+
select foo as between from bar
181+
"""
182+
183+
parseSucc """
184+
select foo as `between` from bar
185+
"""
186+
179187
testSuite2 e. TestSuite (testOutput Console.TESTOUTPUT | e)
180188
testSuite2 = do
181189
parseSucc """

0 commit comments

Comments
 (0)