packages feed

hydra-0.15.0: src/main/haskell/Hydra/Sources/Sql/Ansi.hs

module Hydra.Sources.Sql.Ansi where

-- Standard imports for type-level sources outside of the kernel
import           Hydra.Kernel
import           Hydra.Dsl.Annotations
import           Hydra.Dsl.Bootstrap
import           Hydra.Dsl.Types                 ((>:))
import qualified Hydra.Dsl.Types                 as T


ns :: Namespace
ns = Namespace "hydra.sql.syntax"

define :: String -> Type -> Binding
define = defineType ns

sql :: String -> Type
sql = typeref ns

module_ :: Module
module_ = Module {
            moduleNamespace = ns,
            moduleDefinitions = (map toTypeDef definitions),
            moduleTermDependencies = [],
            moduleTypeDependencies = [],
            moduleDescription = Just ("A subset of ANSI SQL:2003, capturing selected productions of the BNF grammar provided at "
      ++ "https://ronsavage.github.io/SQL/sql-2003-2.bnf.html, which is based on "
      ++ "the Final Committee Draft (FCD) of ISO/IEC 9075-2:2003")}
  where
    definitions = [
      approximateNumericLiteral,
      binaryStringLiteral,
      characterStringLiteral,
      columnName,
      dateString,
      domainName,
      exactNumericLiteral,
      leftBracketOrTrigraph,
      rightBracketOrTrigraph,
      nationalCharacterStringLiteral,
      pathResolvedUserDefinedTypeName,
      tableName,
      timeString,
      timestampLiteral,
      unicodeCharacterStringLiteral,
      unsignedInteger,
      approximateNumericType,
      arrayElement,
      arrayElementList,
      arrayElementReference,
      arrayType,
      arrayValueConstructor,
      arrayValueConstructorByQuery,
      arrayValueConstructorByEnumeration,
      arrayValueExpression,
      asSubqueryClause,
      attributeOrMethodReference,
      binaryLargeObjectStringType,
      booleanFactor,
      booleanLiteral,
      booleanPredicand,
      booleanPrimary,
      booleanTerm,
      booleanTerm_And,
      booleanTest,
      booleanTest_Sequence_Option,
      booleanType,
      booleanValueExpression,
      booleanValueExpression_Or,
      caseExpression,
      castSpecification,
      characterSetSpecification,
      characterStringType,
      collateClause,
      collectionType,
      collectionValueConstructor,
      collectionValueExpression,
      columnConstraintDefinition,
      columnDefinition,
      columnDefinition_TypeOrDomain_Option,
      columnDefinition_DefaultOrIdentityOrGeneration_Option,
      columnNameList,
      columnOptions,
      columnReference,
      commonValueExpression,
      contextuallyTypedRowValueExpression,
      contextuallyTypedRowValueConstructor,
      contextuallyTypedRowValueExpressionList,
      contextuallyTypedTableValueConstructor,
      dataType,
      dateLiteral,
      datetimeLiteral,
      datetimeType,
      datetimeValueExpression,
      defaultClause,
      exactNumericType,
      exactNumericType_Numeric_Option,
      exactNumericType_Decimal_Option,
      exactNumericType_Dec_Option,
      fieldReference,
      fromConstructor,
      fromDefault,
      fromSubquery,
      generalLiteral,
      generalValueSpecification,
      generationClause,
      globalOrLocal,
      identityColumnSpecification,
      insertColumnList,
      insertColumnsAndSource,
      insertStatement,
      insertionTarget,
      intervalLiteral,
      intervalType,
      intervalValueExpression,
      largeObjectLength,
      length_,
      likeClause,
      methodInvocation,
      multisetElementReference,
      multisetType,
      multisetValueConstructor,
      multisetValueExpression,
      nationalCharacterStringType_,
      newSpecification,
      nextValueExpression,
      numericType,
      numericValueExpression,
      overrideClause,
      parenthesizedValueExpression,
      precision,
      predefinedType,
      predefinedType_String,
      predefinedType_NationalString,
      predicate,
      queryExpression,
      referenceScopeCheck,
      referenceType,
      rowType,
      rowValueSpecialCase,
      nonparenthesizedValueExpressionPrimary,
      referenceResolution,
      referenceValueExpression,
      rowValueExpression,
      routineInvocation,
      scalarSubquery,
      scale,
      selfReferencingColumnSpecification,
      setFunctionSpecification,
      staticMethodInvocation,
      stringValueExpression,
      subquery,
      subtableClause,
      subtypeTreatment,
      tableCommitAction,
      tableConstraintDefinition,
      tableContentsSource,
      tableContentsSource_Subtable,
      tableDefinition,
      tableElement,
      tableElementList,
      tableScope,
      timeLiteral,
      truthValue,
      unsignedLiteral,
      unsignedNumericLiteral,
      unsignedValueSpecification,
      userDefinedTypeValueExpression,
      valueExpression,
      valueExpressionPrimary,
      windowFunction]

