From 8adc169b383f042f8b93afd12727c8522b64a0a3 Mon Sep 17 00:00:00 2001 From: Jake Wheat Date: Tue, 17 Dec 2013 15:09:28 +0200 Subject: [PATCH] add support for '' in string literals --- Language/SQL/SimpleSQL/Parser.lhs | 8 +++++++- Language/SQL/SimpleSQL/Pretty.lhs | 6 +++++- TODO | 4 ++++ simple-sql-parser.cabal | 2 +- tools/Language/SQL/SimpleSQL/ScalarExprs.lhs | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Language/SQL/SimpleSQL/Parser.lhs b/Language/SQL/SimpleSQL/Parser.lhs index b737c0f..658fd4c 100644 --- a/Language/SQL/SimpleSQL/Parser.lhs +++ b/Language/SQL/SimpleSQL/Parser.lhs @@ -724,7 +724,13 @@ String literals: limited at the moment, no escaping \' or other variations. > stringLiteral :: P String -> stringLiteral = char '\'' *> manyTill anyChar (symbol_ "'") +> stringLiteral = (char '\'' *> manyTill anyChar (char '\'') +> >>= optionSuffix moreString) <* whiteSpace +> where +> moreString s0 = try $ do +> void $ char '\'' +> s <- manyTill anyChar (char '\'') +> optionSuffix moreString (s0 ++ "'" ++ s) number literals diff --git a/Language/SQL/SimpleSQL/Pretty.lhs b/Language/SQL/SimpleSQL/Pretty.lhs index 5bf3dab..5c35b5f 100644 --- a/Language/SQL/SimpleSQL/Pretty.lhs +++ b/Language/SQL/SimpleSQL/Pretty.lhs @@ -28,7 +28,11 @@ = scalar expressions > scalarExpr :: ScalarExpr -> Doc -> scalarExpr (StringLit s) = quotes $ text s +> scalarExpr (StringLit s) = quotes $ text $ doubleUpQuotes s +> where doubleUpQuotes [] = [] +> doubleUpQuotes ('\'':cs) = '\'':'\'':doubleUpQuotes cs +> doubleUpQuotes (c:cs) = c:doubleUpQuotes cs + > scalarExpr (NumLit s) = text s > scalarExpr (IntervalLit v u p) = > text "interval" <+> quotes (text v) diff --git a/TODO b/TODO index b30873c..f401e65 100644 --- a/TODO +++ b/TODO @@ -12,6 +12,10 @@ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY in the postgresql docs, the start and count must be in parens unless they are a single integer +select * from generate_series(0,99) offset 5 fetch next 5 row only; +select * from generate_series(0,99) offset 5; +select * from generate_series(0,99) fetch next 5 row only; + + sql server top syntax more dots: implement as dot operator diff --git a/simple-sql-parser.cabal b/simple-sql-parser.cabal index a6fd138..02d2f42 100644 --- a/simple-sql-parser.cabal +++ b/simple-sql-parser.cabal @@ -1,5 +1,5 @@ name: simple-sql-parser -version: 0.2.0.0 +version: 0.2.0 synopsis: A parser for SQL queries description: A parser for SQL queries. Please see the homepage for more information . diff --git a/tools/Language/SQL/SimpleSQL/ScalarExprs.lhs b/tools/Language/SQL/SimpleSQL/ScalarExprs.lhs index d5bf901..cfa93e9 100644 --- a/tools/Language/SQL/SimpleSQL/ScalarExprs.lhs +++ b/tools/Language/SQL/SimpleSQL/ScalarExprs.lhs @@ -34,6 +34,7 @@ Tests for parsing scalar expressions > ,("3e+3", NumLit "3e+3") > ,("3e-3", NumLit "3e-3") > ,("'string'", StringLit "string") +> ,("'string with a '' quote'", StringLit "string with a ' quote") > ,("'1'", StringLit "1") > ,("interval '3' day", IntervalLit "3" "day" Nothing) > ,("interval '3' day (3)", IntervalLit "3" "day" $ Just 3)