-- | -- Names for nodes mostly resemble the according definitions in the @gram.y@ -- original Postgres parser file, except for the cases where we can optimize on that. -- -- For reasoning see the docs of the parsing module of this project. module PostgresqlSyntax.Ast where import PostgresqlSyntax.Prelude hiding (Op, Order) -- * Statement -- | -- ==== References -- @ -- PreparableStmt: -- | SelectStmt -- | InsertStmt -- | UpdateStmt -- | DeleteStmt -- | CallStmt -- @ data PreparableStmt = SelectPreparableStmt SelectStmt | InsertPreparableStmt InsertStmt | UpdatePreparableStmt UpdateStmt | DeletePreparableStmt DeleteStmt | CallPreparableStmt CallStmt deriving (Show, Generic, Eq, Ord) -- * Call newtype CallStmt = CallStmt FuncApplication deriving (Show, Generic, Eq, Ord) -- * Insert -- | -- ==== References -- @ -- InsertStmt: -- | opt_with_clause INSERT INTO insert_target insert_rest -- opt_on_conflict returning_clause -- @ data InsertStmt = InsertStmt (Maybe WithClause) InsertTarget InsertRest (Maybe OnConflict) (Maybe ReturningClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- insert_target: -- | qualified_name -- | qualified_name AS ColId -- @ data InsertTarget = InsertTarget QualifiedName (Maybe ColId) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- insert_rest: -- | SelectStmt -- | OVERRIDING override_kind VALUE_P SelectStmt -- | '(' insert_column_list ')' SelectStmt -- | '(' insert_column_list ')' OVERRIDING override_kind VALUE_P SelectStmt -- | DEFAULT VALUES -- @ data InsertRest = SelectInsertRest (Maybe InsertColumnList) (Maybe OverrideKind) SelectStmt | DefaultValuesInsertRest deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- override_kind: -- | USER -- | SYSTEM_P -- @ data OverrideKind = UserOverrideKind | SystemOverrideKind deriving (Show, Generic, Eq, Ord, Enum, Bounded) -- | -- ==== References -- @ -- insert_column_list: -- | insert_column_item -- | insert_column_list ',' insert_column_item -- @ type InsertColumnList = NonEmpty InsertColumnItem -- | -- ==== References -- @ -- insert_column_item: -- | ColId opt_indirection -- @ data InsertColumnItem = InsertColumnItem ColId (Maybe Indirection) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_on_conflict: -- | ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause -- | ON CONFLICT opt_conf_expr DO NOTHING -- | EMPTY -- @ data OnConflict = OnConflict (Maybe ConfExpr) OnConflictDo deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_on_conflict: -- | ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause -- | ON CONFLICT opt_conf_expr DO NOTHING -- | EMPTY -- @ data OnConflictDo = UpdateOnConflictDo SetClauseList (Maybe WhereClause) | NothingOnConflictDo deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_conf_expr: -- | '(' index_params ')' where_clause -- | ON CONSTRAINT name -- | EMPTY -- @ data ConfExpr = WhereConfExpr IndexParams (Maybe WhereClause) | ConstraintConfExpr Name deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- returning_clause: -- | RETURNING target_list -- | EMPTY -- @ type ReturningClause = TargetList -- * Update -- | -- ==== References -- @ -- UpdateStmt: -- | opt_with_clause UPDATE relation_expr_opt_alias -- SET set_clause_list -- from_clause -- where_or_current_clause -- returning_clause -- @ data UpdateStmt = UpdateStmt (Maybe WithClause) RelationExprOptAlias SetClauseList (Maybe FromClause) (Maybe WhereOrCurrentClause) (Maybe ReturningClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- set_clause_list: -- | set_clause -- | set_clause_list ',' set_clause -- @ type SetClauseList = NonEmpty SetClause -- | -- ==== References -- @ -- set_clause: -- | set_target '=' a_expr -- | '(' set_target_list ')' '=' a_expr -- @ data SetClause = TargetSetClause SetTarget AExpr | TargetListSetClause SetTargetList AExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- set_target: -- | ColId opt_indirection -- @ data SetTarget = SetTarget ColId (Maybe Indirection) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- set_target_list: -- | set_target -- | set_target_list ',' set_target -- @ type SetTargetList = NonEmpty SetTarget -- * Delete -- | -- ==== References -- @ -- DeleteStmt: -- | opt_with_clause DELETE_P FROM relation_expr_opt_alias -- using_clause where_or_current_clause returning_clause -- @ data DeleteStmt = DeleteStmt (Maybe WithClause) RelationExprOptAlias (Maybe UsingClause) (Maybe WhereOrCurrentClause) (Maybe ReturningClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- using_clause: -- | USING from_list -- | EMPTY -- @ type UsingClause = FromList -- * Select -- | -- ==== References -- @ -- SelectStmt: -- | select_no_parens -- | select_with_parens -- @ type SelectStmt = Either SelectNoParens SelectWithParens -- | -- ==== References -- @ -- select_with_parens: -- | '(' select_no_parens ')' -- | '(' select_with_parens ')' -- @ data SelectWithParens = NoParensSelectWithParens SelectNoParens | WithParensSelectWithParens SelectWithParens deriving (Show, Generic, Eq, Ord) -- | -- Covers the following cases: -- -- @ -- select_no_parens: -- | simple_select -- | select_clause sort_clause -- | select_clause opt_sort_clause for_locking_clause opt_select_limit -- | select_clause opt_sort_clause select_limit opt_for_locking_clause -- | with_clause select_clause -- | with_clause select_clause sort_clause -- | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit -- | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause -- @ data SelectNoParens = SelectNoParens (Maybe WithClause) SelectClause (Maybe SortClause) (Maybe SelectLimit) (Maybe ForLockingClause) deriving (Show, Generic, Eq, Ord) -- | -- @ -- select_clause: -- | simple_select -- | select_with_parens -- @ type SelectClause = Either SimpleSelect SelectWithParens -- | -- ==== References -- @ -- simple_select: -- | SELECT opt_all_clause opt_target_list -- into_clause from_clause where_clause -- group_clause having_clause window_clause -- | SELECT distinct_clause target_list -- into_clause from_clause where_clause -- group_clause having_clause window_clause -- | values_clause -- | TABLE relation_expr -- | select_clause UNION all_or_distinct select_clause -- | select_clause INTERSECT all_or_distinct select_clause -- | select_clause EXCEPT all_or_distinct select_clause -- @ data SimpleSelect = NormalSimpleSelect (Maybe Targeting) (Maybe IntoClause) (Maybe FromClause) (Maybe WhereClause) (Maybe GroupClause) (Maybe HavingClause) (Maybe WindowClause) | ValuesSimpleSelect ValuesClause | TableSimpleSelect RelationExpr | BinSimpleSelect SelectBinOp SelectClause (Maybe Bool) SelectClause deriving (Show, Generic, Eq, Ord) -- | -- Covers these parts of spec: -- -- ==== References -- @ -- simple_select: -- | SELECT opt_all_clause opt_target_list -- into_clause from_clause where_clause -- group_clause having_clause window_clause -- | SELECT distinct_clause target_list -- into_clause from_clause where_clause -- group_clause having_clause window_clause -- -- distinct_clause: -- | DISTINCT -- | DISTINCT ON '(' expr_list ')' -- @ data Targeting = NormalTargeting TargetList | AllTargeting (Maybe TargetList) | DistinctTargeting (Maybe ExprList) TargetList deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- target_list: -- | target_el -- | target_list ',' target_el -- @ type TargetList = NonEmpty TargetEl -- | -- ==== References -- @ -- target_el: -- | a_expr AS ColLabel -- | a_expr IDENT -- | a_expr -- | '*' -- @ data TargetEl = AliasedExprTargetEl AExpr Ident | ImplicitlyAliasedExprTargetEl AExpr Ident | ExprTargetEl AExpr | AsteriskTargetEl deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | select_clause UNION all_or_distinct select_clause -- | select_clause INTERSECT all_or_distinct select_clause -- | select_clause EXCEPT all_or_distinct select_clause -- @ data SelectBinOp = UnionSelectBinOp | IntersectSelectBinOp | ExceptSelectBinOp deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- with_clause: -- | WITH cte_list -- | WITH_LA cte_list -- | WITH RECURSIVE cte_list -- @ data WithClause = WithClause Bool (NonEmpty CommonTableExpr) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- common_table_expr: -- | name opt_name_list AS opt_materialized '(' PreparableStmt ')' -- opt_materialized: -- | MATERIALIZED -- | NOT MATERIALIZED -- | EMPTY -- @ data CommonTableExpr = CommonTableExpr Ident (Maybe (NonEmpty Ident)) (Maybe Bool) PreparableStmt deriving (Show, Generic, Eq, Ord) type IntoClause = OptTempTableName -- | -- ==== References -- @ -- OptTempTableName: -- | TEMPORARY opt_table qualified_name -- | TEMP opt_table qualified_name -- | LOCAL TEMPORARY opt_table qualified_name -- | LOCAL TEMP opt_table qualified_name -- | GLOBAL TEMPORARY opt_table qualified_name -- | GLOBAL TEMP opt_table qualified_name -- | UNLOGGED opt_table qualified_name -- | TABLE qualified_name -- | qualified_name -- @ data OptTempTableName = TemporaryOptTempTableName Bool QualifiedName | TempOptTempTableName Bool QualifiedName | LocalTemporaryOptTempTableName Bool QualifiedName | LocalTempOptTempTableName Bool QualifiedName | GlobalTemporaryOptTempTableName Bool QualifiedName | GlobalTempOptTempTableName Bool QualifiedName | UnloggedOptTempTableName Bool QualifiedName | TableOptTempTableName QualifiedName | QualifedOptTempTableName QualifiedName deriving (Show, Generic, Eq, Ord) type FromClause = NonEmpty TableRef type GroupClause = NonEmpty GroupByItem -- | -- ==== References -- @ -- group_by_item: -- | a_expr -- | empty_grouping_set -- | cube_clause -- | rollup_clause -- | grouping_sets_clause -- empty_grouping_set: -- | '(' ')' -- rollup_clause: -- | ROLLUP '(' expr_list ')' -- cube_clause: -- | CUBE '(' expr_list ')' -- grouping_sets_clause: -- | GROUPING SETS '(' group_by_list ')' -- @ data GroupByItem = ExprGroupByItem AExpr | EmptyGroupingSetGroupByItem | RollupGroupByItem ExprList | CubeGroupByItem ExprList | GroupingSetsGroupByItem (NonEmpty GroupByItem) deriving (Show, Generic, Eq, Ord) -- | -- @ -- having_clause: -- | HAVING a_expr -- | EMPTY -- @ type HavingClause = AExpr -- | -- @ -- window_clause: -- | WINDOW window_definition_list -- | EMPTY -- -- window_definition_list: -- | window_definition -- | window_definition_list ',' window_definition -- @ type WindowClause = NonEmpty WindowDefinition -- | -- @ -- window_definition: -- | ColId AS window_specification -- @ data WindowDefinition = WindowDefinition Ident WindowSpecification deriving (Show, Generic, Eq, Ord) -- | -- @ -- window_specification: -- | '(' opt_existing_window_name opt_partition_clause -- opt_sort_clause opt_frame_clause ')' -- -- opt_existing_window_name: -- | ColId -- | EMPTY -- -- opt_partition_clause: -- | PARTITION BY expr_list -- | EMPTY -- @ data WindowSpecification = WindowSpecification (Maybe ExistingWindowName) (Maybe PartitionClause) (Maybe SortClause) (Maybe FrameClause) deriving (Show, Generic, Eq, Ord) type ExistingWindowName = ColId type PartitionClause = ExprList -- | -- ==== References -- @ -- opt_frame_clause: -- | RANGE frame_extent opt_window_exclusion_clause -- | ROWS frame_extent opt_window_exclusion_clause -- | GROUPS frame_extent opt_window_exclusion_clause -- | EMPTY -- @ data FrameClause = FrameClause FrameClauseMode FrameExtent (Maybe WindowExclusionClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_frame_clause: -- | RANGE frame_extent opt_window_exclusion_clause -- | ROWS frame_extent opt_window_exclusion_clause -- | GROUPS frame_extent opt_window_exclusion_clause -- | EMPTY -- @ data FrameClauseMode = RangeFrameClauseMode | RowsFrameClauseMode | GroupsFrameClauseMode deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- frame_extent: -- | frame_bound -- | BETWEEN frame_bound AND frame_bound -- @ data FrameExtent = SingularFrameExtent FrameBound | BetweenFrameExtent FrameBound FrameBound deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- frame_bound: -- | UNBOUNDED PRECEDING -- | UNBOUNDED FOLLOWING -- | CURRENT_P ROW -- | a_expr PRECEDING -- | a_expr FOLLOWING -- @ data FrameBound = UnboundedPrecedingFrameBound | UnboundedFollowingFrameBound | CurrentRowFrameBound | PrecedingFrameBound AExpr | FollowingFrameBound AExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_window_exclusion_clause: -- | EXCLUDE CURRENT_P ROW -- | EXCLUDE GROUP_P -- | EXCLUDE TIES -- | EXCLUDE NO OTHERS -- | EMPTY -- @ data WindowExclusionClause = CurrentRowWindowExclusionClause | GroupWindowExclusionClause | TiesWindowExclusionClause | NoOthersWindowExclusionClause deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- values_clause: -- | VALUES '(' expr_list ')' -- | values_clause ',' '(' expr_list ')' -- @ type ValuesClause = NonEmpty ExprList -- | -- -- sort_clause: -- | ORDER BY sortby_list -- -- sortby_list: -- | sortby -- | sortby_list ',' sortby type SortClause = NonEmpty SortBy -- | -- ==== References -- @ -- sortby: -- | a_expr USING qual_all_Op opt_nulls_order -- | a_expr opt_asc_desc opt_nulls_order -- @ data SortBy = UsingSortBy AExpr QualAllOp (Maybe NullsOrder) | AscDescSortBy AExpr (Maybe AscDesc) (Maybe NullsOrder) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- select_limit: -- | limit_clause offset_clause -- | offset_clause limit_clause -- | limit_clause -- | offset_clause -- @ data SelectLimit = LimitOffsetSelectLimit LimitClause OffsetClause | OffsetLimitSelectLimit OffsetClause LimitClause | LimitSelectLimit LimitClause | OffsetSelectLimit OffsetClause deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- limit_clause: -- | LIMIT select_limit_value -- | LIMIT select_limit_value ',' select_offset_value -- | FETCH first_or_next select_fetch_first_value row_or_rows ONLY -- | FETCH first_or_next row_or_rows ONLY -- select_offset_value: -- | a_expr -- first_or_next: -- | FIRST_P -- | NEXT -- row_or_rows: -- | ROW -- | ROWS -- @ data LimitClause = LimitLimitClause SelectLimitValue (Maybe AExpr) | FetchOnlyLimitClause Bool (Maybe SelectFetchFirstValue) Bool deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- select_fetch_first_value: -- | c_expr -- | '+' I_or_F_const -- | '-' I_or_F_const -- @ data SelectFetchFirstValue = ExprSelectFetchFirstValue CExpr | NumSelectFetchFirstValue Bool (Either Int64 Double) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- select_limit_value: -- | a_expr -- | ALL -- @ data SelectLimitValue = ExprSelectLimitValue AExpr | AllSelectLimitValue deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- offset_clause: -- | OFFSET select_offset_value -- | OFFSET select_fetch_first_value row_or_rows -- select_offset_value: -- | a_expr -- row_or_rows: -- | ROW -- | ROWS -- @ data OffsetClause = ExprOffsetClause AExpr | FetchFirstOffsetClause SelectFetchFirstValue Bool deriving (Show, Generic, Eq, Ord) -- * For Locking -- | -- ==== References -- @ -- for_locking_clause: -- | for_locking_items -- | FOR READ ONLY -- for_locking_items: -- | for_locking_item -- | for_locking_items for_locking_item -- @ data ForLockingClause = ItemsForLockingClause (NonEmpty ForLockingItem) | ReadOnlyForLockingClause deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- for_locking_item: -- | for_locking_strength locked_rels_list opt_nowait_or_skip -- locked_rels_list: -- | OF qualified_name_list -- | EMPTY -- opt_nowait_or_skip: -- | NOWAIT -- | SKIP LOCKED -- | EMPTY -- @ data ForLockingItem = ForLockingItem ForLockingStrength (Maybe (NonEmpty QualifiedName)) (Maybe Bool) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- for_locking_strength: -- | FOR UPDATE -- | FOR NO KEY UPDATE -- | FOR SHARE -- | FOR KEY SHARE -- @ data ForLockingStrength = UpdateForLockingStrength | NoKeyUpdateForLockingStrength | ShareForLockingStrength | KeyForLockingStrength deriving (Show, Generic, Eq, Ord) -- * Table references and joining -- | -- ==== References -- @ -- from_list: -- | table_ref -- | from_list ',' table_ref -- @ type FromList = NonEmpty TableRef -- | -- ==== References -- @ -- | relation_expr opt_alias_clause -- | relation_expr opt_alias_clause tablesample_clause -- | func_table func_alias_clause -- | LATERAL_P func_table func_alias_clause -- | xmltable opt_alias_clause -- | LATERAL_P xmltable opt_alias_clause -- | select_with_parens opt_alias_clause -- | LATERAL_P select_with_parens opt_alias_clause -- | joined_table -- | '(' joined_table ')' alias_clause -- -- TODO: Add xmltable -- @ data TableRef = -- | -- @ -- | relation_expr opt_alias_clause -- | relation_expr opt_alias_clause tablesample_clause -- @ RelationExprTableRef RelationExpr (Maybe AliasClause) (Maybe TablesampleClause) | -- | -- @ -- | func_table func_alias_clause -- | LATERAL_P func_table func_alias_clause -- @ FuncTableRef Bool FuncTable (Maybe FuncAliasClause) | -- | -- @ -- | select_with_parens opt_alias_clause -- | LATERAL_P select_with_parens opt_alias_clause -- @ SelectTableRef Bool SelectWithParens (Maybe AliasClause) | -- | -- @ -- | joined_table -- | '(' joined_table ')' alias_clause -- @ JoinTableRef JoinedTable (Maybe AliasClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | qualified_name -- | qualified_name '*' -- | ONLY qualified_name -- | ONLY '(' qualified_name ')' -- @ data RelationExpr = SimpleRelationExpr QualifiedName -- ^ Name. Bool -- ^ Is asterisk present? | OnlyRelationExpr QualifiedName -- ^ Name. Bool -- ^ Are parentheses present? deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- relation_expr_opt_alias: -- | relation_expr -- | relation_expr ColId -- | relation_expr AS ColId -- @ data RelationExprOptAlias = RelationExprOptAlias RelationExpr (Maybe (Bool, ColId)) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- tablesample_clause: -- | TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause -- @ data TablesampleClause = TablesampleClause FuncName ExprList (Maybe RepeatableClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_repeatable_clause: -- | REPEATABLE '(' a_expr ')' -- | EMPTY -- @ type RepeatableClause = AExpr -- | -- ==== References -- @ -- func_table: -- | func_expr_windowless opt_ordinality -- | ROWS FROM '(' rowsfrom_list ')' opt_ordinality -- @ data FuncTable = FuncExprFuncTable FuncExprWindowless OptOrdinality | RowsFromFuncTable RowsfromList OptOrdinality deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- rowsfrom_item: -- | func_expr_windowless opt_col_def_list -- @ data RowsfromItem = RowsfromItem FuncExprWindowless (Maybe ColDefList) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- rowsfrom_list: -- | rowsfrom_item -- | rowsfrom_list ',' rowsfrom_item -- @ type RowsfromList = NonEmpty RowsfromItem -- | -- ==== References -- @ -- opt_col_def_list: -- | AS '(' TableFuncElementList ')' -- | EMPTY -- @ type ColDefList = TableFuncElementList -- | -- ==== References -- @ -- opt_ordinality: -- | WITH_LA ORDINALITY -- | EMPTY -- @ type OptOrdinality = Bool -- | -- ==== References -- @ -- TableFuncElementList: -- | TableFuncElement -- | TableFuncElementList ',' TableFuncElement -- @ type TableFuncElementList = NonEmpty TableFuncElement -- | -- ==== References -- @ -- TableFuncElement: -- | ColId Typename opt_collate_clause -- @ data TableFuncElement = TableFuncElement ColId Typename (Maybe CollateClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_collate_clause: -- | COLLATE any_name -- | EMPTY -- @ type CollateClause = AnyName -- | -- ==== References -- @ -- alias_clause: -- | AS ColId '(' name_list ')' -- | AS ColId -- | ColId '(' name_list ')' -- | ColId -- @ data AliasClause = AliasClause Bool ColId (Maybe NameList) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_alias_clause: -- | alias_clause -- | AS '(' TableFuncElementList ')' -- | AS ColId '(' TableFuncElementList ')' -- | ColId '(' TableFuncElementList ')' -- | EMPTY -- @ data FuncAliasClause = AliasFuncAliasClause AliasClause | AsFuncAliasClause TableFuncElementList | AsColIdFuncAliasClause ColId TableFuncElementList | ColIdFuncAliasClause ColId TableFuncElementList deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | '(' joined_table ')' -- | table_ref CROSS JOIN table_ref -- | table_ref join_type JOIN table_ref join_qual -- | table_ref JOIN table_ref join_qual -- | table_ref NATURAL join_type JOIN table_ref -- | table_ref NATURAL JOIN table_ref -- -- The options are covered by the `JoinMeth` type. -- @ data JoinedTable = InParensJoinedTable JoinedTable | MethJoinedTable JoinMeth TableRef TableRef deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | table_ref CROSS JOIN table_ref -- | table_ref join_type JOIN table_ref join_qual -- | table_ref JOIN table_ref join_qual -- | table_ref NATURAL join_type JOIN table_ref -- | table_ref NATURAL JOIN table_ref -- @ data JoinMeth = CrossJoinMeth | QualJoinMeth (Maybe JoinType) JoinQual | NaturalJoinMeth (Maybe JoinType) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | FULL join_outer -- | LEFT join_outer -- | RIGHT join_outer -- | INNER_P -- @ data JoinType = FullJoinType Bool | LeftJoinType Bool | RightJoinType Bool | InnerJoinType deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- join_qual: -- | USING '(' name_list ')' -- | ON a_expr -- @ data JoinQual = UsingJoinQual (NonEmpty Ident) | OnJoinQual AExpr deriving (Show, Generic, Eq, Ord) -- * Where type WhereClause = AExpr -- | -- ==== References -- @ -- | WHERE a_expr -- | WHERE CURRENT_P OF cursor_name -- | /*EMPTY*/ -- @ data WhereOrCurrentClause = ExprWhereOrCurrentClause AExpr | CursorWhereOrCurrentClause CursorName deriving (Show, Generic, Eq, Ord) -- * Expression type ExprList = NonEmpty AExpr -- | -- ==== References -- @ -- a_expr: -- | c_expr -- | a_expr TYPECAST Typename -- | a_expr COLLATE any_name -- | a_expr AT TIME ZONE a_expr -- | '+' a_expr -- | '-' a_expr -- | a_expr '+' a_expr -- | a_expr '-' a_expr -- | a_expr '*' a_expr -- | a_expr '/' a_expr -- | a_expr '%' a_expr -- | a_expr '^' a_expr -- | a_expr '<' a_expr -- | a_expr '>' a_expr -- | a_expr '=' a_expr -- | a_expr LESS_EQUALS a_expr -- | a_expr GREATER_EQUALS a_expr -- | a_expr NOT_EQUALS a_expr -- | a_expr qual_Op a_expr -- | qual_Op a_expr -- | a_expr qual_Op -- | a_expr AND a_expr -- | a_expr OR a_expr -- | NOT a_expr -- | NOT_LA a_expr -- | a_expr LIKE a_expr -- | a_expr LIKE a_expr ESCAPE a_expr -- | a_expr NOT_LA LIKE a_expr -- | a_expr NOT_LA LIKE a_expr ESCAPE a_expr -- | a_expr ILIKE a_expr -- | a_expr ILIKE a_expr ESCAPE a_expr -- | a_expr NOT_LA ILIKE a_expr -- | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr -- | a_expr SIMILAR TO a_expr -- | a_expr SIMILAR TO a_expr ESCAPE a_expr -- | a_expr NOT_LA SIMILAR TO a_expr -- | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr -- | a_expr IS NULL_P -- | a_expr ISNULL -- | a_expr IS NOT NULL_P -- | a_expr NOTNULL -- | row OVERLAPS row -- | a_expr IS TRUE_P -- | a_expr IS NOT TRUE_P -- | a_expr IS FALSE_P -- | a_expr IS NOT FALSE_P -- | a_expr IS UNKNOWN -- | a_expr IS NOT UNKNOWN -- | a_expr IS DISTINCT FROM a_expr -- | a_expr IS NOT DISTINCT FROM a_expr -- | a_expr IS OF '(' type_list ')' -- | a_expr IS NOT OF '(' type_list ')' -- | a_expr BETWEEN opt_asymmetric b_expr AND a_expr -- | a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr -- | a_expr BETWEEN SYMMETRIC b_expr AND a_expr -- | a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr -- | a_expr IN_P in_expr -- | a_expr NOT_LA IN_P in_expr -- | a_expr subquery_Op sub_type select_with_parens -- | a_expr subquery_Op sub_type '(' a_expr ')' -- | UNIQUE select_with_parens -- | a_expr IS DOCUMENT_P -- | a_expr IS NOT DOCUMENT_P -- | DEFAULT -- @ data AExpr = CExprAExpr CExpr | TypecastAExpr AExpr Typename | CollateAExpr AExpr AnyName | AtTimeZoneAExpr AExpr AExpr | PlusAExpr AExpr | MinusAExpr AExpr | SymbolicBinOpAExpr AExpr SymbolicExprBinOp AExpr | PrefixQualOpAExpr QualOp AExpr | SuffixQualOpAExpr AExpr QualOp | AndAExpr AExpr AExpr | OrAExpr AExpr AExpr | NotAExpr AExpr | VerbalExprBinOpAExpr AExpr Bool VerbalExprBinOp AExpr (Maybe AExpr) | ReversableOpAExpr AExpr Bool AExprReversableOp | IsnullAExpr AExpr | NotnullAExpr AExpr | OverlapsAExpr Row Row | SubqueryAExpr AExpr SubqueryOp SubType (Either SelectWithParens AExpr) | UniqueAExpr SelectWithParens | DefaultAExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- b_expr: -- | c_expr -- | b_expr TYPECAST Typename -- | '+' b_expr -- | '-' b_expr -- | b_expr '+' b_expr -- | b_expr '-' b_expr -- | b_expr '*' b_expr -- | b_expr '/' b_expr -- | b_expr '%' b_expr -- | b_expr '^' b_expr -- | b_expr '<' b_expr -- | b_expr '>' b_expr -- | b_expr '=' b_expr -- | b_expr LESS_EQUALS b_expr -- | b_expr GREATER_EQUALS b_expr -- | b_expr NOT_EQUALS b_expr -- | b_expr qual_Op b_expr -- | qual_Op b_expr -- | b_expr qual_Op -- | b_expr IS DISTINCT FROM b_expr -- | b_expr IS NOT DISTINCT FROM b_expr -- | b_expr IS OF '(' type_list ')' -- | b_expr IS NOT OF '(' type_list ')' -- | b_expr IS DOCUMENT_P -- | b_expr IS NOT DOCUMENT_P -- @ data BExpr = CExprBExpr CExpr | TypecastBExpr BExpr Typename | PlusBExpr BExpr | MinusBExpr BExpr | SymbolicBinOpBExpr BExpr SymbolicExprBinOp BExpr | QualOpBExpr QualOp BExpr | IsOpBExpr BExpr Bool BExprIsOp deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- c_expr: -- | columnref -- | AexprConst -- | PARAM opt_indirection -- | '(' a_expr ')' opt_indirection -- | case_expr -- | func_expr -- | select_with_parens -- | select_with_parens indirection -- | EXISTS select_with_parens -- | ARRAY select_with_parens -- | ARRAY array_expr -- | explicit_row -- | implicit_row -- | GROUPING '(' expr_list ')' -- @ data CExpr = ColumnrefCExpr Columnref | AexprConstCExpr AexprConst | ParamCExpr Int (Maybe Indirection) | InParensCExpr AExpr (Maybe Indirection) | CaseCExpr CaseExpr | FuncCExpr FuncExpr | SelectWithParensCExpr SelectWithParens (Maybe Indirection) | ExistsCExpr SelectWithParens | ArrayCExpr (Either SelectWithParens ArrayExpr) | ExplicitRowCExpr ExplicitRow | ImplicitRowCExpr ImplicitRow | GroupingCExpr ExprList deriving (Show, Generic, Eq, Ord) -- ** -- | -- ==== References -- @ -- in_expr: -- | select_with_parens -- | '(' expr_list ')' -- @ data InExpr = SelectInExpr SelectWithParens | ExprListInExpr ExprList deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- sub_type: -- | ANY -- | SOME -- | ALL -- @ data SubType = AnySubType | SomeSubType | AllSubType deriving (Show, Generic, Eq, Ord, Enum, Bounded) -- | -- ==== References -- @ -- array_expr: -- | '[' expr_list ']' -- | '[' array_expr_list ']' -- | '[' ']' -- @ data ArrayExpr = ExprListArrayExpr ExprList | ArrayExprListArrayExpr ArrayExprList | EmptyArrayExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- array_expr_list: -- | array_expr -- | array_expr_list ',' array_expr -- @ type ArrayExprList = NonEmpty ArrayExpr -- | -- ==== References -- @ -- row: -- | ROW '(' expr_list ')' -- | ROW '(' ')' -- | '(' expr_list ',' a_expr ')' -- @ data Row = ExplicitRowRow ExplicitRow | ImplicitRowRow ImplicitRow deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- explicit_row: -- | ROW '(' expr_list ')' -- | ROW '(' ')' -- @ type ExplicitRow = Maybe ExprList -- | -- ==== References -- @ -- implicit_row: -- | '(' expr_list ',' a_expr ')' -- @ data ImplicitRow = ImplicitRow ExprList AExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_expr: -- | func_application within_group_clause filter_clause over_clause -- | func_expr_common_subexpr -- @ data FuncExpr = ApplicationFuncExpr FuncApplication (Maybe WithinGroupClause) (Maybe FilterClause) (Maybe OverClause) | SubexprFuncExpr FuncExprCommonSubexpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_expr_windowless: -- | func_application -- | func_expr_common_subexpr -- @ data FuncExprWindowless = ApplicationFuncExprWindowless FuncApplication | CommonSubexprFuncExprWindowless FuncExprCommonSubexpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- within_group_clause: -- | WITHIN GROUP_P '(' sort_clause ')' -- | EMPTY -- @ type WithinGroupClause = SortClause -- | -- ==== References -- @ -- filter_clause: -- | FILTER '(' WHERE a_expr ')' -- | EMPTY -- @ type FilterClause = AExpr -- | -- ==== References -- @ -- over_clause: -- | OVER window_specification -- | OVER ColId -- | EMPTY -- @ data OverClause = WindowOverClause WindowSpecification | ColIdOverClause ColId deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_expr_common_subexpr: -- | COLLATION FOR '(' a_expr ')' -- | CURRENT_DATE -- | CURRENT_TIME -- | CURRENT_TIME '(' Iconst ')' -- | CURRENT_TIMESTAMP -- | CURRENT_TIMESTAMP '(' Iconst ')' -- | LOCALTIME -- | LOCALTIME '(' Iconst ')' -- | LOCALTIMESTAMP -- | LOCALTIMESTAMP '(' Iconst ')' -- | CURRENT_ROLE -- | CURRENT_USER -- | SESSION_USER -- | USER -- | CURRENT_CATALOG -- | CURRENT_SCHEMA -- | CAST '(' a_expr AS Typename ')' -- | EXTRACT '(' extract_list ')' -- | OVERLAY '(' overlay_list ')' -- | POSITION '(' position_list ')' -- | SUBSTRING '(' substr_list ')' -- | TREAT '(' a_expr AS Typename ')' -- | TRIM '(' BOTH trim_list ')' -- | TRIM '(' LEADING trim_list ')' -- | TRIM '(' TRAILING trim_list ')' -- | TRIM '(' trim_list ')' -- | NULLIF '(' a_expr ',' a_expr ')' -- | COALESCE '(' expr_list ')' -- | GREATEST '(' expr_list ')' -- | LEAST '(' expr_list ')' -- | XMLCONCAT '(' expr_list ')' -- | XMLELEMENT '(' NAME_P ColLabel ')' -- | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')' -- | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')' -- | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')' -- | XMLEXISTS '(' c_expr xmlexists_argument ')' -- | XMLFOREST '(' xml_attribute_list ')' -- | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')' -- | XMLPI '(' NAME_P ColLabel ')' -- | XMLPI '(' NAME_P ColLabel ',' a_expr ')' -- | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')' -- | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename ')' -- -- TODO: Implement the XML cases -- @ data FuncExprCommonSubexpr = CollationForFuncExprCommonSubexpr AExpr | CurrentDateFuncExprCommonSubexpr | CurrentTimeFuncExprCommonSubexpr (Maybe Int64) | CurrentTimestampFuncExprCommonSubexpr (Maybe Int64) | LocalTimeFuncExprCommonSubexpr (Maybe Int64) | LocalTimestampFuncExprCommonSubexpr (Maybe Int64) | CurrentRoleFuncExprCommonSubexpr | CurrentUserFuncExprCommonSubexpr | SessionUserFuncExprCommonSubexpr | UserFuncExprCommonSubexpr | CurrentCatalogFuncExprCommonSubexpr | CurrentSchemaFuncExprCommonSubexpr | CastFuncExprCommonSubexpr AExpr Typename | ExtractFuncExprCommonSubexpr (Maybe ExtractList) | OverlayFuncExprCommonSubexpr OverlayList | PositionFuncExprCommonSubexpr (Maybe PositionList) | SubstringFuncExprCommonSubexpr (Maybe SubstrList) | TreatFuncExprCommonSubexpr AExpr Typename | TrimFuncExprCommonSubexpr (Maybe TrimModifier) TrimList | NullIfFuncExprCommonSubexpr AExpr AExpr | CoalesceFuncExprCommonSubexpr ExprList | GreatestFuncExprCommonSubexpr ExprList | LeastFuncExprCommonSubexpr ExprList deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- extract_list: -- | extract_arg FROM a_expr -- | EMPTY -- @ data ExtractList = ExtractList ExtractArg AExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- extract_arg: -- | IDENT -- | YEAR_P -- | MONTH_P -- | DAY_P -- | HOUR_P -- | MINUTE_P -- | SECOND_P -- | Sconst -- @ data ExtractArg = IdentExtractArg Ident | YearExtractArg | MonthExtractArg | DayExtractArg | HourExtractArg | MinuteExtractArg | SecondExtractArg | SconstExtractArg Sconst deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- overlay_list: -- | a_expr overlay_placing substr_from substr_for -- | a_expr overlay_placing substr_from -- @ data OverlayList = OverlayList AExpr OverlayPlacing SubstrFrom (Maybe SubstrFor) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- overlay_placing: -- | PLACING a_expr -- @ type OverlayPlacing = AExpr -- | -- ==== References -- @ -- position_list: -- | b_expr IN_P b_expr -- | EMPTY -- @ data PositionList = PositionList BExpr BExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- substr_list: -- | a_expr substr_from substr_for -- | a_expr substr_for substr_from -- | a_expr substr_from -- | a_expr substr_for -- | expr_list -- | EMPTY -- @ data SubstrList = ExprSubstrList AExpr SubstrListFromFor | ExprListSubstrList ExprList deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | a_expr substr_from substr_for -- | a_expr substr_for substr_from -- | a_expr substr_from -- | a_expr substr_for -- @ data SubstrListFromFor = FromForSubstrListFromFor SubstrFrom SubstrFor | ForFromSubstrListFromFor SubstrFor SubstrFrom | FromSubstrListFromFor SubstrFrom | ForSubstrListFromFor SubstrFor deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- substr_from: -- | FROM a_expr -- @ type SubstrFrom = AExpr -- | -- ==== References -- @ -- substr_for: -- | FOR a_expr -- @ type SubstrFor = AExpr -- | -- ==== References -- @ -- | TRIM '(' BOTH trim_list ')' -- | TRIM '(' LEADING trim_list ')' -- | TRIM '(' TRAILING trim_list ')' -- @ data TrimModifier = BothTrimModifier | LeadingTrimModifier | TrailingTrimModifier deriving (Show, Generic, Eq, Ord, Enum, Bounded) -- | -- ==== References -- @ -- trim_list: -- | a_expr FROM expr_list -- | FROM expr_list -- | expr_list -- @ data TrimList = ExprFromExprListTrimList AExpr ExprList | FromExprListTrimList ExprList | ExprListTrimList ExprList deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- case_expr: -- | CASE case_arg when_clause_list case_default END_P -- @ data CaseExpr = CaseExpr (Maybe CaseArg) WhenClauseList (Maybe CaseDefault) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- case_arg: -- | a_expr -- | EMPTY -- @ type CaseArg = AExpr -- | -- ==== References -- @ -- when_clause_list: -- | when_clause -- | when_clause_list when_clause -- @ type WhenClauseList = NonEmpty WhenClause -- | -- ==== References -- @ -- case_default: -- | ELSE a_expr -- | EMPTY -- @ type CaseDefault = AExpr -- | -- ==== References -- @ -- when_clause: -- | WHEN a_expr THEN a_expr -- @ data WhenClause = WhenClause AExpr AExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_application: -- | func_name '(' ')' -- | func_name '(' func_arg_list opt_sort_clause ')' -- | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')' -- | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')' -- | func_name '(' ALL func_arg_list opt_sort_clause ')' -- | func_name '(' DISTINCT func_arg_list opt_sort_clause ')' -- | func_name '(' '*' ')' -- @ data FuncApplication = FuncApplication FuncName (Maybe FuncApplicationParams) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_application: -- | func_name '(' ')' -- | func_name '(' func_arg_list opt_sort_clause ')' -- | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')' -- | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')' -- | func_name '(' ALL func_arg_list opt_sort_clause ')' -- | func_name '(' DISTINCT func_arg_list opt_sort_clause ')' -- | func_name '(' '*' ')' -- @ data FuncApplicationParams = NormalFuncApplicationParams (Maybe Bool) (NonEmpty FuncArgExpr) (Maybe SortClause) | VariadicFuncApplicationParams (Maybe (NonEmpty FuncArgExpr)) FuncArgExpr (Maybe SortClause) | StarFuncApplicationParams deriving (Show, Generic, Eq, Ord) data FuncArgExpr = ExprFuncArgExpr AExpr | ColonEqualsFuncArgExpr Ident AExpr | EqualsGreaterFuncArgExpr Ident AExpr deriving (Show, Generic, Eq, Ord) -- * Constants type Sconst = Text type Iconst = Int64 type Fconst = Double type Bconst = Text type Xconst = Text -- | -- AexprConst: -- | Iconst -- | FCONST -- | Sconst -- | BCONST -- | XCONST -- | func_name Sconst -- | func_name '(' func_arg_list opt_sort_clause ')' Sconst -- | ConstTypename Sconst -- | ConstInterval Sconst opt_interval -- | ConstInterval '(' Iconst ')' Sconst -- | TRUE_P -- | FALSE_P -- | NULL_P data AexprConst = IAexprConst Iconst | FAexprConst Fconst | SAexprConst Sconst | BAexprConst Bconst | XAexprConst Xconst | FuncAexprConst FuncName (Maybe FuncConstArgs) Sconst | ConstTypenameAexprConst ConstTypename Sconst | StringIntervalAexprConst Sconst (Maybe Interval) | IntIntervalAexprConst Iconst Sconst | BoolAexprConst Bool | NullAexprConst deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | func_name '(' func_arg_list opt_sort_clause ')' Sconst -- @ data FuncConstArgs = FuncConstArgs (NonEmpty FuncArgExpr) (Maybe SortClause) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- ConstTypename: -- | Numeric -- | ConstBit -- | ConstCharacter -- | ConstDatetime -- @ data ConstTypename = NumericConstTypename Numeric | ConstBitConstTypename ConstBit | ConstCharacterConstTypename ConstCharacter | ConstDatetimeConstTypename ConstDatetime deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- Numeric: -- | INT_P -- | INTEGER -- | SMALLINT -- | BIGINT -- | REAL -- | FLOAT_P opt_float -- | DOUBLE_P PRECISION -- | DECIMAL_P opt_type_modifiers -- | DEC opt_type_modifiers -- | NUMERIC opt_type_modifiers -- | BOOLEAN_P -- opt_float: -- | '(' Iconst ')' -- | EMPTY -- opt_type_modifiers: -- | '(' expr_list ')' -- | EMPTY -- @ data Numeric = IntNumeric | IntegerNumeric | SmallintNumeric | BigintNumeric | RealNumeric | FloatNumeric (Maybe Int64) | DoublePrecisionNumeric | DecimalNumeric (Maybe TypeModifiers) | DecNumeric (Maybe TypeModifiers) | NumericNumeric (Maybe TypeModifiers) | BooleanNumeric deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- Bit: -- | BitWithLength -- | BitWithoutLength -- ConstBit: -- | BitWithLength -- | BitWithoutLength -- BitWithLength: -- | BIT opt_varying '(' expr_list ')' -- BitWithoutLength: -- | BIT opt_varying -- @ data Bit = Bit OptVarying (Maybe ExprList) deriving (Show, Generic, Eq, Ord) type ConstBit = Bit -- | -- ==== References -- @ -- opt_varying: -- | VARYING -- | EMPTY -- @ type OptVarying = Bool -- | -- ==== References -- @ -- Character: -- | CharacterWithLength -- | CharacterWithoutLength -- ConstCharacter: -- | CharacterWithLength -- | CharacterWithoutLength -- CharacterWithLength: -- | character '(' Iconst ')' -- CharacterWithoutLength: -- | character -- @ data ConstCharacter = ConstCharacter Character (Maybe Int64) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- character: -- | CHARACTER opt_varying -- | CHAR_P opt_varying -- | VARCHAR -- | NATIONAL CHARACTER opt_varying -- | NATIONAL CHAR_P opt_varying -- | NCHAR opt_varying -- @ data Character = CharacterCharacter OptVarying | CharCharacter OptVarying | VarcharCharacter | NationalCharacterCharacter OptVarying | NationalCharCharacter OptVarying | NcharCharacter OptVarying deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- ConstDatetime: -- | TIMESTAMP '(' Iconst ')' opt_timezone -- | TIMESTAMP opt_timezone -- | TIME '(' Iconst ')' opt_timezone -- | TIME opt_timezone -- @ data ConstDatetime = TimestampConstDatetime (Maybe Int64) (Maybe Timezone) | TimeConstDatetime (Maybe Int64) (Maybe Timezone) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_timezone: -- | WITH_LA TIME ZONE -- | WITHOUT TIME ZONE -- | EMPTY -- @ type Timezone = Bool -- | -- ==== References -- @ -- opt_interval: -- | YEAR_P -- | MONTH_P -- | DAY_P -- | HOUR_P -- | MINUTE_P -- | interval_second -- | YEAR_P TO MONTH_P -- | DAY_P TO HOUR_P -- | DAY_P TO MINUTE_P -- | DAY_P TO interval_second -- | HOUR_P TO MINUTE_P -- | HOUR_P TO interval_second -- | MINUTE_P TO interval_second -- | EMPTY -- @ data Interval = YearInterval | MonthInterval | DayInterval | HourInterval | MinuteInterval | SecondInterval IntervalSecond | YearToMonthInterval | DayToHourInterval | DayToMinuteInterval | DayToSecondInterval IntervalSecond | HourToMinuteInterval | HourToSecondInterval IntervalSecond | MinuteToSecondInterval IntervalSecond deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- interval_second: -- | SECOND_P -- | SECOND_P '(' Iconst ')' -- @ type IntervalSecond = Maybe Int64 -- * Names & References -- | -- ==== References -- @ -- IDENT -- @ data Ident = QuotedIdent Text | UnquotedIdent Text deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- ColId: -- | IDENT -- | unreserved_keyword -- | col_name_keyword -- @ type ColId = Ident -- | -- ==== References -- @ -- ColLabel: -- | IDENT -- | unreserved_keyword -- | col_name_keyword -- | type_func_name_keyword -- | reserved_keyword -- @ type ColLabel = Ident -- | -- ==== References -- @ -- name: -- | ColId -- @ type Name = ColId -- | -- ==== References -- @ -- name_list: -- | name -- | name_list ',' name -- @ type NameList = NonEmpty Name -- | -- ==== References -- @ -- cursor_name: -- | name -- @ type CursorName = Name -- | -- ==== References -- @ -- columnref: -- | ColId -- | ColId indirection -- @ data Columnref = Columnref ColId (Maybe Indirection) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- any_name: -- | ColId -- | ColId attrs -- @ data AnyName = AnyName ColId (Maybe Attrs) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- func_name: -- | type_function_name -- | ColId indirection -- @ data FuncName = TypeFuncName TypeFunctionName | IndirectedFuncName ColId Indirection deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- type_function_name: -- | IDENT -- | unreserved_keyword -- | type_func_name_keyword -- @ type TypeFunctionName = Ident -- | -- ==== References -- @ -- columnref: -- | ColId -- | ColId indirection -- qualified_name: -- | ColId -- | ColId indirection -- @ data QualifiedName = SimpleQualifiedName Ident | IndirectedQualifiedName Ident Indirection deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- indirection: -- | indirection_el -- | indirection indirection_el -- @ type Indirection = NonEmpty IndirectionEl -- | -- ==== References -- @ -- indirection_el: -- | '.' attr_name -- | '.' '*' -- | '[' a_expr ']' -- | '[' opt_slice_bound ':' opt_slice_bound ']' -- opt_slice_bound: -- | a_expr -- | EMPTY -- @ data IndirectionEl = AttrNameIndirectionEl Ident | AllIndirectionEl | ExprIndirectionEl AExpr | SliceIndirectionEl (Maybe AExpr) (Maybe AExpr) deriving (Show, Generic, Eq, Ord) -- * Types -- | -- Typename definition extended with custom question-marks for nullability specification. -- -- To match the standard Postgres syntax simply interpret their presence as a parsing error. -- -- ==== References -- @ -- Typename: -- | SimpleTypename opt_array_bounds -- | SETOF SimpleTypename opt_array_bounds -- | SimpleTypename ARRAY '[' Iconst ']' -- | SETOF SimpleTypename ARRAY '[' Iconst ']' -- | SimpleTypename ARRAY -- | SETOF SimpleTypename ARRAY -- @ data Typename = Typename Bool -- ^ SETOF SimpleTypename Bool -- ^ Question mark (Maybe (TypenameArrayDimensions, Bool)) -- ^ Array dimensions possibly followed by a question mark deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- Part of the Typename specification responsible for the choice between the following: -- | opt_array_bounds -- | ARRAY '[' Iconst ']' -- | ARRAY -- @ data TypenameArrayDimensions = BoundsTypenameArrayDimensions ArrayBounds | ExplicitTypenameArrayDimensions (Maybe Iconst) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_array_bounds: -- | opt_array_bounds '[' ']' -- | opt_array_bounds '[' Iconst ']' -- | EMPTY -- @ type ArrayBounds = NonEmpty (Maybe Iconst) -- | -- ==== References -- @ -- SimpleTypename: -- | GenericType -- | Numeric -- | Bit -- | Character -- | ConstDatetime -- | ConstInterval opt_interval -- | ConstInterval '(' Iconst ')' -- ConstInterval: -- | INTERVAL -- @ data SimpleTypename = GenericTypeSimpleTypename GenericType | NumericSimpleTypename Numeric | BitSimpleTypename Bit | CharacterSimpleTypename Character | ConstDatetimeSimpleTypename ConstDatetime | ConstIntervalSimpleTypename (Either (Maybe Interval) Iconst) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- GenericType: -- | type_function_name opt_type_modifiers -- | type_function_name attrs opt_type_modifiers -- @ data GenericType = GenericType TypeFunctionName (Maybe Attrs) (Maybe TypeModifiers) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- attrs: -- | '.' attr_name -- | attrs '.' attr_name -- @ type Attrs = NonEmpty AttrName -- | -- ==== References -- @ -- attr_name: -- | ColLabel -- @ type AttrName = ColLabel -- | -- ==== References -- @ -- opt_type_modifiers: -- | '(' expr_list ')' -- | EMPTY -- @ type TypeModifiers = ExprList -- | -- ==== References -- @ -- type_list: -- | Typename -- | type_list ',' Typename -- @ type TypeList = NonEmpty Typename -- * Operators -- | -- ==== References -- @ -- qual_Op: -- | Op -- | OPERATOR '(' any_operator ')' -- @ data QualOp = OpQualOp Op | OperatorQualOp AnyOperator deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- qual_all_Op: -- | all_Op -- | OPERATOR '(' any_operator ')' -- @ data QualAllOp = AllQualAllOp AllOp | AnyQualAllOp AnyOperator deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- The operator name is a sequence of up to NAMEDATALEN-1 (63 by default) -- characters from the following list: -- -- + - * / < > = ~ ! @ # % ^ & | ` ? -- -- There are a few restrictions on your choice of name: -- -- and /* cannot appear anywhere in an operator name, -- since they will be taken as the start of a comment. -- -- A multicharacter operator name cannot end in + or -, -- unless the name also contains at least one of these characters: -- -- ~ ! @ # % ^ & | ` ? -- -- For example, @- is an allowed operator name, but *- is not. -- This restriction allows PostgreSQL to parse SQL-compliant -- commands without requiring spaces between tokens. -- The use of => as an operator name is deprecated. -- It may be disallowed altogether in a future release. -- -- The operator != is mapped to <> on input, -- so these two names are always equivalent. -- @ type Op = Text -- | -- ==== References -- @ -- any_operator: -- | all_Op -- | ColId '.' any_operator -- @ data AnyOperator = AllOpAnyOperator AllOp | QualifiedAnyOperator ColId AnyOperator deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- all_Op: -- | Op -- | MathOp -- @ data AllOp = OpAllOp Op | MathAllOp MathOp deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- MathOp: -- | '+' -- | '-' -- | '*' -- | '/' -- | '%' -- | '^' -- | '<' -- | '>' -- | '=' -- | LESS_EQUALS -- | GREATER_EQUALS -- | NOT_EQUALS -- @ data MathOp = PlusMathOp | MinusMathOp | AsteriskMathOp | SlashMathOp | PercentMathOp | ArrowUpMathOp | ArrowLeftMathOp | ArrowRightMathOp | EqualsMathOp | LessEqualsMathOp | GreaterEqualsMathOp | ArrowLeftArrowRightMathOp | ExclamationEqualsMathOp deriving (Show, Generic, Eq, Ord, Enum, Bounded) data SymbolicExprBinOp = MathSymbolicExprBinOp MathOp | QualSymbolicExprBinOp QualOp deriving (Show, Generic, Eq, Ord) data VerbalExprBinOp = LikeVerbalExprBinOp | IlikeVerbalExprBinOp | SimilarToVerbalExprBinOp deriving (Show, Generic, Eq, Ord, Enum, Bounded) -- | -- ==== References -- @ -- | a_expr IS NULL_P -- | a_expr IS TRUE_P -- | a_expr IS FALSE_P -- | a_expr IS UNKNOWN -- | a_expr IS DISTINCT FROM a_expr -- | a_expr IS OF '(' type_list ')' -- | a_expr BETWEEN opt_asymmetric b_expr AND a_expr -- | a_expr BETWEEN SYMMETRIC b_expr AND a_expr -- | a_expr IN_P in_expr -- | a_expr IS DOCUMENT_P -- @ data AExprReversableOp = NullAExprReversableOp | TrueAExprReversableOp | FalseAExprReversableOp | UnknownAExprReversableOp | DistinctFromAExprReversableOp AExpr | OfAExprReversableOp TypeList | BetweenAExprReversableOp Bool BExpr AExpr | BetweenSymmetricAExprReversableOp BExpr AExpr | InAExprReversableOp InExpr | DocumentAExprReversableOp deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | b_expr IS DISTINCT FROM b_expr -- | b_expr IS NOT DISTINCT FROM b_expr -- | b_expr IS OF '(' type_list ')' -- | b_expr IS NOT OF '(' type_list ')' -- | b_expr IS DOCUMENT_P -- | b_expr IS NOT DOCUMENT_P -- @ data BExprIsOp = DistinctFromBExprIsOp BExpr | OfBExprIsOp TypeList | DocumentBExprIsOp deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- subquery_Op: -- | all_Op -- | OPERATOR '(' any_operator ')' -- | LIKE -- | NOT_LA LIKE -- | ILIKE -- | NOT_LA ILIKE -- @ data SubqueryOp = AllSubqueryOp AllOp | AnySubqueryOp AnyOperator | LikeSubqueryOp Bool | IlikeSubqueryOp Bool deriving (Show, Generic, Eq, Ord) -- * Indexes -- | -- ==== References -- @ -- index_params: -- | index_elem -- | index_params ',' index_elem -- @ type IndexParams = NonEmpty IndexElem -- | -- ==== References -- @ -- index_elem: -- | ColId opt_collate opt_class opt_asc_desc opt_nulls_order -- | func_expr_windowless opt_collate opt_class opt_asc_desc opt_nulls_order -- | '(' a_expr ')' opt_collate opt_class opt_asc_desc opt_nulls_order -- @ data IndexElem = IndexElem IndexElemDef (Maybe Collate) (Maybe Class) (Maybe AscDesc) (Maybe NullsOrder) deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- | ColId opt_collate opt_class opt_asc_desc opt_nulls_order -- | func_expr_windowless opt_collate opt_class opt_asc_desc opt_nulls_order -- | '(' a_expr ')' opt_collate opt_class opt_asc_desc opt_nulls_order -- @ data IndexElemDef = IdIndexElemDef ColId | FuncIndexElemDef FuncExprWindowless | ExprIndexElemDef AExpr deriving (Show, Generic, Eq, Ord) -- | -- ==== References -- @ -- opt_collate: -- | COLLATE any_name -- | EMPTY -- @ type Collate = AnyName -- | -- ==== References -- @ -- opt_class: -- | any_name -- | EMPTY -- @ type Class = AnyName -- | -- ==== References -- @ -- opt_asc_desc: -- | ASC -- | DESC -- | EMPTY -- @ data AscDesc = AscAscDesc | DescAscDesc deriving (Show, Generic, Eq, Ord, Enum, Bounded) -- | -- ==== References -- @ -- opt_nulls_order: -- | NULLS_LA FIRST_P -- | NULLS_LA LAST_P -- | EMPTY -- @ data NullsOrder = FirstNullsOrder | LastNullsOrder deriving (Show, Generic, Eq, Ord, Enum, Bounded)