-- Token definitions

approximateNumericLiteral :: Binding
approximateNumericLiteral = define "ApproximateNumericLiteral" $ T.wrap T.string

binaryStringLiteral :: Binding
binaryStringLiteral = define "BinaryStringLiteral" $ T.wrap T.unit

characterStringLiteral :: Binding
characterStringLiteral = define "CharacterStringLiteral" $ T.wrap T.string

columnName :: Binding
columnName = define "ColumnName" $ T.wrap T.string

dateString :: Binding
dateString = define "DateString" $ T.wrap T.unit

domainName :: Binding
domainName = define "DomainName" $ T.wrap T.string

exactNumericLiteral :: Binding
exactNumericLiteral = define "ExactNumericLiteral" $ T.wrap T.string

leftBracketOrTrigraph :: Binding
leftBracketOrTrigraph = define "LeftBracketOrTrigraph" $ T.wrap T.string

rightBracketOrTrigraph :: Binding
rightBracketOrTrigraph = define "RightBracketOrTrigraph" $ T.wrap T.string

nationalCharacterStringLiteral :: Binding
nationalCharacterStringLiteral = define "NationalCharacterStringLiteral" $ T.wrap T.unit

pathResolvedUserDefinedTypeName :: Binding
pathResolvedUserDefinedTypeName = define "PathResolvedUserDefinedTypeName" $ T.wrap T.string

tableName :: Binding
tableName = define "TableName" $ T.wrap T.string

timeString :: Binding
timeString = define "TimeString" $ T.wrap T.unit

timestampLiteral :: Binding
timestampLiteral = define "TimestampLiteral" $ T.wrap T.unit

unicodeCharacterStringLiteral :: Binding
unicodeCharacterStringLiteral = define "UnicodeCharacterStringLiteral" $ T.wrap T.unit

unsignedInteger :: Binding
unsignedInteger = define "UnsignedInteger" $ T.wrap T.string

-- Type definitions

approximateNumericType :: Binding
approximateNumericType = define "ApproximateNumericType" $
  T.union [
    "float">: T.maybe (sql "Precision"),
    "real">: T.unit,
    "double">: T.unit]

arrayElement :: Binding
arrayElement = define "ArrayElement" $ T.wrap $ sql "ValueExpression"

arrayElementList :: Binding
arrayElementList = define "ArrayElementList" $
  T.record [
    "first">: sql "ArrayElement",
    "rest">: T.list (sql "ArrayElement")]

arrayElementReference :: Binding
arrayElementReference = define "ArrayElementReference" $ T.wrap T.unit

arrayType :: Binding
arrayType = define "ArrayType" $ T.wrap T.unit

arrayValueConstructor :: Binding
arrayValueConstructor = define "ArrayValueConstructor" $
  T.union [
    "enumeration">: sql "ArrayValueConstructorByEnumeration",
    "query">: sql "ArrayValueConstructorByQuery"]

arrayValueConstructorByQuery :: Binding
arrayValueConstructorByQuery = define "ArrayValueConstructorByQuery" $ T.wrap T.unit

arrayValueConstructorByEnumeration :: Binding
arrayValueConstructorByEnumeration = define "ArrayValueConstructorByEnumeration" $
  T.record [
    "LeftBracketOrTrigraph">: sql "LeftBracketOrTrigraph",
    "ArrayElementList">: sql "ArrayElementList",
    "RightBracketOrTrigraph">: sql "RightBracketOrTrigraph"]

arrayValueExpression :: Binding
arrayValueExpression = define "ArrayValueExpression" $ T.wrap T.unit

asSubqueryClause :: Binding
asSubqueryClause = define "AsSubqueryClause" $ T.wrap T.unit

attributeOrMethodReference :: Binding
attributeOrMethodReference = define "AttributeOrMethodReference" $ T.wrap T.unit

