1
Fork 0

Merge pull request #52 from Airsequel/without-rowid

Implement sqlite "without rowid" clauses
This commit is contained in:
Jake Wheat 2024-07-15 12:49:51 +01:00 committed by GitHub
commit 39c8e05224
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 69 additions and 21 deletions

View file

@ -96,6 +96,8 @@ data Dialect = Dialect
,diAutoincrement :: Bool ,diAutoincrement :: Bool
-- | allow omitting the comma between constraint clauses -- | allow omitting the comma between constraint clauses
,diNonCommaSeparatedConstraints :: Bool ,diNonCommaSeparatedConstraints :: Bool
-- | allow marking tables as "without rowid"
,diWithoutRowidTables :: Bool
} }
deriving (Eq,Show,Read,Data,Typeable) deriving (Eq,Show,Read,Data,Typeable)
@ -120,6 +122,7 @@ ansi2011 = Dialect {diKeywords = ansi2011ReservedKeywords
,diConvertFunction = False ,diConvertFunction = False
,diAutoincrement = False ,diAutoincrement = False
,diNonCommaSeparatedConstraints = False ,diNonCommaSeparatedConstraints = False
,diWithoutRowidTables = False
} }
-- | mysql dialect -- | mysql dialect

View file

@ -233,7 +233,7 @@ import Control.Applicative ((<**>))
import Data.Char (isDigit) import Data.Char (isDigit)
import Data.List (sort,groupBy) import Data.List (sort,groupBy)
import Data.Function (on) import Data.Function (on)
import Data.Maybe (catMaybes, isJust, mapMaybe) import Data.Maybe (catMaybes, isJust, mapMaybe, fromMaybe)
import Data.Text (Text) import Data.Text (Text)
import qualified Data.Text as T import qualified Data.Text as T
@ -1717,11 +1717,15 @@ createTable = do
else Just <$> comma else Just <$> comma
constraints = sepBy parseConstraintDef (hidden separator) constraints = sepBy parseConstraintDef (hidden separator)
entries = ((:) <$> parseColumnDef <*> ((comma >> entries) <|> pure [])) <|> constraints entries = ((:) <$> parseColumnDef <*> ((comma >> entries) <|> pure [])) <|> constraints
withoutRowid = if diWithoutRowidTables d
then fromMaybe False <$> optional (keywords_ ["without", "rowid"] >> pure True)
else pure False
keyword_ "table" >> keyword_ "table" >>
CreateTable CreateTable
<$> names "table name" <$> names "table name"
<*> parens entries <*> parens entries
<*> withoutRowid
createIndex :: Parser Statement createIndex :: Parser Statement
createIndex = createIndex =

View file

@ -491,9 +491,10 @@ statement :: Dialect -> Statement -> Doc a
statement _ (CreateSchema nm) = statement _ (CreateSchema nm) =
pretty "create" <+> pretty "schema" <+> names nm pretty "create" <+> pretty "schema" <+> names nm
statement d (CreateTable nm cds) = statement d (CreateTable nm cds withoutRowid) =
pretty "create" <+> pretty "table" <+> names nm pretty "create" <+> pretty "table" <+> names nm
<+> parens (commaSep $ map cd cds) <+> parens (commaSep $ map cd cds)
<+> (if withoutRowid then texts [ "without", "rowid" ] else mempty)
where where
cd (TableConstraintDef n con) = cd (TableConstraintDef n con) =
maybe mempty (\s -> pretty "constraint" <+> names s) n maybe mempty (\s -> pretty "constraint" <+> names s) n

View file

@ -443,7 +443,7 @@ data Statement =
-- ddl -- ddl
CreateSchema [Name] CreateSchema [Name]
| DropSchema [Name] DropBehaviour | DropSchema [Name] DropBehaviour
| CreateTable [Name] [TableElement] | CreateTable [Name] [TableElement] Bool
| AlterTable [Name] AlterTableAction | AlterTable [Name] AlterTableAction
| DropTable [Name] DropBehaviour | DropTable [Name] DropBehaviour
| CreateIndex Bool [Name] [Name] [Name] | CreateIndex Bool [Name] [Name] [Name]

View file

@ -5668,7 +5668,7 @@ statement
ansi2011 ansi2011
create table t ( create table t (
) )
CreateTable [ Name Nothing "t" ] [] CreateTable [ Name Nothing "t" ] [] False
statement statement
ansi2011 ansi2011

View file

@ -27,5 +27,6 @@ oracleLobUnits = Group "oracleLobUnits"
[TableColumnDef $ ColumnDef (Name Nothing "a") [TableColumnDef $ ColumnDef (Name Nothing "a")
(PrecLengthTypeName [Name Nothing "varchar2"] 55 Nothing (Just PrecOctets)) (PrecLengthTypeName [Name Nothing "varchar2"] 55 Nothing (Just PrecOctets))
Nothing []] Nothing []]
False
] ]

View file

