@@ -41,7 +41,10 @@ module Droplet.Language.Internal.Syntax
41
41
, class ValidColumnNames
42
42
, class IncludeColumn
43
43
, class ColumnCannotBeSet
44
+ , class MultipleInsert
45
+ , class SingleInsert
44
46
, class OnlyAggregations
47
+ , class ConsistentArity
45
48
, class LimitedResults
46
49
, class ToAdd
47
50
, class ColumnNames
@@ -780,7 +783,7 @@ instance ToStringAgg (Path table name) (OrderBy (Path alias fd) String) columns
780
783
781
784
-- ----------------------LIMIT---------------------------
782
785
783
- data Limit (n :: Int ) rest = Limit rest
786
+ data Limit (n ∷ Int ) rest = Limit rest
784
787
785
788
class ToLimit (q ∷ Type )
786
789
@@ -806,7 +809,6 @@ instance ToLimit (Select s projection (From fr fields (Where cd (GroupBy fg (Ord
806
809
limit ∷ ∀ n q sql . ToLimit q ⇒ Resume q (Limit n E ) sql ⇒ Proxy n → q → sql
807
810
limit _ q = resume q $ Limit E
808
811
809
-
810
812
-- ----------------------OFFSET---------------------------
811
813
812
814
data Offset rest = Offset Int rest
@@ -1007,7 +1009,7 @@ data Values fieldValues rest = Values fieldValues rest
1007
1009
1008
1010
data DefaultValues = DefaultValues
1009
1011
1010
- class InsertValues (fields ∷ Row Type ) (fieldNames ∷ Type ) (t ∷ Type )
1012
+ class InsertValues (fields ∷ Row Type ) (names ∷ Type ) (t ∷ Type )
1011
1013
1012
1014
-- | Multiple values, single column
1013
1015
instance InsertValues fields (Proxy name ) u ⇒ InsertValues fields (Proxy name ) (Array u )
@@ -1045,8 +1047,45 @@ else instance
1045
1047
) ⇒
1046
1048
IsDefault t name
1047
1049
1048
- values ∷ ∀ tableName fields fieldNames fieldValues . InsertValues fields fieldNames fieldValues ⇒ fieldValues → Insert (Into tableName fields fieldNames E ) → Insert (Into tableName fields fieldNames (Values fieldValues E ))
1049
- values fieldValues (Insert (Into fieldNames _)) = Insert <<< Into fieldNames $ Values fieldValues E
1050
+ -- | Makes sure single and multiple insert syntax is not mixed
1051
+ class ConsistentArity (values ∷ Type )
1052
+
1053
+ -- | Multiple values, single column
1054
+ instance ConsistentArity (Array t )
1055
+
1056
+ -- | Multiple values, many columns
1057
+ else instance MultipleInsert u ⇒ ConsistentArity (Array t /\ u )
1058
+
1059
+ -- | Column list
1060
+ else instance SingleInsert u ⇒ ConsistentArity (t /\ u )
1061
+
1062
+ -- | Single value
1063
+ else instance ConsistentArity t
1064
+
1065
+ class MultipleInsert (t ∷ Type )
1066
+
1067
+ instance MultipleInsert (Array t )
1068
+
1069
+ else instance MultipleInsert t ⇒ MultipleInsert (Array t /\ u )
1070
+
1071
+ else instance Fail (Text " Multiple INSERT value list must be array" ) ⇒ MultipleInsert u
1072
+
1073
+ class SingleInsert (t ∷ Type )
1074
+
1075
+ instance SingleInsert t ⇒ SingleInsert (t /\ u )
1076
+
1077
+ else instance Fail (Text " Single INSERT value list must not be array" ) ⇒ SingleInsert (Array t )
1078
+
1079
+ else instance SingleInsert t
1080
+
1081
+ values ∷
1082
+ ∀ tableName fields names fieldValues .
1083
+ ConsistentArity fieldValues ⇒
1084
+ InsertValues fields names fieldValues ⇒
1085
+ fieldValues →
1086
+ Insert (Into tableName fields names E ) →
1087
+ Insert (Into tableName fields names (Values fieldValues E ))
1088
+ values fieldValues (Insert (Into names _)) = Insert <<< Into names $ Values fieldValues E
1050
1089
1051
1090
defaultValues ∷ DefaultValues
1052
1091
defaultValues = DefaultValues
0 commit comments