binaryLargeObjectStringType :: Binding
binaryLargeObjectStringType = define "BinaryLargeObjectStringType" $
  T.union [
    "binary">: T.maybe (sql "LargeObjectLength"),
    "blob">: T.maybe (sql "LargeObjectLength")]

booleanFactor :: Binding
booleanFactor = define "BooleanFactor" $
  T.record [
    "NOT">: T.maybe T.unit,
    "BooleanTest">: sql "BooleanTest"]

booleanLiteral :: Binding
booleanLiteral = define "BooleanLiteral" $
  T.union [
    "TRUE">: T.unit,
    "FALSE">: T.unit,
    "UNKNOWN">: T.unit]

booleanPredicand :: Binding
booleanPredicand = define "BooleanPredicand" $ T.wrap T.unit

booleanPrimary :: Binding
booleanPrimary = define "BooleanPrimary" $
  T.union [
    "predicate">: sql "Predicate",
    "predicand">: sql "BooleanPredicand"]

booleanTerm :: Binding
booleanTerm = define "BooleanTerm" $
  T.union [
    "factor">: sql "BooleanFactor",
    "and">: sql "BooleanTerm_And"]

booleanTerm_And :: Binding
booleanTerm_And = define "BooleanTerm_And" $
  T.record [
    "lhs">: sql "BooleanTerm",
    "rhs">: sql "BooleanFactor"]

booleanTest :: Binding
booleanTest = define "BooleanTest" $
  T.record [
    "BooleanPrimary">: sql "BooleanPrimary",
    "Sequence">: T.maybe (sql "BooleanTest_Sequence_Option")]

booleanTest_Sequence_Option :: Binding
booleanTest_Sequence_Option = define "BooleanTest_Sequence_Option" $
  T.record [
    "NOT">: T.maybe T.unit,
    "TruthValue">: sql "TruthValue"]

booleanType :: Binding
booleanType = define "BooleanType" $ T.wrap T.unit

booleanValueExpression :: Binding
booleanValueExpression = define "BooleanValueExpression" $
  T.union [
    "term">: sql "BooleanTerm",
    "or">: sql "BooleanValueExpression_Or"]

booleanValueExpression_Or :: Binding
booleanValueExpression_Or = define "BooleanValueExpression_Or" $
  T.record [
    "lhs">: sql "BooleanValueExpression",
    "rhs">: sql "BooleanTerm"]

caseExpression :: Binding
caseExpression = define "CaseExpression" $ T.wrap T.unit

castSpecification :: Binding
castSpecification = define "CastSpecification" $ T.wrap T.unit

characterSetSpecification :: Binding
characterSetSpecification = define "CharacterSetSpecification" $ T.wrap T.unit

characterStringType :: Binding
characterStringType = define "CharacterStringType" $
  T.union [
    "character">: T.maybe (sql "Length"),
    "char">: T.maybe (sql "Length"),
    "characterVarying">: sql "Length",
    "charVarying">: sql "Length",
    "varchar">: sql "Length",
    "characterLargeObject">: T.maybe (sql "LargeObjectLength"),
    "charLargeObject">: T.maybe (sql "LargeObjectLength"),
    "clob">: T.maybe (sql "LargeObjectLength")]

collateClause :: Binding
collateClause = define "CollateClause" $ T.wrap T.unit

collectionType :: Binding
collectionType = define "CollectionType" $
  T.union [
    "array">: sql "ArrayType",
    "multiset">: sql "MultisetType"]

collectionValueConstructor :: Binding
collectionValueConstructor = define "CollectionValueConstructor" $
  T.union [
    "array">: sql "ArrayValueConstructor",
    "multiset">: sql "MultisetValueConstructor"]

collectionValueExpression :: Binding
collectionValueExpression = define "CollectionValueExpression" $
  T.union [
    "array">: sql "ArrayValueExpression",
    "multiset">: sql "MultisetValueExpression"]

columnConstraintDefinition :: Binding
columnConstraintDefinition = define "ColumnConstraintDefinition" $ T.wrap T.unit