@ -109,6 +109,7 @@ add schema element support:
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [] [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing []
,TableColumnDef $ ColumnDef (Name Nothing "b") (TypeName [Name Nothing "int"]) Nothing []] ,TableColumnDef $ ColumnDef (Name Nothing "b") (TypeName [Name Nothing "int"]) Nothing []]
False
{- {-
@ -328,30 +329,35 @@ todo: constraint characteristics
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing
[ColConstraintDef Nothing ColNotNullConstraint]] [ColConstraintDef Nothing ColNotNullConstraint]]
False
,s ,s
"create table t (a int constraint a_not_null not null);" "create table t (a int constraint a_not_null not null);"
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing
[ColConstraintDef (Just [Name Nothing "a_not_null"]) ColNotNullConstraint]] [ColConstraintDef (Just [Name Nothing "a_not_null"]) ColNotNullConstraint]]
False
,s ,s
"create table t (a int unique);" "create table t (a int unique);"
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing
[ColConstraintDef Nothing ColUniqueConstraint]] [ColConstraintDef Nothing ColUniqueConstraint]]
False
,s ,s
"create table t (a int primary key);" "create table t (a int primary key);"
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing
[ColConstraintDef Nothing (ColPrimaryKeyConstraint False)]] [ColConstraintDef Nothing (ColPrimaryKeyConstraint False)]]
False
,testStatement ansi2011{ diAutoincrement = True } ,testStatement ansi2011{ diAutoincrement = True }
"create table t (a int primary key autoincrement);" "create table t (a int primary key autoincrement);"
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing
[ColConstraintDef Nothing (ColPrimaryKeyConstraint True)]] [ColConstraintDef Nothing (ColPrimaryKeyConstraint True)]]
False
{- {-
references t(a,b) references t(a,b)
@ -367,6 +373,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
DefaultReferentialAction DefaultReferentialAction]] DefaultReferentialAction DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u(a));" "create table t (a int references u(a));"
@ -375,6 +382,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] (Just $ Name Nothing "a") DefaultReferenceMatch [Name Nothing "u"] (Just $ Name Nothing "a") DefaultReferenceMatch
DefaultReferentialAction DefaultReferentialAction]] DefaultReferentialAction DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u match full);" "create table t (a int references u match full);"
@ -383,6 +391,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing MatchFull [Name Nothing "u"] Nothing MatchFull
DefaultReferentialAction DefaultReferentialAction]] DefaultReferentialAction DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u match partial);" "create table t (a int references u match partial);"
@ -391,6 +400,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing MatchPartial [Name Nothing "u"] Nothing MatchPartial
DefaultReferentialAction DefaultReferentialAction]] DefaultReferentialAction DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u match simple);" "create table t (a int references u match simple);"
@ -399,6 +409,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing MatchSimple [Name Nothing "u"] Nothing MatchSimple
DefaultReferentialAction DefaultReferentialAction]] DefaultReferentialAction DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u on update cascade );" "create table t (a int references u on update cascade );"
@ -407,6 +418,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
RefCascade DefaultReferentialAction]] RefCascade DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u on update set null );" "create table t (a int references u on update set null );"
@ -415,6 +427,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
RefSetNull DefaultReferentialAction]] RefSetNull DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u on update set default );" "create table t (a int references u on update set default );"
@ -423,6 +436,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
RefSetDefault DefaultReferentialAction]] RefSetDefault DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u on update no action );" "create table t (a int references u on update no action );"
@ -431,6 +445,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
RefNoAction DefaultReferentialAction]] RefNoAction DefaultReferentialAction]]
False
,s ,s
"create table t (a int references u on delete cascade );" "create table t (a int references u on delete cascade );"
@ -439,6 +454,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
DefaultReferentialAction RefCascade]] DefaultReferentialAction RefCascade]]
False
,s ,s
@ -448,6 +464,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
RefCascade RefRestrict]] RefCascade RefRestrict]]
False
,s ,s
"create table t (a int references u on delete restrict on update cascade );" "create table t (a int references u on delete restrict on update cascade );"
@ -456,6 +473,7 @@ references t(a,b)
[ColConstraintDef Nothing $ ColReferencesConstraint [ColConstraintDef Nothing $ ColReferencesConstraint
[Name Nothing "u"] Nothing DefaultReferenceMatch [Name Nothing "u"] Nothing DefaultReferenceMatch
RefCascade RefRestrict]] RefCascade RefRestrict]]
False
{- {-
TODO: try combinations and permutations of column constraints and TODO: try combinations and permutations of column constraints and
@ -469,6 +487,7 @@ options
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing
[ColConstraintDef Nothing [ColConstraintDef Nothing
(ColCheckConstraint $ BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (NumLit "5"))]] (ColCheckConstraint $ BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (NumLit "5"))]]
False
@ -484,11 +503,13 @@ options
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"])
(Just $ IdentityColumnSpec GeneratedAlways []) []] (Just $ IdentityColumnSpec GeneratedAlways []) []]
False
,s "create table t (a int generated by default as identity);" ,s "create table t (a int generated by default as identity);"
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"])
(Just $ IdentityColumnSpec GeneratedByDefault []) []] (Just $ IdentityColumnSpec GeneratedByDefault []) []]
False
,s ,s
@ -502,6 +523,7 @@ options
,SGOMaxValue 500 ,SGOMaxValue 500
,SGOMinValue 5 ,SGOMinValue 5
,SGOCycle]) []] ,SGOCycle]) []]
False
,s ,s
"create table t (a int generated always as identity\n\ "create table t (a int generated always as identity\n\
@ -513,6 +535,7 @@ options
,SGONoMaxValue ,SGONoMaxValue
,SGONoMinValue ,SGONoMinValue
,SGONoCycle]) []] ,SGONoCycle]) []]
False
{- {-
I think <common sequence generator options> is supposed to just I think <common sequence generator options> is supposed to just
@ -541,6 +564,7 @@ generated always (valueexpr)
,TableColumnDef $ ColumnDef (Name Nothing "a2") (TypeName [Name Nothing "int"]) ,TableColumnDef $ ColumnDef (Name Nothing "a2") (TypeName [Name Nothing "int"])
(Just $ GenerationClause (Just $ GenerationClause
(BinOp (Iden [Name Nothing "a"]) [Name Nothing "*"] (NumLit "2"))) []] (BinOp (Iden [Name Nothing "a"]) [Name Nothing "*"] (NumLit "2"))) []]
False
@ -569,6 +593,7 @@ generated always (valueexpr)
$ CreateTable [Name Nothing "t"] $ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"])
(Just $ DefaultClause $ NumLit "0") []] (Just $ DefaultClause $ NumLit "0") []]
False
@ -605,6 +630,7 @@ generated always (valueexpr)
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing [] [TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing []
,TableConstraintDef Nothing $ TableUniqueConstraint [Name Nothing "a"] ,TableConstraintDef Nothing $ TableUniqueConstraint [Name Nothing "a"]
] ]
False
,s ,s
"create table t (a int, constraint a_unique unique (a));" "create table t (a int, constraint a_unique unique (a));"
@ -613,6 +639,7 @@ generated always (valueexpr)
,TableConstraintDef (Just [Name Nothing "a_unique"]) $ ,TableConstraintDef (Just [Name Nothing "a_unique"]) $
TableUniqueConstraint [Name Nothing "a"] TableUniqueConstraint [Name Nothing "a"]
] ]
False
-- todo: test permutations of column defs and table constraints -- todo: test permutations of column defs and table constraints
@ -624,6 +651,7 @@ generated always (valueexpr)
,TableConstraintDef Nothing $ ,TableConstraintDef Nothing $
TableUniqueConstraint [Name Nothing "a", Name Nothing "b"] TableUniqueConstraint [Name Nothing "a", Name Nothing "b"]
] ]
False
,s ,s
"create table t (a int, b int, primary key (a,b));" "create table t (a int, b int, primary key (a,b));"
@ -633,6 +661,7 @@ generated always (valueexpr)
,TableConstraintDef Nothing $ ,TableConstraintDef Nothing $
TablePrimaryKeyConstraint [Name Nothing "a", Name Nothing "b"] TablePrimaryKeyConstraint [Name Nothing "a", Name Nothing "b"]
] ]
False
{- {-
@ -664,6 +693,7 @@ defintely skip
(Just [Name Nothing "c", Name Nothing "d"]) (Just [Name Nothing "c", Name Nothing "d"])
MatchFull RefCascade RefRestrict MatchFull RefCascade RefRestrict
] ]
False
,s ,s
"create table t (a int,\n\ "create table t (a int,\n\
@ -677,6 +707,7 @@ defintely skip
Nothing DefaultReferenceMatch Nothing DefaultReferenceMatch
DefaultReferentialAction DefaultReferentialAction DefaultReferentialAction DefaultReferentialAction
] ]
False
,testStatement ansi2011{ diNonCommaSeparatedConstraints = True } ,testStatement ansi2011{ diNonCommaSeparatedConstraints = True }
"create table t (a int, b int,\n\ "create table t (a int, b int,\n\
@ -700,6 +731,12 @@ defintely skip
DefaultReferenceMatch DefaultReferenceMatch
DefaultReferentialAction DefaultReferentialAction DefaultReferentialAction DefaultReferentialAction
] ]
False
,testStatement ansi2011{ diWithoutRowidTables = True }
"create table t (a int) without rowid;"
$ CreateTable [Name Nothing "t"]
[TableColumnDef $ ColumnDef (Name Nothing "a") (TypeName [Name Nothing "int"]) Nothing []]
True
{- {-
@ -767,6 +804,7 @@ defintely skip
TableCheckConstraint TableCheckConstraint
(BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (Iden [Name Nothing "b"])) (BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (Iden [Name Nothing "b"]))
] ]
False
,s ,s
@ -779,6 +817,7 @@ defintely skip
TableCheckConstraint TableCheckConstraint
(BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (Iden [Name Nothing "b"])) (BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (Iden [Name Nothing "b"]))
] ]
False
{- {-