diff --git a/Language/SQL/SimpleSQL/Dialect.lhs b/Language/SQL/SimpleSQL/Dialect.lhs index ab93c8c..30c2d08 100644 --- a/Language/SQL/SimpleSQL/Dialect.lhs +++ b/Language/SQL/SimpleSQL/Dialect.lhs @@ -92,6 +92,8 @@ Data types to represent different dialect options > ,diConvertFunction :: Bool > -- | allow creating autoincrement columns > ,diAutoincrement :: Bool +> -- | allow omitting the comma between constraint clauses +> ,diNonCommaSeparatedConstraints :: Bool > } > deriving (Eq,Show,Read,Data,Typeable) @@ -115,6 +117,7 @@ Data types to represent different dialect options > ,diSqlServerSymbols = False > ,diConvertFunction = False > ,diAutoincrement = False +> ,diNonCommaSeparatedConstraints = False > } > -- | mysql dialect diff --git a/Language/SQL/SimpleSQL/Parse.lhs b/Language/SQL/SimpleSQL/Parse.lhs index 7674c51..29c098c 100644 --- a/Language/SQL/SimpleSQL/Parse.lhs +++ b/Language/SQL/SimpleSQL/Parse.lhs @@ -1509,12 +1509,21 @@ TODO: change style > CreateSchema <$> names > createTable :: Parser Statement -> createTable = keyword_ "table" >> +> createTable = do +> d <- getState +> let +> parseColumnDef = TableColumnDef <$> columnDef +> parseConstraintDef = uncurry TableConstraintDef <$> tableConstraintDef +> separator = if diNonCommaSeparatedConstraints d +> then optional comma +> else void comma +> constraints = sepBy parseConstraintDef separator +> entries = ((:) <$> parseColumnDef <*> ((comma >> entries) <|> pure [])) <|> constraints +> +> keyword_ "table" >> > CreateTable -> <$> names -> -- todo: is this order mandatory or is it a perm? -> <*> parens (commaSep1 (uncurry TableConstraintDef <$> tableConstraintDef -> <|> TableColumnDef <$> columnDef)) +> <$> names +> <*> parens entries > createIndex :: Parser Statement > createIndex = diff --git a/shell.nix b/shell.nix index 2ea013d..0de9067 100644 --- a/shell.nix +++ b/shell.nix @@ -1,4 +1,4 @@ -with import {}; +with import { }; stdenv.mkDerivation rec { name = "env"; env = buildEnv { name = name; paths = buildInputs; }; @@ -6,6 +6,7 @@ stdenv.mkDerivation rec { ghc cabal-install glibcLocales + gnumake ]; shellHook = "export LANG=en_GB.UTF-8"; } diff --git a/tools/Language/SQL/SimpleSQL/SQL2011Schema.lhs b/tools/Language/SQL/SimpleSQL/SQL2011Schema.lhs index d60ae64..f10f479 100644 --- a/tools/Language/SQL/SimpleSQL/SQL2011Schema.lhs +++ b/tools/Language/SQL/SimpleSQL/SQL2011Schema.lhs @@ -651,6 +651,28 @@ defintely skip > DefaultReferentialAction DefaultReferentialAction > ]) +> ,(TestStatement ansi2011 { diNonCommaSeparatedConstraints = True } +> "create table t (a int, b int,\n\ +> \ foreign key (a) references u(c)\n\ +> \ foreign key (b) references v(d));" +> $ CreateTable [Name Nothing "t"] +> [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [] +> ,TableColumnDef $ ColumnDef (Name Nothing "b") (TypeName [Name Nothing "int"]) Nothing [] +> ,TableConstraintDef Nothing $ +> TableReferencesConstraint +> [Name Nothing "a"] +> [Name Nothing "u"] +> (Just [Name Nothing "c"]) +> DefaultReferenceMatch +> DefaultReferentialAction DefaultReferentialAction +> ,TableConstraintDef Nothing $ +> TableReferencesConstraint +> [Name Nothing "b"] +> [Name Nothing "v"] +> (Just [Name Nothing "d"]) +> DefaultReferenceMatch +> DefaultReferentialAction DefaultReferentialAction +> ]) ::=