columnDefinition :: Binding
columnDefinition = define "ColumnDefinition" $
  T.record [
    "name">: sql "ColumnName",
    "typeOrDomain">: T.maybe (sql "ColumnDefinition_TypeOrDomain_Option"),
    "refScope">: T.maybe (sql "ReferenceScopeCheck"),
    "defaultOrIdentityOrGeneration">: T.maybe (sql "ColumnDefinition_DefaultOrIdentityOrGeneration_Option"),
    "constraints">: T.list (sql "ColumnConstraintDefinition"),
    "collate">: T.maybe (sql "CollateClause")]

columnDefinition_TypeOrDomain_Option :: Binding
columnDefinition_TypeOrDomain_Option = define "ColumnDefinition_TypeOrDomain_Option" $
  T.union [
    "DataType">: sql "DataType",
    "DomainName">: sql "DomainName"]

columnDefinition_DefaultOrIdentityOrGeneration_Option :: Binding
columnDefinition_DefaultOrIdentityOrGeneration_Option = define "ColumnDefinition_DefaultOrIdentityOrGeneration_Option" $
  T.union [
    "DefaultClause">: sql "DefaultClause",
    "IdentityColumnSpecification">: sql "IdentityColumnSpecification",
    "GenerationClause">: sql "GenerationClause"]

columnNameList :: Binding
columnNameList = define "ColumnNameList" $
  T.record [
    "first">: sql "ColumnName",
    "rest">: T.list (sql "ColumnName")]

columnOptions :: Binding
columnOptions = define "ColumnOptions" $ T.wrap T.unit

columnReference :: Binding
columnReference = define "ColumnReference" $ T.wrap T.unit

commonValueExpression :: Binding
commonValueExpression = define "CommonValueExpression" $
  T.union [
    "numeric">: sql "NumericValueExpression",
    "string">: sql "StringValueExpression",
    "datetime">: sql "DatetimeValueExpression",
    "interval">: sql "IntervalValueExpression",
    "userDefined">: sql "UserDefinedTypeValueExpression",
    "reference">: sql "ReferenceValueExpression",
    "collection">: sql "CollectionValueExpression"]

contextuallyTypedRowValueExpression :: Binding
contextuallyTypedRowValueExpression = define "ContextuallyTypedRowValueExpression" $
  T.union [
    "specialCase">: sql "RowValueSpecialCase",
    "constructor">: sql "ContextuallyTypedRowValueConstructor"]

contextuallyTypedRowValueConstructor :: Binding
contextuallyTypedRowValueConstructor = define "ContextuallyTypedRowValueConstructor" $ T.wrap T.unit

contextuallyTypedRowValueExpressionList :: Binding
contextuallyTypedRowValueExpressionList = define "ContextuallyTypedRowValueExpressionList" $
  T.record [
    "first">: sql "ContextuallyTypedRowValueExpression",
    "rest">: T.list (sql "ContextuallyTypedRowValueExpression")]

contextuallyTypedTableValueConstructor :: Binding
contextuallyTypedTableValueConstructor = define "ContextuallyTypedTableValueConstructor" $
  T.wrap $ sql "ContextuallyTypedRowValueExpressionList"

dataType :: Binding
dataType = define "DataType" $
  T.union [
    "predefined">: sql "PredefinedType",
    "row">: sql "RowType",
    "named">: sql "PathResolvedUserDefinedTypeName",
    "reference">: sql "ReferenceType",
    "collection">: sql "CollectionType"]

dateLiteral :: Binding
dateLiteral = define "DateLiteral" $ T.wrap $ sql "DateString"

datetimeLiteral :: Binding
datetimeLiteral = define "DatetimeLiteral" $
  T.union [
    "date">: sql "DateLiteral",
    "time">: sql "TimeLiteral",
    "timestamp">: sql "TimestampLiteral"]

datetimeType :: Binding
datetimeType = define "DatetimeType" $ T.wrap T.unit

datetimeValueExpression :: Binding
datetimeValueExpression = define "DatetimeValueExpression" $ T.wrap T.unit

defaultClause :: Binding
defaultClause = define "DefaultClause" $ T.wrap T.unit

exactNumericType :: Binding
exactNumericType = define "ExactNumericType" $
  T.union [
    "numeric">: T.maybe (sql "ExactNumericType_Numeric_Option"),
    "decimal">: T.maybe (sql "ExactNumericType_Decimal_Option"),
    "dec">: T.maybe (sql "ExactNumericType_Dec_Option"),
    "smallint">: T.unit,
    "integer">: T.unit,
    "int">: T.unit,
    "bigint">: T.unit]

exactNumericType_Numeric_Option :: Binding
exactNumericType_Numeric_Option = define "ExactNumericType_Numeric_Option" $
  T.record [
    "Precision">: sql "Precision",
    "Sequence">: T.maybe (sql "Scale")]

exactNumericType_Decimal_Option :: Binding
exactNumericType_Decimal_Option = define "ExactNumericType_Decimal_Option" $
  T.record [
    "Precision">: sql "Precision",
    "Sequence">: T.maybe (sql "Scale")]

exactNumericType_Dec_Option :: Binding
exactNumericType_Dec_Option = define "ExactNumericType_Dec_Option" $
  T.record [
    "Precision">: sql "Precision",
    "Sequence">: T.maybe (sql "Scale")]

fieldReference :: Binding
fieldReference = define "FieldReference" $ T.wrap T.unit

fromConstructor :: Binding
fromConstructor = define "FromConstructor" $
  T.record [
    "columns">: T.maybe (sql "InsertColumnList"),
    "override">: T.maybe (sql "OverrideClause"),
    "values">: sql "ContextuallyTypedTableValueConstructor"]

fromDefault :: Binding
fromDefault = define "FromDefault" $ T.wrap T.unit

fromSubquery :: Binding
fromSubquery = define "FromSubquery" $ T.wrap T.unit

generalLiteral :: Binding
generalLiteral = define "GeneralLiteral" $
  T.union [
    "string">: sql "CharacterStringLiteral",
    "nationalString">: sql "NationalCharacterStringLiteral",
    "unicode">: sql "UnicodeCharacterStringLiteral",
    "binary">: sql "BinaryStringLiteral",
    "dateTime">: sql "DatetimeLiteral",
    "interval">: sql "IntervalLiteral",
    "boolean">: sql "BooleanLiteral"]

generalValueSpecification :: Binding
generalValueSpecification = define "GeneralValueSpecification" $ T.wrap T.unit

generationClause :: Binding
generationClause = define "GenerationClause" $ T.wrap T.unit

globalOrLocal :: Binding
globalOrLocal = define "GlobalOrLocal" $
  T.union [
    "global">: T.unit,
    "local">: T.unit]

identityColumnSpecification :: Binding
identityColumnSpecification = define "IdentityColumnSpecification" $ T.wrap T.unit

insertColumnList :: Binding
insertColumnList = define "InsertColumnList" $ T.wrap $ sql "ColumnNameList"

insertColumnsAndSource :: Binding
insertColumnsAndSource = define "InsertColumnsAndSource" $
  T.union [
    "subquery">: sql "FromSubquery",
    "constructor">: sql "FromConstructor",
    "default">: sql "FromDefault"]

insertStatement :: Binding
insertStatement = define "InsertStatement" $
  T.record [
    "target">: sql "InsertionTarget",
    "columnsAndSource">: sql "InsertColumnsAndSource"]

insertionTarget :: Binding
insertionTarget = define "InsertionTarget" $ T.wrap $ sql "TableName"

intervalLiteral :: Binding
intervalLiteral = define "IntervalLiteral" $ T.wrap T.unit

intervalType :: Binding
intervalType = define "IntervalType" $ T.wrap T.unit

intervalValueExpression :: Binding
intervalValueExpression = define "IntervalValueExpression" $ T.wrap T.unit

largeObjectLength :: Binding
largeObjectLength = define "LargeObjectLength" $ T.wrap T.unit

length_ :: Binding
length_ = define "Length" $ T.wrap $ sql "UnsignedInteger"

likeClause :: Binding
likeClause = define "LikeClause" $ T.wrap T.unit

methodInvocation :: Binding
methodInvocation = define "MethodInvocation" $ T.wrap T.unit

multisetElementReference :: Binding
multisetElementReference = define "MultisetElementReference" $ T.wrap T.unit

multisetType :: Binding
multisetType = define "MultisetType" $ T.wrap $ sql "DataType"

multisetValueConstructor :: Binding
multisetValueConstructor = define "MultisetValueConstructor" $ T.wrap T.unit

multisetValueExpression :: Binding
multisetValueExpression = define "MultisetValueExpression" $ T.wrap T.unit

nationalCharacterStringType_ :: Binding
nationalCharacterStringType_ = define "NationalCharacterStringType" $ T.wrap T.unit

newSpecification :: Binding
newSpecification = define "NewSpecification" $ T.wrap T.unit

nextValueExpression :: Binding
nextValueExpression = define "NextValueExpression" $ T.wrap T.unit

numericType :: Binding
numericType = define "NumericType" $
  T.union [
    "exact">: sql "ExactNumericType",
    "approximate">: sql "ApproximateNumericType"]

numericValueExpression :: Binding
numericValueExpression = define "NumericValueExpression" $ T.wrap T.unit

overrideClause :: Binding
overrideClause = define "OverrideClause" $
  T.union [
    "OVERRIDINGspUSERspVALUE">: T.unit,
    "OVERRIDINGspSYSTEMspVALUE">: T.unit]

parenthesizedValueExpression :: Binding
parenthesizedValueExpression = define "ParenthesizedValueExpression" $
  T.wrap $ sql "ValueExpression"

precision :: Binding
precision = define "Precision" $ T.wrap $ sql "UnsignedInteger"

predefinedType :: Binding
predefinedType = define "PredefinedType" $
  T.union [
    "string">: sql "PredefinedType_String",
    "nationalString">: sql "PredefinedType_NationalString",
    "blob">: sql "BinaryLargeObjectStringType",
    "numeric">: sql "NumericType",
    "boolean">: sql "BooleanType",
    "datetime">: sql "DatetimeType",
    "interval">: sql "IntervalType"]

predefinedType_String :: Binding
predefinedType_String = define "PredefinedType_String" $
  T.record [
    "type">: sql "CharacterStringType",
    "characters">: T.maybe (sql "CharacterSetSpecification"),
    "collate">: T.maybe (sql "CollateClause")]

predefinedType_NationalString :: Binding
predefinedType_NationalString = define "PredefinedType_NationalString" $
  T.record [
    "type">: sql "NationalCharacterStringType",
    "collate">: T.maybe (sql "CollateClause")]

predicate :: Binding
predicate = define "Predicate" $ T.wrap T.unit

queryExpression :: Binding
queryExpression = define "QueryExpression" $ T.wrap T.unit

referenceScopeCheck :: Binding
referenceScopeCheck = define "ReferenceScopeCheck" $ T.wrap T.unit

referenceType :: Binding
referenceType = define "ReferenceType" $ T.wrap T.unit

rowType :: Binding
rowType = define "RowType" $ T.wrap T.unit

rowValueSpecialCase :: Binding
rowValueSpecialCase = define "RowValueSpecialCase" $
  T.wrap $ sql "NonparenthesizedValueExpressionPrimary"

nonparenthesizedValueExpressionPrimary :: Binding
nonparenthesizedValueExpressionPrimary = define "NonparenthesizedValueExpressionPrimary" $
  T.union [
    "unsigned">: sql "UnsignedValueSpecification",
    "column">: sql "ColumnReference",
    "setFunction">: sql "SetFunctionSpecification",
    "windowFunction">: sql "WindowFunction",
    "scalarSubquery">: sql "ScalarSubquery",
    "cases">: sql "CaseExpression",
    "cast">: sql "CastSpecification",
    "field">: sql "FieldReference",
    "subtype">: sql "SubtypeTreatment",
    "method">: sql "MethodInvocation",
    "staticMethod">: sql "StaticMethodInvocation",
    "new">: sql "NewSpecification",
    "attributeOrMethod">: sql "AttributeOrMethodReference",
    "reference">: sql "ReferenceResolution",
    "collection">: sql "CollectionValueConstructor",
    "arrayElement">: sql "ArrayElementReference",
    "multisetElement">: sql "MultisetElementReference",
    "routine">: sql "RoutineInvocation",
    "next">: sql "NextValueExpression"]

referenceResolution :: Binding
referenceResolution = define "ReferenceResolution" $ T.wrap T.unit

referenceValueExpression :: Binding
referenceValueExpression = define "ReferenceValueExpression" $
  T.wrap $ sql "ValueExpressionPrimary"

rowValueExpression :: Binding
rowValueExpression = define "RowValueExpression" $ T.wrap T.unit

routineInvocation :: Binding
routineInvocation = define "RoutineInvocation" $ T.wrap T.unit

scalarSubquery :: Binding
scalarSubquery = define "ScalarSubquery" $ T.wrap $ sql "Subquery"

scale :: Binding
scale = define "Scale" $ T.wrap $ sql "UnsignedInteger"

selfReferencingColumnSpecification :: Binding
selfReferencingColumnSpecification = define "SelfReferencingColumnSpecification" $ T.wrap T.unit

setFunctionSpecification :: Binding
setFunctionSpecification = define "SetFunctionSpecification" $ T.wrap T.unit

staticMethodInvocation :: Binding
staticMethodInvocation = define "StaticMethodInvocation" $ T.wrap T.unit

stringValueExpression :: Binding
stringValueExpression = define "StringValueExpression" $ T.wrap T.unit

subquery :: Binding
subquery = define "Subquery" $ T.wrap $ sql "QueryExpression"

subtableClause :: Binding
subtableClause = define "SubtableClause" $ T.wrap T.unit

subtypeTreatment :: Binding
subtypeTreatment = define "SubtypeTreatment" $ T.wrap T.unit

tableCommitAction :: Binding
tableCommitAction = define "TableCommitAction" $
  T.union [
    "preserve">: T.unit,
    "delete">: T.unit]

tableConstraintDefinition :: Binding
tableConstraintDefinition = define "TableConstraintDefinition" $ T.wrap T.unit

tableContentsSource :: Binding
tableContentsSource = define "TableContentsSource" $
  T.union [
    "list">: sql "TableElementList",
    "subtable">: sql "TableContentsSource_Subtable",
    "subquery">: sql "AsSubqueryClause"]

tableContentsSource_Subtable :: Binding
tableContentsSource_Subtable = define "TableContentsSource_Subtable" $
  T.record [
    "type">: sql "PathResolvedUserDefinedTypeName",
    "subtable">: T.maybe (sql "SubtableClause"),
    "elements">: T.maybe (sql "TableElementList")]

tableDefinition :: Binding
tableDefinition = define "TableDefinition" $
  T.record [
    "scope">: T.maybe (sql "TableScope"),
    "name">: sql "TableName",
    "source">: sql "TableContentsSource",
    "commitActions">: T.maybe (sql "TableCommitAction")]

tableElement :: Binding
tableElement = define "TableElement" $
  T.union [
    "column">: sql "ColumnDefinition",
    "tableConstraint">: sql "TableConstraintDefinition",
    "like">: sql "LikeClause",
    "selfReferencingColumn">: sql "SelfReferencingColumnSpecification",
    "columOptions">: sql "ColumnOptions"]

tableElementList :: Binding
tableElementList = define "TableElementList" $
  T.record [
    "first">: sql "TableElement",
    "rest">: T.list (sql "TableElement")]

tableScope :: Binding
tableScope = define "TableScope" $ T.wrap $ sql "GlobalOrLocal"

timeLiteral :: Binding
timeLiteral = define "TimeLiteral" $ T.wrap $ sql "TimeString"

truthValue :: Binding
truthValue = define "TruthValue" $
  T.union [
    "TRUE">: T.unit,
    "FALSE">: T.unit,
    "UNKNOWN">: T.unit]

unsignedLiteral :: Binding
unsignedLiteral = define "UnsignedLiteral" $
  T.union [
    "numeric">: sql "UnsignedNumericLiteral",
    "general">: sql "GeneralLiteral"]

unsignedNumericLiteral :: Binding
unsignedNumericLiteral = define "UnsignedNumericLiteral" $
  T.union [
    "exact">: sql "ExactNumericLiteral",
    "approximate">: sql "ApproximateNumericLiteral"]

unsignedValueSpecification :: Binding
unsignedValueSpecification = define "UnsignedValueSpecification" $
  T.union [
    "literal">: sql "UnsignedLiteral",
    "general">: sql "GeneralValueSpecification"]

userDefinedTypeValueExpression :: Binding
userDefinedTypeValueExpression = define "UserDefinedTypeValueExpression" $
  T.wrap $ sql "ValueExpressionPrimary"

valueExpression :: Binding
valueExpression = define "ValueExpression" $
  T.union [
    "common">: sql "CommonValueExpression",
    "boolean">: sql "BooleanValueExpression",
    "row">: sql "RowValueExpression"]

valueExpressionPrimary :: Binding
valueExpressionPrimary = define "ValueExpressionPrimary" $
  T.union [
    "parens">: sql "ParenthesizedValueExpression",
    "noparens">: sql "NonparenthesizedValueExpressionPrimary"]

windowFunction :: Binding
windowFunction = define "WindowFunction" $ T.wrap T.unit