packages feed

hssqlppp-0.0.6: Database/HsSqlPpp/TypeChecking/AstInternal.hs

{-# OPTIONS_HADDOCK hide #-}


-- UUAGC 0.9.10 (AstInternal.ag)
module Database.HsSqlPpp.TypeChecking.AstInternal(
    --from the ag files:
    --ast nodes
    Statement (..)
   ,SelectExpression (..)
   ,FnBody (..)
   ,SetClause (..)
   ,TableRef (..)
   ,JoinExpression (..)
   ,JoinType (..)
   ,SelectList (..)
   ,SelectItem (..)
   ,CopySource (..)
   ,AttributeDef (..)
   ,RowConstraint (..)
   ,Constraint (..)
   ,TypeAttributeDef (..)
   ,ParamDef (..)
   ,VarDef (..)
   ,RaiseType (..)
   ,CombineType (..)
   ,Volatility (..)
   ,Language (..)
   ,TypeName (..)
   ,DropType (..)
   ,Cascade (..)
   ,Direction (..)
   ,Distinct (..)
   ,Natural (..)
   ,IfExists (..)
   ,RestartIdentity (..)
   ,Expression (..)
   ,InList (..)
   ,StatementList
   ,ExpressionListStatementListPairList
   ,ExpressionListStatementListPair
   ,ExpressionList
   ,StringList
   ,ParamDefList
   ,AttributeDefList
   ,ConstraintList
   ,TypeAttributeDefList
   ,Where
   ,StringStringListPairList
   ,StringStringListPair
   ,ExpressionStatementListPairList
   ,SetClauseList
   ,CaseExpressionListExpressionPairList
   ,MaybeExpression
   ,MTableRef
   ,ExpressionListList
   ,SelectItemList
   ,OnExpr
   ,RowConstraintList
   ,VarDefList
   ,ExpressionStatementListPair
   ,MExpression
   ,CaseExpressionListExpressionPair
   ,CaseExpressionList
   -- annotations
   ,annotateAst
   ,annotateAstScope
   ,annotateExpression
) where

import Data.Maybe
import Data.List
import Debug.Trace
import Control.Monad.Error
import Control.Arrow
import Data.Either
import Control.Applicative

import Database.HsSqlPpp.TypeChecking.TypeType
import Database.HsSqlPpp.TypeChecking.AstUtils
import Database.HsSqlPpp.TypeChecking.TypeConversion
import Database.HsSqlPpp.TypeChecking.TypeCheckingH
import Database.HsSqlPpp.TypeChecking.Scope
import Database.HsSqlPpp.TypeChecking.ScopeData
import Database.HsSqlPpp.TypeChecking.AstAnnotation



-- | Takes an ast, and adds annotations, including types, type errors,
-- and statement info. Type checks against defaultScope.
annotateAst :: StatementList -> StatementList
annotateAst = annotateAstScope defaultScope

-- | As annotateAst but you supply an additional scope to add to the
-- defaultScope to type check against. See Scope module for how to
-- read a scope from an existing database so you can type check
-- against it.
annotateAstScope :: Scope -> StatementList -> StatementList
annotateAstScope scope sts =
    let t = sem_Root (Root sts)
        ta = wrap_Root t Inh_Root {scope_Inh_Root = combineScopes defaultScope scope}
        tl = annotatedTree_Syn_Root ta
    in case tl of
         Root r -> r

-- | Testing utility, mainly used to check an expression for type errors
-- or to get its type.
annotateExpression :: Scope -> Expression -> Expression
annotateExpression scope ex =
    let t = sem_ExpressionRoot (ExpressionRoot ex)
        rt = (annotatedTree_Syn_ExpressionRoot
              (wrap_ExpressionRoot t Inh_ExpressionRoot {scope_Inh_ExpressionRoot = combineScopes defaultScope scope}))
    in case rt of
         ExpressionRoot e -> e

{-

================================================================================

= instances for Annotated.

Hopefully, some sort of SYB approach can be used to autogenerate these
in the future. It is imperative that this or template haskell or
something similar be used because doing it by hand guarantees some
bits will be missed.

Stupidity watch update: use attributes to do this. Doh.

-}

instance Annotated Statement where
  ann a =
      case a of
        SelectStatement ann _ -> ann
        Insert ann _ _ _ _ -> ann
        Update ann _ _ _ _ -> ann
        Delete ann _ _ _ -> ann
        Copy ann _ _ _ -> ann
        CopyData ann _ -> ann
        Truncate ann _ _ _ -> ann
        CreateTable ann _ _ _ -> ann
        CreateTableAs ann _ _ -> ann
        CreateView ann _ _ -> ann
        CreateType ann _ _ -> ann
        CreateFunction ann _ _ _ _ _ _ _ -> ann
        CreateDomain ann _ _ _ -> ann
        DropFunction ann _ _ _ -> ann
        DropSomething ann _ _ _ _ -> ann
        Assignment ann _ _ -> ann
        Return ann _ -> ann
        ReturnNext ann _ -> ann
        ReturnQuery ann _ -> ann
        Raise ann _ _ _ -> ann
        NullStatement  ann -> ann
        Perform ann _ -> ann
        Execute ann _ -> ann
        ExecuteInto ann _ _ -> ann
        ForSelectStatement ann _ _ _ -> ann
        ForIntegerStatement ann _ _ _ _ -> ann
        WhileStatement ann _ _ -> ann
        ContinueStatement ann -> ann
        CaseStatement ann _ _ _ -> ann
        If ann _ _  -> ann
  setAnn st a =
      case st of
        SelectStatement _ ex -> SelectStatement a ex
        Insert _ tbl cols ins ret -> Insert a tbl cols ins ret
        Update _ tbl as whr ret -> Update a tbl as whr ret
        Delete _ tbl whr ret -> Delete a tbl whr ret
        Copy _ tbl cols src -> Copy a tbl cols src
        CopyData _ i -> CopyData a i
        Truncate _ tbls ri cs -> Truncate a tbls ri cs
        CreateTable _ name atts cons -> CreateTable a name atts cons
        CreateTableAs _ name ex -> CreateTableAs a name ex
        CreateView _ name expr -> CreateView a name expr
        CreateType _ name atts -> CreateType a name atts
        CreateFunction _ lang name params rettype bodyQuote body vol ->
            CreateFunction a lang name params rettype bodyQuote body vol
        CreateDomain _ name typ check -> CreateDomain a name typ check
        DropFunction _ i s cs -> DropFunction a i s cs
        DropSomething _ dt i nms cs -> DropSomething a dt i nms cs
        Assignment _ tgt val -> Assignment a tgt val
        Return _ v -> Return a v
        ReturnNext _ ex -> ReturnNext a ex
        ReturnQuery _ sel -> ReturnQuery a sel
        Raise _ l m args -> Raise a l m args
        NullStatement _ -> NullStatement a
        Perform _ expr -> Perform a expr
        Execute _ expr -> Execute a expr
        ExecuteInto _ expr tgts -> ExecuteInto a expr tgts
        ForSelectStatement _ var sel sts -> ForSelectStatement a var sel sts
        ForIntegerStatement _ var from to sts -> ForIntegerStatement a var from to sts
        WhileStatement _ expr sts -> WhileStatement a expr sts
        ContinueStatement _ -> ContinueStatement a
        CaseStatement _ val cases els -> CaseStatement a val cases els
        If _ cases els -> If a cases els

  changeAnnRecurse f st =
    case st of
        SelectStatement a ex -> SelectStatement (f a) ex
        Insert a tbl cols ins ret -> Insert (f a) tbl cols ins ret
        Update a tbl as whr ret -> Update (f a) tbl as whr ret
        Delete a tbl whr ret -> Delete (f a) tbl whr ret
        Copy a tbl cols src -> Copy (f a) tbl cols src
        CopyData a i -> CopyData (f a) i
        Truncate a tbls ri cs -> Truncate (f a) tbls ri cs
        CreateTable a name atts cons -> CreateTable (f a) name atts cons
        CreateTableAs a name ex -> CreateTableAs (f a) name ex
        CreateView a name expr -> CreateView (f a) name expr
        CreateType a name atts -> CreateType (f a) name atts
        CreateFunction a lang name params rettype bodyQuote body vol ->
            CreateFunction (f a) lang name params rettype bodyQuote doBody vol
            where
              doBody = case body of
                         SqlFnBody sts -> SqlFnBody $ cars f sts
                         PlpgsqlFnBody vars sts -> PlpgsqlFnBody vars $ cars f sts
        CreateDomain a name typ check -> CreateDomain (f a) name typ check
        DropFunction a i s cs -> DropFunction (f a) i s cs
        DropSomething a dt i nms cs -> DropSomething (f a) dt i nms cs
        Assignment a tgt val -> Assignment (f a) tgt val
        Return a v -> Return (f a) v
        ReturnNext a ex -> ReturnNext (f a) ex
        ReturnQuery a sel -> ReturnQuery (f a) sel
        Raise a l m args -> Raise (f a) l m args
        NullStatement a -> NullStatement (f a)
        Perform a expr -> Perform (f a) expr
        Execute a expr -> Execute (f a) expr
        ExecuteInto a expr tgts -> ExecuteInto (f a) expr tgts
        ForSelectStatement a var sel sts -> ForSelectStatement (f a) var sel $ cars f sts
        ForIntegerStatement a var from to sts -> ForIntegerStatement (f a) var from to $ cars f sts
        WhileStatement a expr sts -> WhileStatement (f a) expr $ cars f sts
        ContinueStatement a -> ContinueStatement (f a)
        CaseStatement a val cases els -> CaseStatement (f a) val doCases $ cars f els
            where
              doCases = map (second (cars f)) cases
        If a cases els -> If (f a) doCases $ cars f els
            where
              doCases = map (second (cars f)) cases
    --where
     -- doCases cs = map (\(ex,sts) -> (ex,cars f sts)) cs
  getAnnChildren st =
    case st of
        SelectStatement _ ex -> gacse ex
        Insert _ _ _ ins _ -> gacse ins
        Update _ _ as whr _ -> mp (gacscl as) ++ gacme whr
        Delete _ _ whr _ -> gacme whr
        --Copy _ _ _ _ -> []
        --CopyData _ _ -> []
        --Truncate _ _ _ _ -> []
        --CreateTable _ _ _ _ -> []
        --CreateTableAs _ _ _ -> []
        CreateView _ _ expr -> gacse expr
        --CreateType _ _ _ -> []
        --CreateFunction a lang name params rettype bodyQuote body vol ->
        CreateFunction _ _    _    _      _       _         body _   ->
            case body of
              SqlFnBody sts -> mp sts
              PlpgsqlFnBody _ sts -> mp sts
        --CreateDomain _ _ _ _ -> []
        --DropFunction _ _ _ _ -> []
        --DropSomething _ _ _ _ _ -> []
        --Assignment _ _ _ -> []
        --Return a v -> Return (f a) v
        --ReturnNext a ex -> ReturnNext (f a) ex
        --ReturnQuery a sel -> ReturnQuery (f a) sel
        --Raise a l m args -> Raise (f a) l m args
        --NullStatement a -> NullStatement (f a)
        --Perform a expr -> Perform (f a) expr
        --Execute a expr -> Execute (f a) expr
        --ExecuteInto a expr tgts -> ExecuteInto (f a) expr tgts
        ForSelectStatement _ _ sel sts -> gacse sel ++ mp sts
        ForIntegerStatement _ _ _ _ sts -> mp sts
        WhileStatement _ expr sts -> pack expr : mp sts
        --ContinueStatement a -> ContinueStatement (f a)
        CaseStatement _ val cases els -> pack val : mp (doCases cases) ++ mp els
        If _ cases els -> mp $ doCases cases ++ els
        _ -> []
    where
      doCases = concatMap snd
      --gacse :: Annotated a => SelectExpression -> [a]
      gacse se = [pack se]
      gacscl :: Annotated a => SetClauseList -> [a]
      gacscl _ = []
      --gacme :: Annotated a => Maybe Expression -> [a]
      gacme e = case e of
                  Nothing -> []
                  Just e1 -> [pack e1]
      mp = map pack

cars = map . changeAnnRecurse

instance Annotated Expression where
  ann a =
      case a of
        IntegerLit ann _ -> ann
        FloatLit ann _ -> ann
        StringLit ann _ _ -> ann
        NullLit ann -> ann
        BooleanLit ann _ -> ann
        PositionalArg ann _ -> ann
        Cast ann _ _ -> ann
        Identifier ann _ -> ann
        Case ann _ _ -> ann
        CaseSimple ann _ _ _ -> ann
        Exists ann _ -> ann
        FunCall ann _ _ -> ann
        InPredicate ann _ _ _ -> ann
        WindowFn ann _ _ _ _ -> ann
        ScalarSubQuery ann _ -> ann
  setAnn ex a =
    case ex of
      IntegerLit _ i -> IntegerLit a i
      FloatLit _ d -> FloatLit a d
      StringLit _ q v -> StringLit a q v
      NullLit _ -> NullLit a
      BooleanLit _ b -> BooleanLit a b
      PositionalArg _ p -> PositionalArg a p
      Cast _ expr tn -> Cast a expr tn
      Identifier _ i -> Identifier a i
      Case _ cases els -> Case a cases els
      CaseSimple _ val cases els -> CaseSimple a val cases els
      Exists _ sel -> Exists a sel
      FunCall _ funName args -> FunCall a funName args
      InPredicate _ expr i list -> InPredicate a expr i list
      WindowFn _ fn par ord dir -> WindowFn a fn par ord dir
      ScalarSubQuery _ sel -> ScalarSubQuery a sel

  changeAnnRecurse f ex =
    case ex of
      IntegerLit a i -> IntegerLit (f a) i
      FloatLit a d -> FloatLit (f a) d
      StringLit a q v -> StringLit (f a) q v
      NullLit a -> NullLit a
      BooleanLit a b -> BooleanLit (f a) b
      PositionalArg a p -> PositionalArg (f a) p
      Cast a expr tn -> Cast (f a) (changeAnnRecurse f expr) tn
      Identifier a i -> Identifier (f a) i
      Case a cases els -> Case (f a) cases els
      CaseSimple a val cases els -> CaseSimple (f a) val cases els
      Exists a sel -> Exists (f a) sel
      FunCall a funName args -> FunCall (f a) funName args
      InPredicate a expr i list -> InPredicate (f a) expr i list
      WindowFn a fn par ord dir -> WindowFn (f a) fn par ord dir
      ScalarSubQuery a sel -> ScalarSubQuery (f a) sel

  getAnnChildren ex =
    case ex of
      Cast _ expr _ -> mp [expr]
      Case _ cases els -> gacce cases els
      CaseSimple _ val cases els -> pack val : gacce cases els
      Exists a sel -> [pack sel]
      FunCall _ _ args -> mp args
      --InPredicate a expr i list -> InPredicate (f a) expr i list
      --WindowFn a fn par ord dir -> WindowFn (f a) fn par ord dir
      --ScalarSubQuery a sel -> ScalarSubQuery (f a) sel
      _ -> []
    where
      gacme e = case e of
                  Nothing -> []
                  Just e1 -> [pack e1]
      gacce cs el = mp (concatMap (\(el,e) -> el ++ [e]) cs) ++ gacme el
      mp = map pack



instance Annotated SelectExpression where
  ann a =
      case a of
        Select ann _ _ _ _ _ _ _ _ _ _ -> ann
        CombineSelect ann _ _ _ -> ann
        Values ann _ -> ann
  setAnn ex a =
    case ex of
        Select _ dis sl tref whr grp hav ord dir lim off ->
          Select a dis sl tref whr grp hav ord dir lim off
        CombineSelect _ ctype sel1 sel2 -> CombineSelect a ctype sel1 sel2
        Values _ vll -> Values a vll
  changeAnnRecurse f ex =
    case ex of
      Select a dis sl tref whr grp hav ord dir lim off ->
          Select (f a) dis sl tref whr grp hav ord dir lim off
      CombineSelect a ctype sel1 sel2 -> CombineSelect (f a) ctype
                                             (changeAnnRecurse f sel1)
                                             (changeAnnRecurse f sel2)
      Values a vll -> Values (f a) vll
  getAnnChildren ex =
    case ex of
      Select a dis sl tref whr grp hav ord dir lim off ->
          doSl ++
          map pack (maybeToList tref) ++
          doME whr ++ mp grp ++ doME hav ++ mp ord ++ doME lim ++ doME off
          where
            doSl = let SelectList x _ = sl
                       ses = map (\s -> case s of
                                         SelExp se -> se
                                         SelectItem se _ -> se) x
                   in map pack ses
            doME me = case me of
                        Nothing -> []
                        Just e -> [pack e]
      CombineSelect _ _ sel1 sel2 -> [pack sel1,pack sel2]
      Values _ vll -> mp $ concat vll
    where
      mp = map pack

instance Annotated TableRef where
  ann a =
      case a of
        Tref ann _ -> ann
        TrefAlias ann _ _ -> ann
        JoinedTref ann _ _ _ _ _ -> ann
        SubTref ann _ _ -> ann
        TrefFun ann _ -> ann
        TrefFunAlias ann _ _ -> ann
  setAnn ex a =
    case ex of
        Tref _ tbl -> Tref a tbl
        TrefAlias _ tbl alias -> TrefAlias a tbl alias
        JoinedTref _ tbl nat joinType tbl1 onExpr -> JoinedTref a tbl nat joinType tbl1 onExpr
        SubTref _ sel alias -> SubTref a sel alias
        TrefFun _ fn -> TrefFun a fn
        TrefFunAlias _ fn alias -> TrefFunAlias a fn alias
  changeAnnRecurse f ex =
    case ex of
        Tref a tbl -> Tref (f a) tbl
        TrefAlias a tbl alias -> TrefAlias (f a) tbl alias
        JoinedTref a tbl nat joinType tbl1 onExpr ->
          JoinedTref (f a)
                     (changeAnnRecurse f tbl)
                     nat
                     joinType
                     (changeAnnRecurse f tbl1)
                     onExpr
        SubTref a sel alias -> SubTref (f a) (changeAnnRecurse f sel) alias
        TrefFun a fn -> TrefFun (f a) (changeAnnRecurse f fn)
        TrefFunAlias a fn alias -> TrefFunAlias (f a) (changeAnnRecurse f fn) alias
  getAnnChildren ex =
    case ex of
        Tref a tbl -> []
        TrefAlias a tbl alias -> []
        JoinedTref _ tbl _ _ tbl1 onExpr ->
          getAnnChildren tbl ++ getAnnChildren tbl1
        SubTref a sel alias -> getAnnChildren sel
        TrefFun a fn -> getAnnChildren fn
        TrefFunAlias a fn alias -> getAnnChildren fn


annTypesAndErrors :: Annotated a => a -> Type -> [TypeError]
                  -> Maybe AnnotationElement -> a
annTypesAndErrors item nt errs add =
    changeAnn item $
     (([TypeAnnotation nt] ++ maybeToList add ++
       map TypeErrorA errs) ++)


checkExpressionBool :: Maybe Expression -> Either [TypeError] Type
checkExpressionBool whr = do
  let ty = fromMaybe typeBool $ fmap getTypeAnnotation whr
  when (ty `notElem` [typeBool, TypeCheckFailed]) $
       Left [ExpressionMustBeBool]
  return ty


getTbCols = unwrapComposite . unwrapSetOf . getTypeAnnotation



getFnType :: Scope -> String -> Expression -> Either [TypeError] Type
getFnType scope alias =
    either Left (Right . snd) . getFunIdens scope alias

getFunIdens :: Scope -> String -> Expression -> Either [TypeError] (String,Type)
getFunIdens scope alias fnVal =
   case fnVal of
       FunCall _ f _ ->
           let correlationName = if alias /= ""
                                   then alias
                                   else f
           in Right (correlationName, case getTypeAnnotation fnVal of
                SetOfType (CompositeType t) -> getCompositeType t
                SetOfType x -> UnnamedCompositeType [(correlationName,x)]
                y -> UnnamedCompositeType [(correlationName,y)])
       x -> Left [ContextError "FunCall"]
   where
     getCompositeType t =
                    case getAttrs scope [Composite
                                              ,TableComposite
                                              ,ViewComposite] t of
                      Just ((_,_,a@(UnnamedCompositeType _)), _) -> a
                      _ -> UnnamedCompositeType []


fixStar ex =
  changeAnnRecurse fs ex
  where
    fs a = if TypeAnnotation TypeCheckFailed `elem` a
              && any (\an ->
                       case an of
                         TypeErrorA (UnrecognisedIdentifier x) |
                           let (_,iden) = splitIdentifier x
                           in iden == "*" -> True
                         _ -> False) a
             then filter (\an -> case an of
                                   TypeAnnotation TypeCheckFailed -> False
                                   TypeErrorA (UnrecognisedIdentifier _) -> False
                                   _ -> True) a
             else a


fixedValue :: a -> a -> a -> a
fixedValue a _ _ = a





getRowTypes :: [Type] -> [Type]
getRowTypes [RowCtor ts] = ts
getRowTypes ts = ts
-- AttributeDef ------------------------------------------------
data AttributeDef  = AttributeDef (String) (TypeName) (Maybe Expression) (RowConstraintList) 
                   deriving ( Eq,Show)
-- cata
sem_AttributeDef :: AttributeDef  ->
                    T_AttributeDef 
sem_AttributeDef (AttributeDef _name _typ _check _cons )  =
    (sem_AttributeDef_AttributeDef _name (sem_TypeName _typ ) _check (sem_RowConstraintList _cons ) )
-- semantic domain
type T_AttributeDef  = Scope ->
                       ( AttributeDef,String,(Either [TypeError] Type))
data Inh_AttributeDef  = Inh_AttributeDef {scope_Inh_AttributeDef :: Scope}
data Syn_AttributeDef  = Syn_AttributeDef {annotatedTree_Syn_AttributeDef :: AttributeDef,attrName_Syn_AttributeDef :: String,namedType_Syn_AttributeDef :: Either [TypeError] Type}
wrap_AttributeDef :: T_AttributeDef  ->
                     Inh_AttributeDef  ->
                     Syn_AttributeDef 
wrap_AttributeDef sem (Inh_AttributeDef _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOattrName,_lhsOnamedType) =
             (sem _lhsIscope )
     in  (Syn_AttributeDef _lhsOannotatedTree _lhsOattrName _lhsOnamedType ))
sem_AttributeDef_AttributeDef :: String ->
                                 T_TypeName  ->
                                 (Maybe Expression) ->
                                 T_RowConstraintList  ->
                                 T_AttributeDef 
sem_AttributeDef_AttributeDef name_ typ_ check_ cons_  =
    (\ _lhsIscope ->
         (let _lhsOattrName :: String
              _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: AttributeDef
              _typOscope :: Scope
              _consOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _consIannotatedTree :: RowConstraintList
              _lhsOattrName =
                  name_
              _lhsOnamedType =
                  _typInamedType
              _annotatedTree =
                  AttributeDef name_ _typIannotatedTree check_ _consIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _typOscope =
                  _lhsIscope
              _consOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
              ( _consIannotatedTree) =
                  (cons_ _consOscope )
          in  ( _lhsOannotatedTree,_lhsOattrName,_lhsOnamedType)))
-- AttributeDefList --------------------------------------------
type AttributeDefList  = [(AttributeDef)]
-- cata
sem_AttributeDefList :: AttributeDefList  ->
                        T_AttributeDefList 
sem_AttributeDefList list  =
    (Prelude.foldr sem_AttributeDefList_Cons sem_AttributeDefList_Nil (Prelude.map sem_AttributeDef list) )
-- semantic domain
type T_AttributeDefList  = Scope ->
                           ( AttributeDefList,([(String, Either [TypeError] Type)]))
data Inh_AttributeDefList  = Inh_AttributeDefList {scope_Inh_AttributeDefList :: Scope}
data Syn_AttributeDefList  = Syn_AttributeDefList {annotatedTree_Syn_AttributeDefList :: AttributeDefList,attrs_Syn_AttributeDefList :: [(String, Either [TypeError] Type)]}
wrap_AttributeDefList :: T_AttributeDefList  ->
                         Inh_AttributeDefList  ->
                         Syn_AttributeDefList 
wrap_AttributeDefList sem (Inh_AttributeDefList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOattrs) =
             (sem _lhsIscope )
     in  (Syn_AttributeDefList _lhsOannotatedTree _lhsOattrs ))
sem_AttributeDefList_Cons :: T_AttributeDef  ->
                             T_AttributeDefList  ->
                             T_AttributeDefList 
sem_AttributeDefList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOattrs :: ([(String, Either [TypeError] Type)])
              _lhsOannotatedTree :: AttributeDefList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: AttributeDef
              _hdIattrName :: String
              _hdInamedType :: (Either [TypeError] Type)
              _tlIannotatedTree :: AttributeDefList
              _tlIattrs :: ([(String, Either [TypeError] Type)])
              _lhsOattrs =
                  (_hdIattrName, _hdInamedType) : _tlIattrs
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdIattrName,_hdInamedType) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlIattrs) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOattrs)))
sem_AttributeDefList_Nil :: T_AttributeDefList 
sem_AttributeDefList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOattrs :: ([(String, Either [TypeError] Type)])
              _lhsOannotatedTree :: AttributeDefList
              _lhsOattrs =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOattrs)))
-- Cascade -----------------------------------------------------
data Cascade  = Cascade 
              | Restrict 
              deriving ( Eq,Show)
-- cata
sem_Cascade :: Cascade  ->
               T_Cascade 
sem_Cascade (Cascade )  =
    (sem_Cascade_Cascade )
sem_Cascade (Restrict )  =
    (sem_Cascade_Restrict )
-- semantic domain
type T_Cascade  = Scope ->
                  ( Cascade)
data Inh_Cascade  = Inh_Cascade {scope_Inh_Cascade :: Scope}
data Syn_Cascade  = Syn_Cascade {annotatedTree_Syn_Cascade :: Cascade}
wrap_Cascade :: T_Cascade  ->
                Inh_Cascade  ->
                Syn_Cascade 
wrap_Cascade sem (Inh_Cascade _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Cascade _lhsOannotatedTree ))
sem_Cascade_Cascade :: T_Cascade 
sem_Cascade_Cascade  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Cascade
              _annotatedTree =
                  Cascade
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Cascade_Restrict :: T_Cascade 
sem_Cascade_Restrict  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Cascade
              _annotatedTree =
                  Restrict
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- CaseExpressionList ------------------------------------------
type CaseExpressionList  = [(Expression)]
-- cata
sem_CaseExpressionList :: CaseExpressionList  ->
                          T_CaseExpressionList 
sem_CaseExpressionList list  =
    (Prelude.foldr sem_CaseExpressionList_Cons sem_CaseExpressionList_Nil (Prelude.map sem_Expression list) )
-- semantic domain
type T_CaseExpressionList  = Scope ->
                             ( CaseExpressionList)
data Inh_CaseExpressionList  = Inh_CaseExpressionList {scope_Inh_CaseExpressionList :: Scope}
data Syn_CaseExpressionList  = Syn_CaseExpressionList {annotatedTree_Syn_CaseExpressionList :: CaseExpressionList}
wrap_CaseExpressionList :: T_CaseExpressionList  ->
                           Inh_CaseExpressionList  ->
                           Syn_CaseExpressionList 
wrap_CaseExpressionList sem (Inh_CaseExpressionList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_CaseExpressionList _lhsOannotatedTree ))
sem_CaseExpressionList_Cons :: T_Expression  ->
                               T_CaseExpressionList  ->
                               T_CaseExpressionList 
sem_CaseExpressionList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CaseExpressionList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: Expression
              _hdIliftedColumnName :: String
              _tlIannotatedTree :: CaseExpressionList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdIliftedColumnName) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_CaseExpressionList_Nil :: T_CaseExpressionList 
sem_CaseExpressionList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CaseExpressionList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- CaseExpressionListExpressionPair ----------------------------
type CaseExpressionListExpressionPair  = ( (CaseExpressionList),(Expression))
-- cata
sem_CaseExpressionListExpressionPair :: CaseExpressionListExpressionPair  ->
                                        T_CaseExpressionListExpressionPair 
sem_CaseExpressionListExpressionPair ( x1,x2)  =
    (sem_CaseExpressionListExpressionPair_Tuple (sem_CaseExpressionList x1 ) (sem_Expression x2 ) )
-- semantic domain
type T_CaseExpressionListExpressionPair  = Scope ->
                                           ( CaseExpressionListExpressionPair)
data Inh_CaseExpressionListExpressionPair  = Inh_CaseExpressionListExpressionPair {scope_Inh_CaseExpressionListExpressionPair :: Scope}
data Syn_CaseExpressionListExpressionPair  = Syn_CaseExpressionListExpressionPair {annotatedTree_Syn_CaseExpressionListExpressionPair :: CaseExpressionListExpressionPair}
wrap_CaseExpressionListExpressionPair :: T_CaseExpressionListExpressionPair  ->
                                         Inh_CaseExpressionListExpressionPair  ->
                                         Syn_CaseExpressionListExpressionPair 
wrap_CaseExpressionListExpressionPair sem (Inh_CaseExpressionListExpressionPair _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_CaseExpressionListExpressionPair _lhsOannotatedTree ))
sem_CaseExpressionListExpressionPair_Tuple :: T_CaseExpressionList  ->
                                              T_Expression  ->
                                              T_CaseExpressionListExpressionPair 
sem_CaseExpressionListExpressionPair_Tuple x1_ x2_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CaseExpressionListExpressionPair
              _x1Oscope :: Scope
              _x2Oscope :: Scope
              _x1IannotatedTree :: CaseExpressionList
              _x2IannotatedTree :: Expression
              _x2IliftedColumnName :: String
              _annotatedTree =
                  (_x1IannotatedTree,_x2IannotatedTree)
              _lhsOannotatedTree =
                  _annotatedTree
              _x1Oscope =
                  _lhsIscope
              _x2Oscope =
                  _lhsIscope
              ( _x1IannotatedTree) =
                  (x1_ _x1Oscope )
              ( _x2IannotatedTree,_x2IliftedColumnName) =
                  (x2_ _x2Oscope )
          in  ( _lhsOannotatedTree)))
-- CaseExpressionListExpressionPairList ------------------------
type CaseExpressionListExpressionPairList  = [(CaseExpressionListExpressionPair)]
-- cata
sem_CaseExpressionListExpressionPairList :: CaseExpressionListExpressionPairList  ->
                                            T_CaseExpressionListExpressionPairList 
sem_CaseExpressionListExpressionPairList list  =
    (Prelude.foldr sem_CaseExpressionListExpressionPairList_Cons sem_CaseExpressionListExpressionPairList_Nil (Prelude.map sem_CaseExpressionListExpressionPair list) )
-- semantic domain
type T_CaseExpressionListExpressionPairList  = Scope ->
                                               ( CaseExpressionListExpressionPairList)
data Inh_CaseExpressionListExpressionPairList  = Inh_CaseExpressionListExpressionPairList {scope_Inh_CaseExpressionListExpressionPairList :: Scope}
data Syn_CaseExpressionListExpressionPairList  = Syn_CaseExpressionListExpressionPairList {annotatedTree_Syn_CaseExpressionListExpressionPairList :: CaseExpressionListExpressionPairList}
wrap_CaseExpressionListExpressionPairList :: T_CaseExpressionListExpressionPairList  ->
                                             Inh_CaseExpressionListExpressionPairList  ->
                                             Syn_CaseExpressionListExpressionPairList 
wrap_CaseExpressionListExpressionPairList sem (Inh_CaseExpressionListExpressionPairList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_CaseExpressionListExpressionPairList _lhsOannotatedTree ))
sem_CaseExpressionListExpressionPairList_Cons :: T_CaseExpressionListExpressionPair  ->
                                                 T_CaseExpressionListExpressionPairList  ->
                                                 T_CaseExpressionListExpressionPairList 
sem_CaseExpressionListExpressionPairList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CaseExpressionListExpressionPairList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: CaseExpressionListExpressionPair
              _tlIannotatedTree :: CaseExpressionListExpressionPairList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_CaseExpressionListExpressionPairList_Nil :: T_CaseExpressionListExpressionPairList 
sem_CaseExpressionListExpressionPairList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CaseExpressionListExpressionPairList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- CombineType -------------------------------------------------
data CombineType  = Except 
                  | Intersect 
                  | Union 
                  | UnionAll 
                  deriving ( Eq,Show)
-- cata
sem_CombineType :: CombineType  ->
                   T_CombineType 
sem_CombineType (Except )  =
    (sem_CombineType_Except )
sem_CombineType (Intersect )  =
    (sem_CombineType_Intersect )
sem_CombineType (Union )  =
    (sem_CombineType_Union )
sem_CombineType (UnionAll )  =
    (sem_CombineType_UnionAll )
-- semantic domain
type T_CombineType  = Scope ->
                      ( CombineType)
data Inh_CombineType  = Inh_CombineType {scope_Inh_CombineType :: Scope}
data Syn_CombineType  = Syn_CombineType {annotatedTree_Syn_CombineType :: CombineType}
wrap_CombineType :: T_CombineType  ->
                    Inh_CombineType  ->
                    Syn_CombineType 
wrap_CombineType sem (Inh_CombineType _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_CombineType _lhsOannotatedTree ))
sem_CombineType_Except :: T_CombineType 
sem_CombineType_Except  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CombineType
              _annotatedTree =
                  Except
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_CombineType_Intersect :: T_CombineType 
sem_CombineType_Intersect  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CombineType
              _annotatedTree =
                  Intersect
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_CombineType_Union :: T_CombineType 
sem_CombineType_Union  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CombineType
              _annotatedTree =
                  Union
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_CombineType_UnionAll :: T_CombineType 
sem_CombineType_UnionAll  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CombineType
              _annotatedTree =
                  UnionAll
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Constraint --------------------------------------------------
data Constraint  = CheckConstraint (Expression) 
                 | PrimaryKeyConstraint (StringList) 
                 | ReferenceConstraint (StringList) (String) (StringList) (Cascade) (Cascade) 
                 | UniqueConstraint (StringList) 
                 deriving ( Eq,Show)
-- cata
sem_Constraint :: Constraint  ->
                  T_Constraint 
sem_Constraint (CheckConstraint _expression )  =
    (sem_Constraint_CheckConstraint (sem_Expression _expression ) )
sem_Constraint (PrimaryKeyConstraint _stringList )  =
    (sem_Constraint_PrimaryKeyConstraint (sem_StringList _stringList ) )
sem_Constraint (ReferenceConstraint _atts _table _tableAtts _onUpdate _onDelete )  =
    (sem_Constraint_ReferenceConstraint (sem_StringList _atts ) _table (sem_StringList _tableAtts ) (sem_Cascade _onUpdate ) (sem_Cascade _onDelete ) )
sem_Constraint (UniqueConstraint _stringList )  =
    (sem_Constraint_UniqueConstraint (sem_StringList _stringList ) )
-- semantic domain
type T_Constraint  = Scope ->
                     ( Constraint)
data Inh_Constraint  = Inh_Constraint {scope_Inh_Constraint :: Scope}
data Syn_Constraint  = Syn_Constraint {annotatedTree_Syn_Constraint :: Constraint}
wrap_Constraint :: T_Constraint  ->
                   Inh_Constraint  ->
                   Syn_Constraint 
wrap_Constraint sem (Inh_Constraint _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Constraint _lhsOannotatedTree ))
sem_Constraint_CheckConstraint :: T_Expression  ->
                                  T_Constraint 
sem_Constraint_CheckConstraint expression_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Constraint
              _expressionOscope :: Scope
              _expressionIannotatedTree :: Expression
              _expressionIliftedColumnName :: String
              _annotatedTree =
                  CheckConstraint _expressionIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _expressionOscope =
                  _lhsIscope
              ( _expressionIannotatedTree,_expressionIliftedColumnName) =
                  (expression_ _expressionOscope )
          in  ( _lhsOannotatedTree)))
sem_Constraint_PrimaryKeyConstraint :: T_StringList  ->
                                       T_Constraint 
sem_Constraint_PrimaryKeyConstraint stringList_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Constraint
              _stringListOscope :: Scope
              _stringListIannotatedTree :: StringList
              _stringListIstrings :: ([String])
              _annotatedTree =
                  PrimaryKeyConstraint _stringListIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _stringListOscope =
                  _lhsIscope
              ( _stringListIannotatedTree,_stringListIstrings) =
                  (stringList_ _stringListOscope )
          in  ( _lhsOannotatedTree)))
sem_Constraint_ReferenceConstraint :: T_StringList  ->
                                      String ->
                                      T_StringList  ->
                                      T_Cascade  ->
                                      T_Cascade  ->
                                      T_Constraint 
sem_Constraint_ReferenceConstraint atts_ table_ tableAtts_ onUpdate_ onDelete_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Constraint
              _attsOscope :: Scope
              _tableAttsOscope :: Scope
              _onUpdateOscope :: Scope
              _onDeleteOscope :: Scope
              _attsIannotatedTree :: StringList
              _attsIstrings :: ([String])
              _tableAttsIannotatedTree :: StringList
              _tableAttsIstrings :: ([String])
              _onUpdateIannotatedTree :: Cascade
              _onDeleteIannotatedTree :: Cascade
              _annotatedTree =
                  ReferenceConstraint _attsIannotatedTree table_ _tableAttsIannotatedTree _onUpdateIannotatedTree _onDeleteIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _attsOscope =
                  _lhsIscope
              _tableAttsOscope =
                  _lhsIscope
              _onUpdateOscope =
                  _lhsIscope
              _onDeleteOscope =
                  _lhsIscope
              ( _attsIannotatedTree,_attsIstrings) =
                  (atts_ _attsOscope )
              ( _tableAttsIannotatedTree,_tableAttsIstrings) =
                  (tableAtts_ _tableAttsOscope )
              ( _onUpdateIannotatedTree) =
                  (onUpdate_ _onUpdateOscope )
              ( _onDeleteIannotatedTree) =
                  (onDelete_ _onDeleteOscope )
          in  ( _lhsOannotatedTree)))
sem_Constraint_UniqueConstraint :: T_StringList  ->
                                   T_Constraint 
sem_Constraint_UniqueConstraint stringList_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Constraint
              _stringListOscope :: Scope
              _stringListIannotatedTree :: StringList
              _stringListIstrings :: ([String])
              _annotatedTree =
                  UniqueConstraint _stringListIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _stringListOscope =
                  _lhsIscope
              ( _stringListIannotatedTree,_stringListIstrings) =
                  (stringList_ _stringListOscope )
          in  ( _lhsOannotatedTree)))
-- ConstraintList ----------------------------------------------
type ConstraintList  = [(Constraint)]
-- cata
sem_ConstraintList :: ConstraintList  ->
                      T_ConstraintList 
sem_ConstraintList list  =
    (Prelude.foldr sem_ConstraintList_Cons sem_ConstraintList_Nil (Prelude.map sem_Constraint list) )
-- semantic domain
type T_ConstraintList  = Scope ->
                         ( ConstraintList)
data Inh_ConstraintList  = Inh_ConstraintList {scope_Inh_ConstraintList :: Scope}
data Syn_ConstraintList  = Syn_ConstraintList {annotatedTree_Syn_ConstraintList :: ConstraintList}
wrap_ConstraintList :: T_ConstraintList  ->
                       Inh_ConstraintList  ->
                       Syn_ConstraintList 
wrap_ConstraintList sem (Inh_ConstraintList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_ConstraintList _lhsOannotatedTree ))
sem_ConstraintList_Cons :: T_Constraint  ->
                           T_ConstraintList  ->
                           T_ConstraintList 
sem_ConstraintList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ConstraintList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: Constraint
              _tlIannotatedTree :: ConstraintList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_ConstraintList_Nil :: T_ConstraintList 
sem_ConstraintList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ConstraintList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- CopySource --------------------------------------------------
data CopySource  = CopyFilename (String) 
                 | Stdin 
                 deriving ( Eq,Show)
-- cata
sem_CopySource :: CopySource  ->
                  T_CopySource 
sem_CopySource (CopyFilename _string )  =
    (sem_CopySource_CopyFilename _string )
sem_CopySource (Stdin )  =
    (sem_CopySource_Stdin )
-- semantic domain
type T_CopySource  = Scope ->
                     ( CopySource)
data Inh_CopySource  = Inh_CopySource {scope_Inh_CopySource :: Scope}
data Syn_CopySource  = Syn_CopySource {annotatedTree_Syn_CopySource :: CopySource}
wrap_CopySource :: T_CopySource  ->
                   Inh_CopySource  ->
                   Syn_CopySource 
wrap_CopySource sem (Inh_CopySource _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_CopySource _lhsOannotatedTree ))
sem_CopySource_CopyFilename :: String ->
                               T_CopySource 
sem_CopySource_CopyFilename string_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CopySource
              _annotatedTree =
                  CopyFilename string_
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_CopySource_Stdin :: T_CopySource 
sem_CopySource_Stdin  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: CopySource
              _annotatedTree =
                  Stdin
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Direction ---------------------------------------------------
data Direction  = Asc 
                | Desc 
                deriving ( Eq,Show)
-- cata
sem_Direction :: Direction  ->
                 T_Direction 
sem_Direction (Asc )  =
    (sem_Direction_Asc )
sem_Direction (Desc )  =
    (sem_Direction_Desc )
-- semantic domain
type T_Direction  = Scope ->
                    ( Direction)
data Inh_Direction  = Inh_Direction {scope_Inh_Direction :: Scope}
data Syn_Direction  = Syn_Direction {annotatedTree_Syn_Direction :: Direction}
wrap_Direction :: T_Direction  ->
                  Inh_Direction  ->
                  Syn_Direction 
wrap_Direction sem (Inh_Direction _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Direction _lhsOannotatedTree ))
sem_Direction_Asc :: T_Direction 
sem_Direction_Asc  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Direction
              _annotatedTree =
                  Asc
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Direction_Desc :: T_Direction 
sem_Direction_Desc  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Direction
              _annotatedTree =
                  Desc
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Distinct ----------------------------------------------------
data Distinct  = Distinct 
               | Dupes 
               deriving ( Eq,Show)
-- cata
sem_Distinct :: Distinct  ->
                T_Distinct 
sem_Distinct (Distinct )  =
    (sem_Distinct_Distinct )
sem_Distinct (Dupes )  =
    (sem_Distinct_Dupes )
-- semantic domain
type T_Distinct  = Scope ->
                   ( Distinct)
data Inh_Distinct  = Inh_Distinct {scope_Inh_Distinct :: Scope}
data Syn_Distinct  = Syn_Distinct {annotatedTree_Syn_Distinct :: Distinct}
wrap_Distinct :: T_Distinct  ->
                 Inh_Distinct  ->
                 Syn_Distinct 
wrap_Distinct sem (Inh_Distinct _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Distinct _lhsOannotatedTree ))
sem_Distinct_Distinct :: T_Distinct 
sem_Distinct_Distinct  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Distinct
              _annotatedTree =
                  Distinct
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Distinct_Dupes :: T_Distinct 
sem_Distinct_Dupes  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Distinct
              _annotatedTree =
                  Dupes
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- DropType ----------------------------------------------------
data DropType  = Domain 
               | Table 
               | Type 
               | View 
               deriving ( Eq,Show)
-- cata
sem_DropType :: DropType  ->
                T_DropType 
sem_DropType (Domain )  =
    (sem_DropType_Domain )
sem_DropType (Table )  =
    (sem_DropType_Table )
sem_DropType (Type )  =
    (sem_DropType_Type )
sem_DropType (View )  =
    (sem_DropType_View )
-- semantic domain
type T_DropType  = Scope ->
                   ( DropType)
data Inh_DropType  = Inh_DropType {scope_Inh_DropType :: Scope}
data Syn_DropType  = Syn_DropType {annotatedTree_Syn_DropType :: DropType}
wrap_DropType :: T_DropType  ->
                 Inh_DropType  ->
                 Syn_DropType 
wrap_DropType sem (Inh_DropType _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_DropType _lhsOannotatedTree ))
sem_DropType_Domain :: T_DropType 
sem_DropType_Domain  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: DropType
              _annotatedTree =
                  Domain
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_DropType_Table :: T_DropType 
sem_DropType_Table  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: DropType
              _annotatedTree =
                  Table
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_DropType_Type :: T_DropType 
sem_DropType_Type  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: DropType
              _annotatedTree =
                  Type
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_DropType_View :: T_DropType 
sem_DropType_View  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: DropType
              _annotatedTree =
                  View
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Expression --------------------------------------------------
data Expression  = BooleanLit (Annotation) (Bool) 
                 | Case (Annotation) (CaseExpressionListExpressionPairList) (MaybeExpression) 
                 | CaseSimple (Annotation) (Expression) (CaseExpressionListExpressionPairList) (MaybeExpression) 
                 | Cast (Annotation) (Expression) (TypeName) 
                 | Exists (Annotation) (SelectExpression) 
                 | FloatLit (Annotation) (Double) 
                 | FunCall (Annotation) (String) (ExpressionList) 
                 | Identifier (Annotation) (String) 
                 | InPredicate (Annotation) (Expression) (Bool) (InList) 
                 | IntegerLit (Annotation) (Integer) 
                 | NullLit (Annotation) 
                 | PositionalArg (Annotation) (Integer) 
                 | ScalarSubQuery (Annotation) (SelectExpression) 
                 | StringLit (Annotation) (String) (String) 
                 | WindowFn (Annotation) (Expression) (ExpressionList) (ExpressionList) (Direction) 
                 deriving ( Eq,Show)
-- cata
sem_Expression :: Expression  ->
                  T_Expression 
sem_Expression (BooleanLit _ann _b )  =
    (sem_Expression_BooleanLit _ann _b )
sem_Expression (Case _ann _cases _els )  =
    (sem_Expression_Case _ann (sem_CaseExpressionListExpressionPairList _cases ) (sem_MaybeExpression _els ) )
sem_Expression (CaseSimple _ann _value _cases _els )  =
    (sem_Expression_CaseSimple _ann (sem_Expression _value ) (sem_CaseExpressionListExpressionPairList _cases ) (sem_MaybeExpression _els ) )
sem_Expression (Cast _ann _expr _tn )  =
    (sem_Expression_Cast _ann (sem_Expression _expr ) (sem_TypeName _tn ) )
sem_Expression (Exists _ann _sel )  =
    (sem_Expression_Exists _ann (sem_SelectExpression _sel ) )
sem_Expression (FloatLit _ann _d )  =
    (sem_Expression_FloatLit _ann _d )
sem_Expression (FunCall _ann _funName _args )  =
    (sem_Expression_FunCall _ann _funName (sem_ExpressionList _args ) )
sem_Expression (Identifier _ann _i )  =
    (sem_Expression_Identifier _ann _i )
sem_Expression (InPredicate _ann _expr _i _list )  =
    (sem_Expression_InPredicate _ann (sem_Expression _expr ) _i (sem_InList _list ) )
sem_Expression (IntegerLit _ann _i )  =
    (sem_Expression_IntegerLit _ann _i )
sem_Expression (NullLit _ann )  =
    (sem_Expression_NullLit _ann )
sem_Expression (PositionalArg _ann _p )  =
    (sem_Expression_PositionalArg _ann _p )
sem_Expression (ScalarSubQuery _ann _sel )  =
    (sem_Expression_ScalarSubQuery _ann (sem_SelectExpression _sel ) )
sem_Expression (StringLit _ann _quote _value )  =
    (sem_Expression_StringLit _ann _quote _value )
sem_Expression (WindowFn _ann _fn _partitionBy _orderBy _dir )  =
    (sem_Expression_WindowFn _ann (sem_Expression _fn ) (sem_ExpressionList _partitionBy ) (sem_ExpressionList _orderBy ) (sem_Direction _dir ) )
-- semantic domain
type T_Expression  = Scope ->
                     ( Expression,String)
data Inh_Expression  = Inh_Expression {scope_Inh_Expression :: Scope}
data Syn_Expression  = Syn_Expression {annotatedTree_Syn_Expression :: Expression,liftedColumnName_Syn_Expression :: String}
wrap_Expression :: T_Expression  ->
                   Inh_Expression  ->
                   Syn_Expression 
wrap_Expression sem (Inh_Expression _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOliftedColumnName) =
             (sem _lhsIscope )
     in  (Syn_Expression _lhsOannotatedTree _lhsOliftedColumnName ))
sem_Expression_BooleanLit :: Annotation ->
                             Bool ->
                             T_Expression 
sem_Expression_BooleanLit ann_ b_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _backTree =
                  BooleanLit ann_ b_
              _tpe =
                  Right typeBool
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  BooleanLit ann_ b_
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_Case :: Annotation ->
                       T_CaseExpressionListExpressionPairList  ->
                       T_MaybeExpression  ->
                       T_Expression 
sem_Expression_Case ann_ cases_ els_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _casesOscope :: Scope
              _elsOscope :: Scope
              _casesIannotatedTree :: CaseExpressionListExpressionPairList
              _elsIannotatedTree :: MaybeExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _whenTypes =
                  map getTypeAnnotation $ concatMap fst $
                  _casesIannotatedTree
              _thenTypes =
                  map getTypeAnnotation $
                      (map snd $ _casesIannotatedTree) ++
                        maybeToList _elsIannotatedTree
              _tpe =
                  checkTypes _whenTypes     $ do
                     when (any (/= typeBool) _whenTypes    ) $
                       Left [WrongTypes typeBool _whenTypes    ]
                     checkTypes _thenTypes     $
                              resolveResultSetType
                                _lhsIscope
                                _thenTypes
              _backTree =
                  Case ann_ _casesIannotatedTree _elsIannotatedTree
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  Case ann_ _casesIannotatedTree _elsIannotatedTree
              _casesOscope =
                  _lhsIscope
              _elsOscope =
                  _lhsIscope
              ( _casesIannotatedTree) =
                  (cases_ _casesOscope )
              ( _elsIannotatedTree) =
                  (els_ _elsOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_CaseSimple :: Annotation ->
                             T_Expression  ->
                             T_CaseExpressionListExpressionPairList  ->
                             T_MaybeExpression  ->
                             T_Expression 
sem_Expression_CaseSimple ann_ value_ cases_ els_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _valueOscope :: Scope
              _casesOscope :: Scope
              _elsOscope :: Scope
              _valueIannotatedTree :: Expression
              _valueIliftedColumnName :: String
              _casesIannotatedTree :: CaseExpressionListExpressionPairList
              _elsIannotatedTree :: MaybeExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _whenTypes =
                  map getTypeAnnotation $ concatMap fst $
                  _casesIannotatedTree
              _thenTypes =
                  map getTypeAnnotation $
                      (map snd $ _casesIannotatedTree) ++
                        maybeToList _elsIannotatedTree
              _tpe =
                  checkTypes _whenTypes     $ do
                  checkWhenTypes <- resolveResultSetType
                                         _lhsIscope
                                         (getTypeAnnotation _valueIannotatedTree: _whenTypes    )
                  checkTypes _thenTypes     $
                             resolveResultSetType
                                      _lhsIscope
                                      _thenTypes
              _backTree =
                  CaseSimple ann_ _valueIannotatedTree _casesIannotatedTree _elsIannotatedTree
              _lhsOliftedColumnName =
                  _valueIliftedColumnName
              _annotatedTree =
                  CaseSimple ann_ _valueIannotatedTree _casesIannotatedTree _elsIannotatedTree
              _valueOscope =
                  _lhsIscope
              _casesOscope =
                  _lhsIscope
              _elsOscope =
                  _lhsIscope
              ( _valueIannotatedTree,_valueIliftedColumnName) =
                  (value_ _valueOscope )
              ( _casesIannotatedTree) =
                  (cases_ _casesOscope )
              ( _elsIannotatedTree) =
                  (els_ _elsOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_Cast :: Annotation ->
                       T_Expression  ->
                       T_TypeName  ->
                       T_Expression 
sem_Expression_Cast ann_ expr_ tn_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _exprOscope :: Scope
              _tnOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _tnIannotatedTree :: TypeName
              _tnInamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  _tnInamedType
              _backTree =
                  Cast ann_ _exprIannotatedTree _tnIannotatedTree
              _lhsOliftedColumnName =
                  case _tnIannotatedTree of
                    SimpleTypeName tn -> tn
                    _ -> ""
              _annotatedTree =
                  Cast ann_ _exprIannotatedTree _tnIannotatedTree
              _exprOscope =
                  _lhsIscope
              _tnOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
              ( _tnIannotatedTree,_tnInamedType) =
                  (tn_ _tnOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_Exists :: Annotation ->
                         T_SelectExpression  ->
                         T_Expression 
sem_Expression_Exists ann_ sel_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _selOscope :: Scope
              _selIannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  Right typeBool
              _backTree =
                  Exists ann_ _selIannotatedTree
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  Exists ann_ _selIannotatedTree
              _selOscope =
                  _lhsIscope
              ( _selIannotatedTree) =
                  (sel_ _selOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_FloatLit :: Annotation ->
                           Double ->
                           T_Expression 
sem_Expression_FloatLit ann_ d_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _backTree =
                  FloatLit ann_ d_
              _tpe =
                  Right typeNumeric
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  FloatLit ann_ d_
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_FunCall :: Annotation ->
                          String ->
                          T_ExpressionList  ->
                          T_Expression 
sem_Expression_FunCall ann_ funName_ args_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _argsOscope :: Scope
              _argsIannotatedTree :: ExpressionList
              _argsItypeList :: ([Type])
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  checkTypes _argsItypeList $
                    typeCheckFunCall
                      _lhsIscope
                      funName_
                      _argsItypeList
              _backTree =
                  FunCall ann_ funName_ _argsIannotatedTree
              _lhsOliftedColumnName =
                  if isOperator funName_
                     then ""
                     else funName_
              _annotatedTree =
                  FunCall ann_ funName_ _argsIannotatedTree
              _argsOscope =
                  _lhsIscope
              ( _argsIannotatedTree,_argsItypeList) =
                  (args_ _argsOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_Identifier :: Annotation ->
                             String ->
                             T_Expression 
sem_Expression_Identifier ann_ i_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  let (correlationName,iden) = splitIdentifier i_
                  in scopeLookupID _lhsIscope correlationName iden
              _backTree =
                  Identifier ann_ i_
              _lhsOliftedColumnName =
                  i_
              _annotatedTree =
                  Identifier ann_ i_
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_InPredicate :: Annotation ->
                              T_Expression  ->
                              Bool ->
                              T_InList  ->
                              T_Expression 
sem_Expression_InPredicate ann_ expr_ i_ list_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _exprOscope :: Scope
              _listOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _listIannotatedTree :: InList
              _listIlistType :: (Either [TypeError] Type)
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  do
                    lt <- _listIlistType
                    ty <- resolveResultSetType
                            _lhsIscope
                            [getTypeAnnotation _exprIannotatedTree, lt]
                    return typeBool
              _backTree =
                  InPredicate ann_ _exprIannotatedTree i_ _listIannotatedTree
              _lhsOliftedColumnName =
                  _exprIliftedColumnName
              _annotatedTree =
                  InPredicate ann_ _exprIannotatedTree i_ _listIannotatedTree
              _exprOscope =
                  _lhsIscope
              _listOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
              ( _listIannotatedTree,_listIlistType) =
                  (list_ _listOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_IntegerLit :: Annotation ->
                             Integer ->
                             T_Expression 
sem_Expression_IntegerLit ann_ i_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _backTree =
                  IntegerLit ann_ i_
              _tpe =
                  Right typeInt
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  IntegerLit ann_ i_
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_NullLit :: Annotation ->
                          T_Expression 
sem_Expression_NullLit ann_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _backTree =
                  NullLit ann_
              _tpe =
                  Right UnknownStringLit
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  NullLit ann_
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_PositionalArg :: Annotation ->
                                Integer ->
                                T_Expression 
sem_Expression_PositionalArg ann_ p_  =
    (\ _lhsIscope ->
         (let _lhsOliftedColumnName :: String
              _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  PositionalArg ann_ p_
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_ScalarSubQuery :: Annotation ->
                                 T_SelectExpression  ->
                                 T_Expression 
sem_Expression_ScalarSubQuery ann_ sel_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _selOscope :: Scope
              _selIannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  let selType = getTypeAnnotation _selIannotatedTree
                  in checkTypes [selType]
                       $ let f = map snd $ unwrapComposite $ unwrapSetOf selType
                         in case length f of
                              0 -> error "internal error: no columns in scalar subquery?"
                              1 -> Right $ head f
                              _ -> Right $ RowCtor f
              _backTree =
                  ScalarSubQuery ann_ _selIannotatedTree
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  ScalarSubQuery ann_ _selIannotatedTree
              _selOscope =
                  _lhsIscope
              ( _selIannotatedTree) =
                  (sel_ _selOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_StringLit :: Annotation ->
                            String ->
                            String ->
                            T_Expression 
sem_Expression_StringLit ann_ quote_ value_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Expression
              _lhsOliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _backTree =
                  StringLit ann_ quote_ value_
              _tpe =
                  Right UnknownStringLit
              _lhsOliftedColumnName =
                  ""
              _annotatedTree =
                  StringLit ann_ quote_ value_
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
sem_Expression_WindowFn :: Annotation ->
                           T_Expression  ->
                           T_ExpressionList  ->
                           T_ExpressionList  ->
                           T_Direction  ->
                           T_Expression 
sem_Expression_WindowFn ann_ fn_ partitionBy_ orderBy_ dir_  =
    (\ _lhsIscope ->
         (let _lhsOliftedColumnName :: String
              _lhsOannotatedTree :: Expression
              _fnOscope :: Scope
              _partitionByOscope :: Scope
              _orderByOscope :: Scope
              _dirOscope :: Scope
              _fnIannotatedTree :: Expression
              _fnIliftedColumnName :: String
              _partitionByIannotatedTree :: ExpressionList
              _partitionByItypeList :: ([Type])
              _orderByIannotatedTree :: ExpressionList
              _orderByItypeList :: ([Type])
              _dirIannotatedTree :: Direction
              _lhsOliftedColumnName =
                  _fnIliftedColumnName
              _annotatedTree =
                  WindowFn ann_ _fnIannotatedTree _partitionByIannotatedTree _orderByIannotatedTree _dirIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _fnOscope =
                  _lhsIscope
              _partitionByOscope =
                  _lhsIscope
              _orderByOscope =
                  _lhsIscope
              _dirOscope =
                  _lhsIscope
              ( _fnIannotatedTree,_fnIliftedColumnName) =
                  (fn_ _fnOscope )
              ( _partitionByIannotatedTree,_partitionByItypeList) =
                  (partitionBy_ _partitionByOscope )
              ( _orderByIannotatedTree,_orderByItypeList) =
                  (orderBy_ _orderByOscope )
              ( _dirIannotatedTree) =
                  (dir_ _dirOscope )
          in  ( _lhsOannotatedTree,_lhsOliftedColumnName)))
-- ExpressionList ----------------------------------------------
type ExpressionList  = [(Expression)]
-- cata
sem_ExpressionList :: ExpressionList  ->
                      T_ExpressionList 
sem_ExpressionList list  =
    (Prelude.foldr sem_ExpressionList_Cons sem_ExpressionList_Nil (Prelude.map sem_Expression list) )
-- semantic domain
type T_ExpressionList  = Scope ->
                         ( ExpressionList,([Type]))
data Inh_ExpressionList  = Inh_ExpressionList {scope_Inh_ExpressionList :: Scope}
data Syn_ExpressionList  = Syn_ExpressionList {annotatedTree_Syn_ExpressionList :: ExpressionList,typeList_Syn_ExpressionList :: [Type]}
wrap_ExpressionList :: T_ExpressionList  ->
                       Inh_ExpressionList  ->
                       Syn_ExpressionList 
wrap_ExpressionList sem (Inh_ExpressionList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOtypeList) =
             (sem _lhsIscope )
     in  (Syn_ExpressionList _lhsOannotatedTree _lhsOtypeList ))
sem_ExpressionList_Cons :: T_Expression  ->
                           T_ExpressionList  ->
                           T_ExpressionList 
sem_ExpressionList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOtypeList :: ([Type])
              _lhsOannotatedTree :: ExpressionList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: Expression
              _hdIliftedColumnName :: String
              _tlIannotatedTree :: ExpressionList
              _tlItypeList :: ([Type])
              _lhsOtypeList =
                  getTypeAnnotation _hdIannotatedTree : _tlItypeList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdIliftedColumnName) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlItypeList) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOtypeList)))
sem_ExpressionList_Nil :: T_ExpressionList 
sem_ExpressionList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOtypeList :: ([Type])
              _lhsOannotatedTree :: ExpressionList
              _lhsOtypeList =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOtypeList)))
-- ExpressionListList ------------------------------------------
type ExpressionListList  = [(ExpressionList)]
-- cata
sem_ExpressionListList :: ExpressionListList  ->
                          T_ExpressionListList 
sem_ExpressionListList list  =
    (Prelude.foldr sem_ExpressionListList_Cons sem_ExpressionListList_Nil (Prelude.map sem_ExpressionList list) )
-- semantic domain
type T_ExpressionListList  = Scope ->
                             ( ExpressionListList,([[Type]]))
data Inh_ExpressionListList  = Inh_ExpressionListList {scope_Inh_ExpressionListList :: Scope}
data Syn_ExpressionListList  = Syn_ExpressionListList {annotatedTree_Syn_ExpressionListList :: ExpressionListList,typeListList_Syn_ExpressionListList :: [[Type]]}
wrap_ExpressionListList :: T_ExpressionListList  ->
                           Inh_ExpressionListList  ->
                           Syn_ExpressionListList 
wrap_ExpressionListList sem (Inh_ExpressionListList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOtypeListList) =
             (sem _lhsIscope )
     in  (Syn_ExpressionListList _lhsOannotatedTree _lhsOtypeListList ))
sem_ExpressionListList_Cons :: T_ExpressionList  ->
                               T_ExpressionListList  ->
                               T_ExpressionListList 
sem_ExpressionListList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOtypeListList :: ([[Type]])
              _lhsOannotatedTree :: ExpressionListList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: ExpressionList
              _hdItypeList :: ([Type])
              _tlIannotatedTree :: ExpressionListList
              _tlItypeListList :: ([[Type]])
              _lhsOtypeListList =
                  _hdItypeList : _tlItypeListList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdItypeList) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlItypeListList) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOtypeListList)))
sem_ExpressionListList_Nil :: T_ExpressionListList 
sem_ExpressionListList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOtypeListList :: ([[Type]])
              _lhsOannotatedTree :: ExpressionListList
              _lhsOtypeListList =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOtypeListList)))
-- ExpressionListStatementListPair -----------------------------
type ExpressionListStatementListPair  = ( (ExpressionList),(StatementList))
-- cata
sem_ExpressionListStatementListPair :: ExpressionListStatementListPair  ->
                                       T_ExpressionListStatementListPair 
sem_ExpressionListStatementListPair ( x1,x2)  =
    (sem_ExpressionListStatementListPair_Tuple (sem_ExpressionList x1 ) (sem_StatementList x2 ) )
-- semantic domain
type T_ExpressionListStatementListPair  = Scope ->
                                          ( ExpressionListStatementListPair)
data Inh_ExpressionListStatementListPair  = Inh_ExpressionListStatementListPair {scope_Inh_ExpressionListStatementListPair :: Scope}
data Syn_ExpressionListStatementListPair  = Syn_ExpressionListStatementListPair {annotatedTree_Syn_ExpressionListStatementListPair :: ExpressionListStatementListPair}
wrap_ExpressionListStatementListPair :: T_ExpressionListStatementListPair  ->
                                        Inh_ExpressionListStatementListPair  ->
                                        Syn_ExpressionListStatementListPair 
wrap_ExpressionListStatementListPair sem (Inh_ExpressionListStatementListPair _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_ExpressionListStatementListPair _lhsOannotatedTree ))
sem_ExpressionListStatementListPair_Tuple :: T_ExpressionList  ->
                                             T_StatementList  ->
                                             T_ExpressionListStatementListPair 
sem_ExpressionListStatementListPair_Tuple x1_ x2_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionListStatementListPair
              _x1Oscope :: Scope
              _x2Oscope :: Scope
              _x1IannotatedTree :: ExpressionList
              _x1ItypeList :: ([Type])
              _x2IannotatedTree :: StatementList
              _annotatedTree =
                  (_x1IannotatedTree,_x2IannotatedTree)
              _lhsOannotatedTree =
                  _annotatedTree
              _x1Oscope =
                  _lhsIscope
              _x2Oscope =
                  _lhsIscope
              ( _x1IannotatedTree,_x1ItypeList) =
                  (x1_ _x1Oscope )
              ( _x2IannotatedTree) =
                  (x2_ _x2Oscope )
          in  ( _lhsOannotatedTree)))
-- ExpressionListStatementListPairList -------------------------
type ExpressionListStatementListPairList  = [(ExpressionListStatementListPair)]
-- cata
sem_ExpressionListStatementListPairList :: ExpressionListStatementListPairList  ->
                                           T_ExpressionListStatementListPairList 
sem_ExpressionListStatementListPairList list  =
    (Prelude.foldr sem_ExpressionListStatementListPairList_Cons sem_ExpressionListStatementListPairList_Nil (Prelude.map sem_ExpressionListStatementListPair list) )
-- semantic domain
type T_ExpressionListStatementListPairList  = Scope ->
                                              ( ExpressionListStatementListPairList)
data Inh_ExpressionListStatementListPairList  = Inh_ExpressionListStatementListPairList {scope_Inh_ExpressionListStatementListPairList :: Scope}
data Syn_ExpressionListStatementListPairList  = Syn_ExpressionListStatementListPairList {annotatedTree_Syn_ExpressionListStatementListPairList :: ExpressionListStatementListPairList}
wrap_ExpressionListStatementListPairList :: T_ExpressionListStatementListPairList  ->
                                            Inh_ExpressionListStatementListPairList  ->
                                            Syn_ExpressionListStatementListPairList 
wrap_ExpressionListStatementListPairList sem (Inh_ExpressionListStatementListPairList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_ExpressionListStatementListPairList _lhsOannotatedTree ))
sem_ExpressionListStatementListPairList_Cons :: T_ExpressionListStatementListPair  ->
                                                T_ExpressionListStatementListPairList  ->
                                                T_ExpressionListStatementListPairList 
sem_ExpressionListStatementListPairList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionListStatementListPairList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: ExpressionListStatementListPair
              _tlIannotatedTree :: ExpressionListStatementListPairList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_ExpressionListStatementListPairList_Nil :: T_ExpressionListStatementListPairList 
sem_ExpressionListStatementListPairList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionListStatementListPairList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- ExpressionRoot ----------------------------------------------
data ExpressionRoot  = ExpressionRoot (Expression) 
                     deriving ( Show)
-- cata
sem_ExpressionRoot :: ExpressionRoot  ->
                      T_ExpressionRoot 
sem_ExpressionRoot (ExpressionRoot _expr )  =
    (sem_ExpressionRoot_ExpressionRoot (sem_Expression _expr ) )
-- semantic domain
type T_ExpressionRoot  = Scope ->
                         ( ExpressionRoot)
data Inh_ExpressionRoot  = Inh_ExpressionRoot {scope_Inh_ExpressionRoot :: Scope}
data Syn_ExpressionRoot  = Syn_ExpressionRoot {annotatedTree_Syn_ExpressionRoot :: ExpressionRoot}
wrap_ExpressionRoot :: T_ExpressionRoot  ->
                       Inh_ExpressionRoot  ->
                       Syn_ExpressionRoot 
wrap_ExpressionRoot sem (Inh_ExpressionRoot _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_ExpressionRoot _lhsOannotatedTree ))
sem_ExpressionRoot_ExpressionRoot :: T_Expression  ->
                                     T_ExpressionRoot 
sem_ExpressionRoot_ExpressionRoot expr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionRoot
              _exprOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _annotatedTree =
                  ExpressionRoot _exprIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
          in  ( _lhsOannotatedTree)))
-- ExpressionStatementListPair ---------------------------------
type ExpressionStatementListPair  = ( (Expression),(StatementList))
-- cata
sem_ExpressionStatementListPair :: ExpressionStatementListPair  ->
                                   T_ExpressionStatementListPair 
sem_ExpressionStatementListPair ( x1,x2)  =
    (sem_ExpressionStatementListPair_Tuple (sem_Expression x1 ) (sem_StatementList x2 ) )
-- semantic domain
type T_ExpressionStatementListPair  = Scope ->
                                      ( ExpressionStatementListPair)
data Inh_ExpressionStatementListPair  = Inh_ExpressionStatementListPair {scope_Inh_ExpressionStatementListPair :: Scope}
data Syn_ExpressionStatementListPair  = Syn_ExpressionStatementListPair {annotatedTree_Syn_ExpressionStatementListPair :: ExpressionStatementListPair}
wrap_ExpressionStatementListPair :: T_ExpressionStatementListPair  ->
                                    Inh_ExpressionStatementListPair  ->
                                    Syn_ExpressionStatementListPair 
wrap_ExpressionStatementListPair sem (Inh_ExpressionStatementListPair _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_ExpressionStatementListPair _lhsOannotatedTree ))
sem_ExpressionStatementListPair_Tuple :: T_Expression  ->
                                         T_StatementList  ->
                                         T_ExpressionStatementListPair 
sem_ExpressionStatementListPair_Tuple x1_ x2_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionStatementListPair
              _x1Oscope :: Scope
              _x2Oscope :: Scope
              _x1IannotatedTree :: Expression
              _x1IliftedColumnName :: String
              _x2IannotatedTree :: StatementList
              _annotatedTree =
                  (_x1IannotatedTree,_x2IannotatedTree)
              _lhsOannotatedTree =
                  _annotatedTree
              _x1Oscope =
                  _lhsIscope
              _x2Oscope =
                  _lhsIscope
              ( _x1IannotatedTree,_x1IliftedColumnName) =
                  (x1_ _x1Oscope )
              ( _x2IannotatedTree) =
                  (x2_ _x2Oscope )
          in  ( _lhsOannotatedTree)))
-- ExpressionStatementListPairList -----------------------------
type ExpressionStatementListPairList  = [(ExpressionStatementListPair)]
-- cata
sem_ExpressionStatementListPairList :: ExpressionStatementListPairList  ->
                                       T_ExpressionStatementListPairList 
sem_ExpressionStatementListPairList list  =
    (Prelude.foldr sem_ExpressionStatementListPairList_Cons sem_ExpressionStatementListPairList_Nil (Prelude.map sem_ExpressionStatementListPair list) )
-- semantic domain
type T_ExpressionStatementListPairList  = Scope ->
                                          ( ExpressionStatementListPairList)
data Inh_ExpressionStatementListPairList  = Inh_ExpressionStatementListPairList {scope_Inh_ExpressionStatementListPairList :: Scope}
data Syn_ExpressionStatementListPairList  = Syn_ExpressionStatementListPairList {annotatedTree_Syn_ExpressionStatementListPairList :: ExpressionStatementListPairList}
wrap_ExpressionStatementListPairList :: T_ExpressionStatementListPairList  ->
                                        Inh_ExpressionStatementListPairList  ->
                                        Syn_ExpressionStatementListPairList 
wrap_ExpressionStatementListPairList sem (Inh_ExpressionStatementListPairList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_ExpressionStatementListPairList _lhsOannotatedTree ))
sem_ExpressionStatementListPairList_Cons :: T_ExpressionStatementListPair  ->
                                            T_ExpressionStatementListPairList  ->
                                            T_ExpressionStatementListPairList 
sem_ExpressionStatementListPairList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionStatementListPairList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: ExpressionStatementListPair
              _tlIannotatedTree :: ExpressionStatementListPairList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_ExpressionStatementListPairList_Nil :: T_ExpressionStatementListPairList 
sem_ExpressionStatementListPairList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: ExpressionStatementListPairList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- FnBody ------------------------------------------------------
data FnBody  = PlpgsqlFnBody (VarDefList) (StatementList) 
             | SqlFnBody (StatementList) 
             deriving ( Eq,Show)
-- cata
sem_FnBody :: FnBody  ->
              T_FnBody 
sem_FnBody (PlpgsqlFnBody _varDefList _sts )  =
    (sem_FnBody_PlpgsqlFnBody (sem_VarDefList _varDefList ) (sem_StatementList _sts ) )
sem_FnBody (SqlFnBody _sts )  =
    (sem_FnBody_SqlFnBody (sem_StatementList _sts ) )
-- semantic domain
type T_FnBody  = Scope ->
                 ( FnBody)
data Inh_FnBody  = Inh_FnBody {scope_Inh_FnBody :: Scope}
data Syn_FnBody  = Syn_FnBody {annotatedTree_Syn_FnBody :: FnBody}
wrap_FnBody :: T_FnBody  ->
               Inh_FnBody  ->
               Syn_FnBody 
wrap_FnBody sem (Inh_FnBody _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_FnBody _lhsOannotatedTree ))
sem_FnBody_PlpgsqlFnBody :: T_VarDefList  ->
                            T_StatementList  ->
                            T_FnBody 
sem_FnBody_PlpgsqlFnBody varDefList_ sts_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: FnBody
              _varDefListOscope :: Scope
              _stsOscope :: Scope
              _varDefListIannotatedTree :: VarDefList
              _stsIannotatedTree :: StatementList
              _annotatedTree =
                  PlpgsqlFnBody _varDefListIannotatedTree _stsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _varDefListOscope =
                  _lhsIscope
              _stsOscope =
                  _lhsIscope
              ( _varDefListIannotatedTree) =
                  (varDefList_ _varDefListOscope )
              ( _stsIannotatedTree) =
                  (sts_ _stsOscope )
          in  ( _lhsOannotatedTree)))
sem_FnBody_SqlFnBody :: T_StatementList  ->
                        T_FnBody 
sem_FnBody_SqlFnBody sts_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: FnBody
              _stsOscope :: Scope
              _stsIannotatedTree :: StatementList
              _annotatedTree =
                  SqlFnBody _stsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _stsOscope =
                  _lhsIscope
              ( _stsIannotatedTree) =
                  (sts_ _stsOscope )
          in  ( _lhsOannotatedTree)))
-- IfExists ----------------------------------------------------
data IfExists  = IfExists 
               | Require 
               deriving ( Eq,Show)
-- cata
sem_IfExists :: IfExists  ->
                T_IfExists 
sem_IfExists (IfExists )  =
    (sem_IfExists_IfExists )
sem_IfExists (Require )  =
    (sem_IfExists_Require )
-- semantic domain
type T_IfExists  = Scope ->
                   ( IfExists)
data Inh_IfExists  = Inh_IfExists {scope_Inh_IfExists :: Scope}
data Syn_IfExists  = Syn_IfExists {annotatedTree_Syn_IfExists :: IfExists}
wrap_IfExists :: T_IfExists  ->
                 Inh_IfExists  ->
                 Syn_IfExists 
wrap_IfExists sem (Inh_IfExists _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_IfExists _lhsOannotatedTree ))
sem_IfExists_IfExists :: T_IfExists 
sem_IfExists_IfExists  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: IfExists
              _annotatedTree =
                  IfExists
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_IfExists_Require :: T_IfExists 
sem_IfExists_Require  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: IfExists
              _annotatedTree =
                  Require
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- InList ------------------------------------------------------
data InList  = InList (ExpressionList) 
             | InSelect (SelectExpression) 
             deriving ( Eq,Show)
-- cata
sem_InList :: InList  ->
              T_InList 
sem_InList (InList _exprs )  =
    (sem_InList_InList (sem_ExpressionList _exprs ) )
sem_InList (InSelect _sel )  =
    (sem_InList_InSelect (sem_SelectExpression _sel ) )
-- semantic domain
type T_InList  = Scope ->
                 ( InList,(Either [TypeError] Type))
data Inh_InList  = Inh_InList {scope_Inh_InList :: Scope}
data Syn_InList  = Syn_InList {annotatedTree_Syn_InList :: InList,listType_Syn_InList :: Either [TypeError] Type}
wrap_InList :: T_InList  ->
               Inh_InList  ->
               Syn_InList 
wrap_InList sem (Inh_InList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOlistType) =
             (sem _lhsIscope )
     in  (Syn_InList _lhsOannotatedTree _lhsOlistType ))
sem_InList_InList :: T_ExpressionList  ->
                     T_InList 
sem_InList_InList exprs_  =
    (\ _lhsIscope ->
         (let _lhsOlistType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: InList
              _exprsOscope :: Scope
              _exprsIannotatedTree :: ExpressionList
              _exprsItypeList :: ([Type])
              _lhsOlistType =
                  resolveResultSetType
                    _lhsIscope
                    _exprsItypeList
              _annotatedTree =
                  InList _exprsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprsOscope =
                  _lhsIscope
              ( _exprsIannotatedTree,_exprsItypeList) =
                  (exprs_ _exprsOscope )
          in  ( _lhsOannotatedTree,_lhsOlistType)))
sem_InList_InSelect :: T_SelectExpression  ->
                       T_InList 
sem_InList_InSelect sel_  =
    (\ _lhsIscope ->
         (let _lhsOlistType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: InList
              _selOscope :: Scope
              _selIannotatedTree :: SelectExpression
              _lhsOlistType =
                  let attrs = map snd $ unwrapComposite $ unwrapSetOf $ getTypeAnnotation _selIannotatedTree
                      typ =  case length attrs of
                               0 -> error "internal error - got subquery with no columns? in inselect"
                               1 -> head attrs
                               _ -> RowCtor attrs
                  in checkTypes attrs $ Right typ
              _annotatedTree =
                  InSelect _selIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _selOscope =
                  _lhsIscope
              ( _selIannotatedTree) =
                  (sel_ _selOscope )
          in  ( _lhsOannotatedTree,_lhsOlistType)))
-- JoinExpression ----------------------------------------------
data JoinExpression  = JoinOn (Expression) 
                     | JoinUsing (StringList) 
                     deriving ( Eq,Show)
-- cata
sem_JoinExpression :: JoinExpression  ->
                      T_JoinExpression 
sem_JoinExpression (JoinOn _expression )  =
    (sem_JoinExpression_JoinOn (sem_Expression _expression ) )
sem_JoinExpression (JoinUsing _stringList )  =
    (sem_JoinExpression_JoinUsing (sem_StringList _stringList ) )
-- semantic domain
type T_JoinExpression  = Scope ->
                         ( JoinExpression)
data Inh_JoinExpression  = Inh_JoinExpression {scope_Inh_JoinExpression :: Scope}
data Syn_JoinExpression  = Syn_JoinExpression {annotatedTree_Syn_JoinExpression :: JoinExpression}
wrap_JoinExpression :: T_JoinExpression  ->
                       Inh_JoinExpression  ->
                       Syn_JoinExpression 
wrap_JoinExpression sem (Inh_JoinExpression _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_JoinExpression _lhsOannotatedTree ))
sem_JoinExpression_JoinOn :: T_Expression  ->
                             T_JoinExpression 
sem_JoinExpression_JoinOn expression_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinExpression
              _expressionOscope :: Scope
              _expressionIannotatedTree :: Expression
              _expressionIliftedColumnName :: String
              _annotatedTree =
                  JoinOn _expressionIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _expressionOscope =
                  _lhsIscope
              ( _expressionIannotatedTree,_expressionIliftedColumnName) =
                  (expression_ _expressionOscope )
          in  ( _lhsOannotatedTree)))
sem_JoinExpression_JoinUsing :: T_StringList  ->
                                T_JoinExpression 
sem_JoinExpression_JoinUsing stringList_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinExpression
              _stringListOscope :: Scope
              _stringListIannotatedTree :: StringList
              _stringListIstrings :: ([String])
              _annotatedTree =
                  JoinUsing _stringListIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _stringListOscope =
                  _lhsIscope
              ( _stringListIannotatedTree,_stringListIstrings) =
                  (stringList_ _stringListOscope )
          in  ( _lhsOannotatedTree)))
-- JoinType ----------------------------------------------------
data JoinType  = Cross 
               | FullOuter 
               | Inner 
               | LeftOuter 
               | RightOuter 
               deriving ( Eq,Show)
-- cata
sem_JoinType :: JoinType  ->
                T_JoinType 
sem_JoinType (Cross )  =
    (sem_JoinType_Cross )
sem_JoinType (FullOuter )  =
    (sem_JoinType_FullOuter )
sem_JoinType (Inner )  =
    (sem_JoinType_Inner )
sem_JoinType (LeftOuter )  =
    (sem_JoinType_LeftOuter )
sem_JoinType (RightOuter )  =
    (sem_JoinType_RightOuter )
-- semantic domain
type T_JoinType  = Scope ->
                   ( JoinType)
data Inh_JoinType  = Inh_JoinType {scope_Inh_JoinType :: Scope}
data Syn_JoinType  = Syn_JoinType {annotatedTree_Syn_JoinType :: JoinType}
wrap_JoinType :: T_JoinType  ->
                 Inh_JoinType  ->
                 Syn_JoinType 
wrap_JoinType sem (Inh_JoinType _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_JoinType _lhsOannotatedTree ))
sem_JoinType_Cross :: T_JoinType 
sem_JoinType_Cross  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinType
              _annotatedTree =
                  Cross
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_JoinType_FullOuter :: T_JoinType 
sem_JoinType_FullOuter  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinType
              _annotatedTree =
                  FullOuter
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_JoinType_Inner :: T_JoinType 
sem_JoinType_Inner  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinType
              _annotatedTree =
                  Inner
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_JoinType_LeftOuter :: T_JoinType 
sem_JoinType_LeftOuter  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinType
              _annotatedTree =
                  LeftOuter
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_JoinType_RightOuter :: T_JoinType 
sem_JoinType_RightOuter  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: JoinType
              _annotatedTree =
                  RightOuter
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Language ----------------------------------------------------
data Language  = Plpgsql 
               | Sql 
               deriving ( Eq,Show)
-- cata
sem_Language :: Language  ->
                T_Language 
sem_Language (Plpgsql )  =
    (sem_Language_Plpgsql )
sem_Language (Sql )  =
    (sem_Language_Sql )
-- semantic domain
type T_Language  = Scope ->
                   ( Language)
data Inh_Language  = Inh_Language {scope_Inh_Language :: Scope}
data Syn_Language  = Syn_Language {annotatedTree_Syn_Language :: Language}
wrap_Language :: T_Language  ->
                 Inh_Language  ->
                 Syn_Language 
wrap_Language sem (Inh_Language _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Language _lhsOannotatedTree ))
sem_Language_Plpgsql :: T_Language 
sem_Language_Plpgsql  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Language
              _annotatedTree =
                  Plpgsql
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Language_Sql :: T_Language 
sem_Language_Sql  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Language
              _annotatedTree =
                  Sql
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- MExpression -------------------------------------------------
type MExpression  = (Maybe (Expression))
-- cata
sem_MExpression :: MExpression  ->
                   T_MExpression 
sem_MExpression (Prelude.Just x )  =
    (sem_MExpression_Just (sem_Expression x ) )
sem_MExpression Prelude.Nothing  =
    sem_MExpression_Nothing
-- semantic domain
type T_MExpression  = Scope ->
                      ( MExpression)
data Inh_MExpression  = Inh_MExpression {scope_Inh_MExpression :: Scope}
data Syn_MExpression  = Syn_MExpression {annotatedTree_Syn_MExpression :: MExpression}
wrap_MExpression :: T_MExpression  ->
                    Inh_MExpression  ->
                    Syn_MExpression 
wrap_MExpression sem (Inh_MExpression _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_MExpression _lhsOannotatedTree ))
sem_MExpression_Just :: T_Expression  ->
                        T_MExpression 
sem_MExpression_Just just_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: MExpression
              _justOscope :: Scope
              _justIannotatedTree :: Expression
              _justIliftedColumnName :: String
              _annotatedTree =
                  Just _justIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _justOscope =
                  _lhsIscope
              ( _justIannotatedTree,_justIliftedColumnName) =
                  (just_ _justOscope )
          in  ( _lhsOannotatedTree)))
sem_MExpression_Nothing :: T_MExpression 
sem_MExpression_Nothing  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: MExpression
              _annotatedTree =
                  Nothing
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- MTableRef ---------------------------------------------------
type MTableRef  = (Maybe (TableRef))
-- cata
sem_MTableRef :: MTableRef  ->
                 T_MTableRef 
sem_MTableRef (Prelude.Just x )  =
    (sem_MTableRef_Just (sem_TableRef x ) )
sem_MTableRef Prelude.Nothing  =
    sem_MTableRef_Nothing
-- semantic domain
type T_MTableRef  = Scope ->
                    ( MTableRef,([QualifiedScope]),([String]))
data Inh_MTableRef  = Inh_MTableRef {scope_Inh_MTableRef :: Scope}
data Syn_MTableRef  = Syn_MTableRef {annotatedTree_Syn_MTableRef :: MTableRef,idens_Syn_MTableRef :: [QualifiedScope],joinIdens_Syn_MTableRef :: [String]}
wrap_MTableRef :: T_MTableRef  ->
                  Inh_MTableRef  ->
                  Syn_MTableRef 
wrap_MTableRef sem (Inh_MTableRef _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens) =
             (sem _lhsIscope )
     in  (Syn_MTableRef _lhsOannotatedTree _lhsOidens _lhsOjoinIdens ))
sem_MTableRef_Just :: T_TableRef  ->
                      T_MTableRef 
sem_MTableRef_Just just_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: MTableRef
              _lhsOidens :: ([QualifiedScope])
              _lhsOjoinIdens :: ([String])
              _justOscope :: Scope
              _justIannotatedTree :: TableRef
              _justIidens :: ([QualifiedScope])
              _justIjoinIdens :: ([String])
              _annotatedTree =
                  Just _justIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _lhsOidens =
                  _justIidens
              _lhsOjoinIdens =
                  _justIjoinIdens
              _justOscope =
                  _lhsIscope
              ( _justIannotatedTree,_justIidens,_justIjoinIdens) =
                  (just_ _justOscope )
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
sem_MTableRef_Nothing :: T_MTableRef 
sem_MTableRef_Nothing  =
    (\ _lhsIscope ->
         (let _lhsOidens :: ([QualifiedScope])
              _lhsOjoinIdens :: ([String])
              _lhsOannotatedTree :: MTableRef
              _lhsOidens =
                  []
              _lhsOjoinIdens =
                  []
              _annotatedTree =
                  Nothing
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
-- MaybeExpression ---------------------------------------------
type MaybeExpression  = (Maybe (Expression))
-- cata
sem_MaybeExpression :: MaybeExpression  ->
                       T_MaybeExpression 
sem_MaybeExpression (Prelude.Just x )  =
    (sem_MaybeExpression_Just (sem_Expression x ) )
sem_MaybeExpression Prelude.Nothing  =
    sem_MaybeExpression_Nothing
-- semantic domain
type T_MaybeExpression  = Scope ->
                          ( MaybeExpression)
data Inh_MaybeExpression  = Inh_MaybeExpression {scope_Inh_MaybeExpression :: Scope}
data Syn_MaybeExpression  = Syn_MaybeExpression {annotatedTree_Syn_MaybeExpression :: MaybeExpression}
wrap_MaybeExpression :: T_MaybeExpression  ->
                        Inh_MaybeExpression  ->
                        Syn_MaybeExpression 
wrap_MaybeExpression sem (Inh_MaybeExpression _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_MaybeExpression _lhsOannotatedTree ))
sem_MaybeExpression_Just :: T_Expression  ->
                            T_MaybeExpression 
sem_MaybeExpression_Just just_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: MaybeExpression
              _justOscope :: Scope
              _justIannotatedTree :: Expression
              _justIliftedColumnName :: String
              _annotatedTree =
                  Just _justIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _justOscope =
                  _lhsIscope
              ( _justIannotatedTree,_justIliftedColumnName) =
                  (just_ _justOscope )
          in  ( _lhsOannotatedTree)))
sem_MaybeExpression_Nothing :: T_MaybeExpression 
sem_MaybeExpression_Nothing  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: MaybeExpression
              _annotatedTree =
                  Nothing
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Natural -----------------------------------------------------
data Natural  = Natural 
              | Unnatural 
              deriving ( Eq,Show)
-- cata
sem_Natural :: Natural  ->
               T_Natural 
sem_Natural (Natural )  =
    (sem_Natural_Natural )
sem_Natural (Unnatural )  =
    (sem_Natural_Unnatural )
-- semantic domain
type T_Natural  = Scope ->
                  ( Natural)
data Inh_Natural  = Inh_Natural {scope_Inh_Natural :: Scope}
data Syn_Natural  = Syn_Natural {annotatedTree_Syn_Natural :: Natural}
wrap_Natural :: T_Natural  ->
                Inh_Natural  ->
                Syn_Natural 
wrap_Natural sem (Inh_Natural _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Natural _lhsOannotatedTree ))
sem_Natural_Natural :: T_Natural 
sem_Natural_Natural  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Natural
              _annotatedTree =
                  Natural
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Natural_Unnatural :: T_Natural 
sem_Natural_Unnatural  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Natural
              _annotatedTree =
                  Unnatural
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- OnExpr ------------------------------------------------------
type OnExpr  = (Maybe (JoinExpression))
-- cata
sem_OnExpr :: OnExpr  ->
              T_OnExpr 
sem_OnExpr (Prelude.Just x )  =
    (sem_OnExpr_Just (sem_JoinExpression x ) )
sem_OnExpr Prelude.Nothing  =
    sem_OnExpr_Nothing
-- semantic domain
type T_OnExpr  = Scope ->
                 ( OnExpr)
data Inh_OnExpr  = Inh_OnExpr {scope_Inh_OnExpr :: Scope}
data Syn_OnExpr  = Syn_OnExpr {annotatedTree_Syn_OnExpr :: OnExpr}
wrap_OnExpr :: T_OnExpr  ->
               Inh_OnExpr  ->
               Syn_OnExpr 
wrap_OnExpr sem (Inh_OnExpr _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_OnExpr _lhsOannotatedTree ))
sem_OnExpr_Just :: T_JoinExpression  ->
                   T_OnExpr 
sem_OnExpr_Just just_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: OnExpr
              _justOscope :: Scope
              _justIannotatedTree :: JoinExpression
              _annotatedTree =
                  Just _justIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _justOscope =
                  _lhsIscope
              ( _justIannotatedTree) =
                  (just_ _justOscope )
          in  ( _lhsOannotatedTree)))
sem_OnExpr_Nothing :: T_OnExpr 
sem_OnExpr_Nothing  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: OnExpr
              _annotatedTree =
                  Nothing
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- ParamDef ----------------------------------------------------
data ParamDef  = ParamDef (String) (TypeName) 
               | ParamDefTp (TypeName) 
               deriving ( Eq,Show)
-- cata
sem_ParamDef :: ParamDef  ->
                T_ParamDef 
sem_ParamDef (ParamDef _name _typ )  =
    (sem_ParamDef_ParamDef _name (sem_TypeName _typ ) )
sem_ParamDef (ParamDefTp _typ )  =
    (sem_ParamDef_ParamDefTp (sem_TypeName _typ ) )
-- semantic domain
type T_ParamDef  = Scope ->
                   ( ParamDef,(Either [TypeError] Type),String)
data Inh_ParamDef  = Inh_ParamDef {scope_Inh_ParamDef :: Scope}
data Syn_ParamDef  = Syn_ParamDef {annotatedTree_Syn_ParamDef :: ParamDef,namedType_Syn_ParamDef :: Either [TypeError] Type,paramName_Syn_ParamDef :: String}
wrap_ParamDef :: T_ParamDef  ->
                 Inh_ParamDef  ->
                 Syn_ParamDef 
wrap_ParamDef sem (Inh_ParamDef _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOnamedType,_lhsOparamName) =
             (sem _lhsIscope )
     in  (Syn_ParamDef _lhsOannotatedTree _lhsOnamedType _lhsOparamName ))
sem_ParamDef_ParamDef :: String ->
                         T_TypeName  ->
                         T_ParamDef 
sem_ParamDef_ParamDef name_ typ_  =
    (\ _lhsIscope ->
         (let _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOparamName :: String
              _lhsOannotatedTree :: ParamDef
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _lhsOnamedType =
                  _typInamedType
              _lhsOparamName =
                  name_
              _annotatedTree =
                  ParamDef name_ _typIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree,_lhsOnamedType,_lhsOparamName)))
sem_ParamDef_ParamDefTp :: T_TypeName  ->
                           T_ParamDef 
sem_ParamDef_ParamDefTp typ_  =
    (\ _lhsIscope ->
         (let _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOparamName :: String
              _lhsOannotatedTree :: ParamDef
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _lhsOnamedType =
                  _typInamedType
              _lhsOparamName =
                  ""
              _annotatedTree =
                  ParamDefTp _typIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree,_lhsOnamedType,_lhsOparamName)))
-- ParamDefList ------------------------------------------------
type ParamDefList  = [(ParamDef)]
-- cata
sem_ParamDefList :: ParamDefList  ->
                    T_ParamDefList 
sem_ParamDefList list  =
    (Prelude.foldr sem_ParamDefList_Cons sem_ParamDefList_Nil (Prelude.map sem_ParamDef list) )
-- semantic domain
type T_ParamDefList  = Scope ->
                       ( ParamDefList,([(String,Either [TypeError] Type)]))
data Inh_ParamDefList  = Inh_ParamDefList {scope_Inh_ParamDefList :: Scope}
data Syn_ParamDefList  = Syn_ParamDefList {annotatedTree_Syn_ParamDefList :: ParamDefList,params_Syn_ParamDefList :: [(String,Either [TypeError] Type)]}
wrap_ParamDefList :: T_ParamDefList  ->
                     Inh_ParamDefList  ->
                     Syn_ParamDefList 
wrap_ParamDefList sem (Inh_ParamDefList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOparams) =
             (sem _lhsIscope )
     in  (Syn_ParamDefList _lhsOannotatedTree _lhsOparams ))
sem_ParamDefList_Cons :: T_ParamDef  ->
                         T_ParamDefList  ->
                         T_ParamDefList 
sem_ParamDefList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOparams :: ([(String,Either [TypeError] Type)])
              _lhsOannotatedTree :: ParamDefList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: ParamDef
              _hdInamedType :: (Either [TypeError] Type)
              _hdIparamName :: String
              _tlIannotatedTree :: ParamDefList
              _tlIparams :: ([(String,Either [TypeError] Type)])
              _lhsOparams =
                  ((_hdIparamName, _hdInamedType) : _tlIparams)
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdInamedType,_hdIparamName) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlIparams) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOparams)))
sem_ParamDefList_Nil :: T_ParamDefList 
sem_ParamDefList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOparams :: ([(String,Either [TypeError] Type)])
              _lhsOannotatedTree :: ParamDefList
              _lhsOparams =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOparams)))
-- RaiseType ---------------------------------------------------
data RaiseType  = RError 
                | RException 
                | RNotice 
                deriving ( Eq,Show)
-- cata
sem_RaiseType :: RaiseType  ->
                 T_RaiseType 
sem_RaiseType (RError )  =
    (sem_RaiseType_RError )
sem_RaiseType (RException )  =
    (sem_RaiseType_RException )
sem_RaiseType (RNotice )  =
    (sem_RaiseType_RNotice )
-- semantic domain
type T_RaiseType  = Scope ->
                    ( RaiseType)
data Inh_RaiseType  = Inh_RaiseType {scope_Inh_RaiseType :: Scope}
data Syn_RaiseType  = Syn_RaiseType {annotatedTree_Syn_RaiseType :: RaiseType}
wrap_RaiseType :: T_RaiseType  ->
                  Inh_RaiseType  ->
                  Syn_RaiseType 
wrap_RaiseType sem (Inh_RaiseType _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_RaiseType _lhsOannotatedTree ))
sem_RaiseType_RError :: T_RaiseType 
sem_RaiseType_RError  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RaiseType
              _annotatedTree =
                  RError
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_RaiseType_RException :: T_RaiseType 
sem_RaiseType_RException  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RaiseType
              _annotatedTree =
                  RException
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_RaiseType_RNotice :: T_RaiseType 
sem_RaiseType_RNotice  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RaiseType
              _annotatedTree =
                  RNotice
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- RestartIdentity ---------------------------------------------
data RestartIdentity  = ContinueIdentity 
                      | RestartIdentity 
                      deriving ( Eq,Show)
-- cata
sem_RestartIdentity :: RestartIdentity  ->
                       T_RestartIdentity 
sem_RestartIdentity (ContinueIdentity )  =
    (sem_RestartIdentity_ContinueIdentity )
sem_RestartIdentity (RestartIdentity )  =
    (sem_RestartIdentity_RestartIdentity )
-- semantic domain
type T_RestartIdentity  = Scope ->
                          ( RestartIdentity)
data Inh_RestartIdentity  = Inh_RestartIdentity {scope_Inh_RestartIdentity :: Scope}
data Syn_RestartIdentity  = Syn_RestartIdentity {annotatedTree_Syn_RestartIdentity :: RestartIdentity}
wrap_RestartIdentity :: T_RestartIdentity  ->
                        Inh_RestartIdentity  ->
                        Syn_RestartIdentity 
wrap_RestartIdentity sem (Inh_RestartIdentity _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_RestartIdentity _lhsOannotatedTree ))
sem_RestartIdentity_ContinueIdentity :: T_RestartIdentity 
sem_RestartIdentity_ContinueIdentity  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RestartIdentity
              _annotatedTree =
                  ContinueIdentity
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_RestartIdentity_RestartIdentity :: T_RestartIdentity 
sem_RestartIdentity_RestartIdentity  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RestartIdentity
              _annotatedTree =
                  RestartIdentity
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Root --------------------------------------------------------
data Root  = Root (StatementList) 
           deriving ( Show)
-- cata
sem_Root :: Root  ->
            T_Root 
sem_Root (Root _statements )  =
    (sem_Root_Root (sem_StatementList _statements ) )
-- semantic domain
type T_Root  = Scope ->
               ( Root)
data Inh_Root  = Inh_Root {scope_Inh_Root :: Scope}
data Syn_Root  = Syn_Root {annotatedTree_Syn_Root :: Root}
wrap_Root :: T_Root  ->
             Inh_Root  ->
             Syn_Root 
wrap_Root sem (Inh_Root _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Root _lhsOannotatedTree ))
sem_Root_Root :: T_StatementList  ->
                 T_Root 
sem_Root_Root statements_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Root
              _statementsOscope :: Scope
              _statementsIannotatedTree :: StatementList
              _annotatedTree =
                  Root _statementsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _statementsOscope =
                  _lhsIscope
              ( _statementsIannotatedTree) =
                  (statements_ _statementsOscope )
          in  ( _lhsOannotatedTree)))
-- RowConstraint -----------------------------------------------
data RowConstraint  = NotNullConstraint 
                    | NullConstraint 
                    | RowCheckConstraint (Expression) 
                    | RowPrimaryKeyConstraint 
                    | RowReferenceConstraint (String) (Maybe String) (Cascade) (Cascade) 
                    | RowUniqueConstraint 
                    deriving ( Eq,Show)
-- cata
sem_RowConstraint :: RowConstraint  ->
                     T_RowConstraint 
sem_RowConstraint (NotNullConstraint )  =
    (sem_RowConstraint_NotNullConstraint )
sem_RowConstraint (NullConstraint )  =
    (sem_RowConstraint_NullConstraint )
sem_RowConstraint (RowCheckConstraint _expression )  =
    (sem_RowConstraint_RowCheckConstraint (sem_Expression _expression ) )
sem_RowConstraint (RowPrimaryKeyConstraint )  =
    (sem_RowConstraint_RowPrimaryKeyConstraint )
sem_RowConstraint (RowReferenceConstraint _table _att _onUpdate _onDelete )  =
    (sem_RowConstraint_RowReferenceConstraint _table _att (sem_Cascade _onUpdate ) (sem_Cascade _onDelete ) )
sem_RowConstraint (RowUniqueConstraint )  =
    (sem_RowConstraint_RowUniqueConstraint )
-- semantic domain
type T_RowConstraint  = Scope ->
                        ( RowConstraint)
data Inh_RowConstraint  = Inh_RowConstraint {scope_Inh_RowConstraint :: Scope}
data Syn_RowConstraint  = Syn_RowConstraint {annotatedTree_Syn_RowConstraint :: RowConstraint}
wrap_RowConstraint :: T_RowConstraint  ->
                      Inh_RowConstraint  ->
                      Syn_RowConstraint 
wrap_RowConstraint sem (Inh_RowConstraint _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_RowConstraint _lhsOannotatedTree ))
sem_RowConstraint_NotNullConstraint :: T_RowConstraint 
sem_RowConstraint_NotNullConstraint  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraint
              _annotatedTree =
                  NotNullConstraint
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_RowConstraint_NullConstraint :: T_RowConstraint 
sem_RowConstraint_NullConstraint  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraint
              _annotatedTree =
                  NullConstraint
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_RowConstraint_RowCheckConstraint :: T_Expression  ->
                                        T_RowConstraint 
sem_RowConstraint_RowCheckConstraint expression_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraint
              _expressionOscope :: Scope
              _expressionIannotatedTree :: Expression
              _expressionIliftedColumnName :: String
              _annotatedTree =
                  RowCheckConstraint _expressionIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _expressionOscope =
                  _lhsIscope
              ( _expressionIannotatedTree,_expressionIliftedColumnName) =
                  (expression_ _expressionOscope )
          in  ( _lhsOannotatedTree)))
sem_RowConstraint_RowPrimaryKeyConstraint :: T_RowConstraint 
sem_RowConstraint_RowPrimaryKeyConstraint  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraint
              _annotatedTree =
                  RowPrimaryKeyConstraint
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_RowConstraint_RowReferenceConstraint :: String ->
                                            (Maybe String) ->
                                            T_Cascade  ->
                                            T_Cascade  ->
                                            T_RowConstraint 
sem_RowConstraint_RowReferenceConstraint table_ att_ onUpdate_ onDelete_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraint
              _onUpdateOscope :: Scope
              _onDeleteOscope :: Scope
              _onUpdateIannotatedTree :: Cascade
              _onDeleteIannotatedTree :: Cascade
              _annotatedTree =
                  RowReferenceConstraint table_ att_ _onUpdateIannotatedTree _onDeleteIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _onUpdateOscope =
                  _lhsIscope
              _onDeleteOscope =
                  _lhsIscope
              ( _onUpdateIannotatedTree) =
                  (onUpdate_ _onUpdateOscope )
              ( _onDeleteIannotatedTree) =
                  (onDelete_ _onDeleteOscope )
          in  ( _lhsOannotatedTree)))
sem_RowConstraint_RowUniqueConstraint :: T_RowConstraint 
sem_RowConstraint_RowUniqueConstraint  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraint
              _annotatedTree =
                  RowUniqueConstraint
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- RowConstraintList -------------------------------------------
type RowConstraintList  = [(RowConstraint)]
-- cata
sem_RowConstraintList :: RowConstraintList  ->
                         T_RowConstraintList 
sem_RowConstraintList list  =
    (Prelude.foldr sem_RowConstraintList_Cons sem_RowConstraintList_Nil (Prelude.map sem_RowConstraint list) )
-- semantic domain
type T_RowConstraintList  = Scope ->
                            ( RowConstraintList)
data Inh_RowConstraintList  = Inh_RowConstraintList {scope_Inh_RowConstraintList :: Scope}
data Syn_RowConstraintList  = Syn_RowConstraintList {annotatedTree_Syn_RowConstraintList :: RowConstraintList}
wrap_RowConstraintList :: T_RowConstraintList  ->
                          Inh_RowConstraintList  ->
                          Syn_RowConstraintList 
wrap_RowConstraintList sem (Inh_RowConstraintList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_RowConstraintList _lhsOannotatedTree ))
sem_RowConstraintList_Cons :: T_RowConstraint  ->
                              T_RowConstraintList  ->
                              T_RowConstraintList 
sem_RowConstraintList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraintList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: RowConstraint
              _tlIannotatedTree :: RowConstraintList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_RowConstraintList_Nil :: T_RowConstraintList 
sem_RowConstraintList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: RowConstraintList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- SelectExpression --------------------------------------------
data SelectExpression  = CombineSelect (Annotation) (CombineType) (SelectExpression) (SelectExpression) 
                       | Select (Annotation) (Distinct) (SelectList) (MTableRef) (Where) (ExpressionList) (MExpression) (ExpressionList) (Direction) (MExpression) (MExpression) 
                       | Values (Annotation) (ExpressionListList) 
                       deriving ( Eq,Show)
-- cata
sem_SelectExpression :: SelectExpression  ->
                        T_SelectExpression 
sem_SelectExpression (CombineSelect _ann _ctype _sel1 _sel2 )  =
    (sem_SelectExpression_CombineSelect _ann (sem_CombineType _ctype ) (sem_SelectExpression _sel1 ) (sem_SelectExpression _sel2 ) )
sem_SelectExpression (Select _ann _selDistinct _selSelectList _selTref _selWhere _selGroupBy _selHaving _selOrderBy _selDir _selLimit _selOffset )  =
    (sem_SelectExpression_Select _ann (sem_Distinct _selDistinct ) (sem_SelectList _selSelectList ) (sem_MTableRef _selTref ) (sem_Where _selWhere ) (sem_ExpressionList _selGroupBy ) (sem_MExpression _selHaving ) (sem_ExpressionList _selOrderBy ) (sem_Direction _selDir ) (sem_MExpression _selLimit ) (sem_MExpression _selOffset ) )
sem_SelectExpression (Values _ann _vll )  =
    (sem_SelectExpression_Values _ann (sem_ExpressionListList _vll ) )
-- semantic domain
type T_SelectExpression  = Scope ->
                           ( SelectExpression)
data Inh_SelectExpression  = Inh_SelectExpression {scope_Inh_SelectExpression :: Scope}
data Syn_SelectExpression  = Syn_SelectExpression {annotatedTree_Syn_SelectExpression :: SelectExpression}
wrap_SelectExpression :: T_SelectExpression  ->
                         Inh_SelectExpression  ->
                         Syn_SelectExpression 
wrap_SelectExpression sem (Inh_SelectExpression _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_SelectExpression _lhsOannotatedTree ))
sem_SelectExpression_CombineSelect :: Annotation ->
                                      T_CombineType  ->
                                      T_SelectExpression  ->
                                      T_SelectExpression  ->
                                      T_SelectExpression 
sem_SelectExpression_CombineSelect ann_ ctype_ sel1_ sel2_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: SelectExpression
              _ctypeOscope :: Scope
              _sel1Oscope :: Scope
              _sel2Oscope :: Scope
              _ctypeIannotatedTree :: CombineType
              _sel1IannotatedTree :: SelectExpression
              _sel2IannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  let sel1t = getTypeAnnotation _sel1IannotatedTree
                      sel2t = getTypeAnnotation _sel2IannotatedTree
                  in checkTypes [sel1t, sel2t] $
                        typeCheckCombineSelect _lhsIscope sel1t sel2t
              _backTree =
                  CombineSelect ann_ _ctypeIannotatedTree
                                _sel1IannotatedTree
                                _sel2IannotatedTree
              _annotatedTree =
                  CombineSelect ann_ _ctypeIannotatedTree _sel1IannotatedTree _sel2IannotatedTree
              _ctypeOscope =
                  _lhsIscope
              _sel1Oscope =
                  _lhsIscope
              _sel2Oscope =
                  _lhsIscope
              ( _ctypeIannotatedTree) =
                  (ctype_ _ctypeOscope )
              ( _sel1IannotatedTree) =
                  (sel1_ _sel1Oscope )
              ( _sel2IannotatedTree) =
                  (sel2_ _sel2Oscope )
          in  ( _lhsOannotatedTree)))
sem_SelectExpression_Select :: Annotation ->
                               T_Distinct  ->
                               T_SelectList  ->
                               T_MTableRef  ->
                               T_Where  ->
                               T_ExpressionList  ->
                               T_MExpression  ->
                               T_ExpressionList  ->
                               T_Direction  ->
                               T_MExpression  ->
                               T_MExpression  ->
                               T_SelectExpression 
sem_SelectExpression_Select ann_ selDistinct_ selSelectList_ selTref_ selWhere_ selGroupBy_ selHaving_ selOrderBy_ selDir_ selLimit_ selOffset_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: SelectExpression
              _selSelectListOscope :: Scope
              _selWhereOscope :: Scope
              _selDistinctOscope :: Scope
              _selTrefOscope :: Scope
              _selGroupByOscope :: Scope
              _selHavingOscope :: Scope
              _selOrderByOscope :: Scope
              _selDirOscope :: Scope
              _selLimitOscope :: Scope
              _selOffsetOscope :: Scope
              _selDistinctIannotatedTree :: Distinct
              _selSelectListIannotatedTree :: SelectList
              _selSelectListIlistType :: Type
              _selTrefIannotatedTree :: MTableRef
              _selTrefIidens :: ([QualifiedScope])
              _selTrefIjoinIdens :: ([String])
              _selWhereIannotatedTree :: Where
              _selGroupByIannotatedTree :: ExpressionList
              _selGroupByItypeList :: ([Type])
              _selHavingIannotatedTree :: MExpression
              _selOrderByIannotatedTree :: ExpressionList
              _selOrderByItypeList :: ([Type])
              _selDirIannotatedTree :: Direction
              _selLimitIannotatedTree :: MExpression
              _selOffsetIannotatedTree :: MExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  do
                  whereType <- checkExpressionBool _selWhereIannotatedTree
                  let trefType = fromMaybe typeBool $ fmap getTypeAnnotation
                                                           _selTrefIannotatedTree
                      slType = _selSelectListIlistType
                  chainTypeCheckFailed [trefType, whereType, slType] $
                    Right $ case slType of
                              UnnamedCompositeType [(_,Pseudo Void)] -> Pseudo Void
                              _ -> SetOfType slType
              _backTree =
                  Select ann_
                         _selDistinctIannotatedTree
                         _selSelectListIannotatedTree
                         _selTrefIannotatedTree
                         _selWhereIannotatedTree
                         _selGroupByIannotatedTree
                         _selHavingIannotatedTree
                         _selOrderByIannotatedTree
                         _selDirIannotatedTree
                         _selLimitIannotatedTree
                         _selOffsetIannotatedTree
              _selSelectListOscope =
                  scopeReplaceIds _lhsIscope _selTrefIidens _selTrefIjoinIdens
              _selWhereOscope =
                  scopeReplaceIds _lhsIscope _selTrefIidens _selTrefIjoinIdens
              _annotatedTree =
                  Select ann_ _selDistinctIannotatedTree _selSelectListIannotatedTree _selTrefIannotatedTree _selWhereIannotatedTree _selGroupByIannotatedTree _selHavingIannotatedTree _selOrderByIannotatedTree _selDirIannotatedTree _selLimitIannotatedTree _selOffsetIannotatedTree
              _selDistinctOscope =
                  _lhsIscope
              _selTrefOscope =
                  _lhsIscope
              _selGroupByOscope =
                  _lhsIscope
              _selHavingOscope =
                  _lhsIscope
              _selOrderByOscope =
                  _lhsIscope
              _selDirOscope =
                  _lhsIscope
              _selLimitOscope =
                  _lhsIscope
              _selOffsetOscope =
                  _lhsIscope
              ( _selDistinctIannotatedTree) =
                  (selDistinct_ _selDistinctOscope )
              ( _selSelectListIannotatedTree,_selSelectListIlistType) =
                  (selSelectList_ _selSelectListOscope )
              ( _selTrefIannotatedTree,_selTrefIidens,_selTrefIjoinIdens) =
                  (selTref_ _selTrefOscope )
              ( _selWhereIannotatedTree) =
                  (selWhere_ _selWhereOscope )
              ( _selGroupByIannotatedTree,_selGroupByItypeList) =
                  (selGroupBy_ _selGroupByOscope )
              ( _selHavingIannotatedTree) =
                  (selHaving_ _selHavingOscope )
              ( _selOrderByIannotatedTree,_selOrderByItypeList) =
                  (selOrderBy_ _selOrderByOscope )
              ( _selDirIannotatedTree) =
                  (selDir_ _selDirOscope )
              ( _selLimitIannotatedTree) =
                  (selLimit_ _selLimitOscope )
              ( _selOffsetIannotatedTree) =
                  (selOffset_ _selOffsetOscope )
          in  ( _lhsOannotatedTree)))
sem_SelectExpression_Values :: Annotation ->
                               T_ExpressionListList  ->
                               T_SelectExpression 
sem_SelectExpression_Values ann_ vll_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: SelectExpression
              _vllOscope :: Scope
              _vllIannotatedTree :: ExpressionListList
              _vllItypeListList :: ([[Type]])
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  typeCheckValuesExpr
                              _lhsIscope
                              _vllItypeListList
              _backTree =
                  Values ann_ _vllIannotatedTree
              _annotatedTree =
                  Values ann_ _vllIannotatedTree
              _vllOscope =
                  _lhsIscope
              ( _vllIannotatedTree,_vllItypeListList) =
                  (vll_ _vllOscope )
          in  ( _lhsOannotatedTree)))
-- SelectItem --------------------------------------------------
data SelectItem  = SelExp (Expression) 
                 | SelectItem (Expression) (String) 
                 deriving ( Eq,Show)
-- cata
sem_SelectItem :: SelectItem  ->
                  T_SelectItem 
sem_SelectItem (SelExp _ex )  =
    (sem_SelectItem_SelExp (sem_Expression _ex ) )
sem_SelectItem (SelectItem _ex _name )  =
    (sem_SelectItem_SelectItem (sem_Expression _ex ) _name )
-- semantic domain
type T_SelectItem  = Scope ->
                     ( SelectItem,String,Type)
data Inh_SelectItem  = Inh_SelectItem {scope_Inh_SelectItem :: Scope}
data Syn_SelectItem  = Syn_SelectItem {annotatedTree_Syn_SelectItem :: SelectItem,columnName_Syn_SelectItem :: String,itemType_Syn_SelectItem :: Type}
wrap_SelectItem :: T_SelectItem  ->
                   Inh_SelectItem  ->
                   Syn_SelectItem 
wrap_SelectItem sem (Inh_SelectItem _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOcolumnName,_lhsOitemType) =
             (sem _lhsIscope )
     in  (Syn_SelectItem _lhsOannotatedTree _lhsOcolumnName _lhsOitemType ))
sem_SelectItem_SelExp :: T_Expression  ->
                         T_SelectItem 
sem_SelectItem_SelExp ex_  =
    (\ _lhsIscope ->
         (let _lhsOitemType :: Type
              _lhsOcolumnName :: String
              _lhsOannotatedTree :: SelectItem
              _exOscope :: Scope
              _exIannotatedTree :: Expression
              _exIliftedColumnName :: String
              _lhsOitemType =
                  getTypeAnnotation _exIannotatedTree
              _annotatedTree =
                  SelExp $ fixStar _exIannotatedTree
              _lhsOcolumnName =
                  case _exIliftedColumnName of
                    "" -> "?column?"
                    s -> s
              _lhsOannotatedTree =
                  _annotatedTree
              _exOscope =
                  _lhsIscope
              ( _exIannotatedTree,_exIliftedColumnName) =
                  (ex_ _exOscope )
          in  ( _lhsOannotatedTree,_lhsOcolumnName,_lhsOitemType)))
sem_SelectItem_SelectItem :: T_Expression  ->
                             String ->
                             T_SelectItem 
sem_SelectItem_SelectItem ex_ name_  =
    (\ _lhsIscope ->
         (let _lhsOitemType :: Type
              _lhsOcolumnName :: String
              _lhsOannotatedTree :: SelectItem
              _exOscope :: Scope
              _exIannotatedTree :: Expression
              _exIliftedColumnName :: String
              _lhsOitemType =
                  getTypeAnnotation _exIannotatedTree
              _backTree =
                  SelectItem (fixStar _exIannotatedTree) name_
              _lhsOcolumnName =
                  name_
              _annotatedTree =
                  SelectItem _exIannotatedTree name_
              _lhsOannotatedTree =
                  _annotatedTree
              _exOscope =
                  _lhsIscope
              ( _exIannotatedTree,_exIliftedColumnName) =
                  (ex_ _exOscope )
          in  ( _lhsOannotatedTree,_lhsOcolumnName,_lhsOitemType)))
-- SelectItemList ----------------------------------------------
type SelectItemList  = [(SelectItem)]
-- cata
sem_SelectItemList :: SelectItemList  ->
                      T_SelectItemList 
sem_SelectItemList list  =
    (Prelude.foldr sem_SelectItemList_Cons sem_SelectItemList_Nil (Prelude.map sem_SelectItem list) )
-- semantic domain
type T_SelectItemList  = Scope ->
                         ( SelectItemList,Type)
data Inh_SelectItemList  = Inh_SelectItemList {scope_Inh_SelectItemList :: Scope}
data Syn_SelectItemList  = Syn_SelectItemList {annotatedTree_Syn_SelectItemList :: SelectItemList,listType_Syn_SelectItemList :: Type}
wrap_SelectItemList :: T_SelectItemList  ->
                       Inh_SelectItemList  ->
                       Syn_SelectItemList 
wrap_SelectItemList sem (Inh_SelectItemList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOlistType) =
             (sem _lhsIscope )
     in  (Syn_SelectItemList _lhsOannotatedTree _lhsOlistType ))
sem_SelectItemList_Cons :: T_SelectItem  ->
                           T_SelectItemList  ->
                           T_SelectItemList 
sem_SelectItemList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOlistType :: Type
              _lhsOannotatedTree :: SelectItemList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: SelectItem
              _hdIcolumnName :: String
              _hdIitemType :: Type
              _tlIannotatedTree :: SelectItemList
              _tlIlistType :: Type
              _lhsOlistType =
                  doSelectItemListTpe _lhsIscope _hdIcolumnName _hdIitemType _tlIlistType
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdIcolumnName,_hdIitemType) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlIlistType) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOlistType)))
sem_SelectItemList_Nil :: T_SelectItemList 
sem_SelectItemList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOlistType :: Type
              _lhsOannotatedTree :: SelectItemList
              _lhsOlistType =
                  UnnamedCompositeType []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOlistType)))
-- SelectList --------------------------------------------------
data SelectList  = SelectList (SelectItemList) (StringList) 
                 deriving ( Eq,Show)
-- cata
sem_SelectList :: SelectList  ->
                  T_SelectList 
sem_SelectList (SelectList _items _stringList )  =
    (sem_SelectList_SelectList (sem_SelectItemList _items ) (sem_StringList _stringList ) )
-- semantic domain
type T_SelectList  = Scope ->
                     ( SelectList,Type)
data Inh_SelectList  = Inh_SelectList {scope_Inh_SelectList :: Scope}
data Syn_SelectList  = Syn_SelectList {annotatedTree_Syn_SelectList :: SelectList,listType_Syn_SelectList :: Type}
wrap_SelectList :: T_SelectList  ->
                   Inh_SelectList  ->
                   Syn_SelectList 
wrap_SelectList sem (Inh_SelectList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOlistType) =
             (sem _lhsIscope )
     in  (Syn_SelectList _lhsOannotatedTree _lhsOlistType ))
sem_SelectList_SelectList :: T_SelectItemList  ->
                             T_StringList  ->
                             T_SelectList 
sem_SelectList_SelectList items_ stringList_  =
    (\ _lhsIscope ->
         (let _lhsOlistType :: Type
              _lhsOannotatedTree :: SelectList
              _itemsOscope :: Scope
              _stringListOscope :: Scope
              _itemsIannotatedTree :: SelectItemList
              _itemsIlistType :: Type
              _stringListIannotatedTree :: StringList
              _stringListIstrings :: ([String])
              _lhsOlistType =
                  _itemsIlistType
              _annotatedTree =
                  SelectList _itemsIannotatedTree _stringListIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _itemsOscope =
                  _lhsIscope
              _stringListOscope =
                  _lhsIscope
              ( _itemsIannotatedTree,_itemsIlistType) =
                  (items_ _itemsOscope )
              ( _stringListIannotatedTree,_stringListIstrings) =
                  (stringList_ _stringListOscope )
          in  ( _lhsOannotatedTree,_lhsOlistType)))
-- SetClause ---------------------------------------------------
data SetClause  = RowSetClause (StringList) (ExpressionList) 
                | SetClause (String) (Expression) 
                deriving ( Eq,Show)
-- cata
sem_SetClause :: SetClause  ->
                 T_SetClause 
sem_SetClause (RowSetClause _atts _vals )  =
    (sem_SetClause_RowSetClause (sem_StringList _atts ) (sem_ExpressionList _vals ) )
sem_SetClause (SetClause _att _val )  =
    (sem_SetClause_SetClause _att (sem_Expression _val ) )
-- semantic domain
type T_SetClause  = Scope ->
                    ( SetClause,([(String,Type)]),(Maybe TypeError))
data Inh_SetClause  = Inh_SetClause {scope_Inh_SetClause :: Scope}
data Syn_SetClause  = Syn_SetClause {annotatedTree_Syn_SetClause :: SetClause,pairs_Syn_SetClause :: [(String,Type)],rowSetError_Syn_SetClause :: Maybe TypeError}
wrap_SetClause :: T_SetClause  ->
                  Inh_SetClause  ->
                  Syn_SetClause 
wrap_SetClause sem (Inh_SetClause _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOpairs,_lhsOrowSetError) =
             (sem _lhsIscope )
     in  (Syn_SetClause _lhsOannotatedTree _lhsOpairs _lhsOrowSetError ))
sem_SetClause_RowSetClause :: T_StringList  ->
                              T_ExpressionList  ->
                              T_SetClause 
sem_SetClause_RowSetClause atts_ vals_  =
    (\ _lhsIscope ->
         (let _lhsOpairs :: ([(String,Type)])
              _lhsOannotatedTree :: SetClause
              _lhsOrowSetError :: (Maybe TypeError)
              _attsOscope :: Scope
              _valsOscope :: Scope
              _attsIannotatedTree :: StringList
              _attsIstrings :: ([String])
              _valsIannotatedTree :: ExpressionList
              _valsItypeList :: ([Type])
              _rowSetError =
                  let atts = _attsIstrings
                      types = getRowTypes _valsItypeList
                  in if length atts /= length types
                       then Just WrongNumberOfColumns
                       else Nothing
              _lhsOpairs =
                  zip _attsIstrings $ getRowTypes _valsItypeList
              _annotatedTree =
                  RowSetClause _attsIannotatedTree _valsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _lhsOrowSetError =
                  _rowSetError
              _attsOscope =
                  _lhsIscope
              _valsOscope =
                  _lhsIscope
              ( _attsIannotatedTree,_attsIstrings) =
                  (atts_ _attsOscope )
              ( _valsIannotatedTree,_valsItypeList) =
                  (vals_ _valsOscope )
          in  ( _lhsOannotatedTree,_lhsOpairs,_lhsOrowSetError)))
sem_SetClause_SetClause :: String ->
                           T_Expression  ->
                           T_SetClause 
sem_SetClause_SetClause att_ val_  =
    (\ _lhsIscope ->
         (let _lhsOpairs :: ([(String,Type)])
              _lhsOrowSetError :: (Maybe TypeError)
              _lhsOannotatedTree :: SetClause
              _valOscope :: Scope
              _valIannotatedTree :: Expression
              _valIliftedColumnName :: String
              _lhsOpairs =
                  [(att_, getTypeAnnotation _valIannotatedTree)]
              _lhsOrowSetError =
                  Nothing
              _annotatedTree =
                  SetClause att_ _valIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _valOscope =
                  _lhsIscope
              ( _valIannotatedTree,_valIliftedColumnName) =
                  (val_ _valOscope )
          in  ( _lhsOannotatedTree,_lhsOpairs,_lhsOrowSetError)))
-- SetClauseList -----------------------------------------------
type SetClauseList  = [(SetClause)]
-- cata
sem_SetClauseList :: SetClauseList  ->
                     T_SetClauseList 
sem_SetClauseList list  =
    (Prelude.foldr sem_SetClauseList_Cons sem_SetClauseList_Nil (Prelude.map sem_SetClause list) )
-- semantic domain
type T_SetClauseList  = Scope ->
                        ( SetClauseList,([(String,Type)]),([TypeError]))
data Inh_SetClauseList  = Inh_SetClauseList {scope_Inh_SetClauseList :: Scope}
data Syn_SetClauseList  = Syn_SetClauseList {annotatedTree_Syn_SetClauseList :: SetClauseList,pairs_Syn_SetClauseList :: [(String,Type)],rowSetErrors_Syn_SetClauseList :: [TypeError]}
wrap_SetClauseList :: T_SetClauseList  ->
                      Inh_SetClauseList  ->
                      Syn_SetClauseList 
wrap_SetClauseList sem (Inh_SetClauseList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOpairs,_lhsOrowSetErrors) =
             (sem _lhsIscope )
     in  (Syn_SetClauseList _lhsOannotatedTree _lhsOpairs _lhsOrowSetErrors ))
sem_SetClauseList_Cons :: T_SetClause  ->
                          T_SetClauseList  ->
                          T_SetClauseList 
sem_SetClauseList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOpairs :: ([(String,Type)])
              _lhsOrowSetErrors :: ([TypeError])
              _lhsOannotatedTree :: SetClauseList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: SetClause
              _hdIpairs :: ([(String,Type)])
              _hdIrowSetError :: (Maybe TypeError)
              _tlIannotatedTree :: SetClauseList
              _tlIpairs :: ([(String,Type)])
              _tlIrowSetErrors :: ([TypeError])
              _lhsOpairs =
                  _hdIpairs ++ _tlIpairs
              _lhsOrowSetErrors =
                  maybeToList _hdIrowSetError ++ _tlIrowSetErrors
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdIpairs,_hdIrowSetError) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlIpairs,_tlIrowSetErrors) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOpairs,_lhsOrowSetErrors)))
sem_SetClauseList_Nil :: T_SetClauseList 
sem_SetClauseList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOpairs :: ([(String,Type)])
              _lhsOrowSetErrors :: ([TypeError])
              _lhsOannotatedTree :: SetClauseList
              _lhsOpairs =
                  []
              _lhsOrowSetErrors =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOpairs,_lhsOrowSetErrors)))
-- Statement ---------------------------------------------------
data Statement  = Assignment (Annotation) (String) (Expression) 
                | CaseStatement (Annotation) (Expression) (ExpressionListStatementListPairList) (StatementList) 
                | ContinueStatement (Annotation) 
                | Copy (Annotation) (String) (StringList) (CopySource) 
                | CopyData (Annotation) (String) 
                | CreateDomain (Annotation) (String) (TypeName) (Maybe Expression) 
                | CreateFunction (Annotation) (Language) (String) (ParamDefList) (TypeName) (String) (FnBody) (Volatility) 
                | CreateTable (Annotation) (String) (AttributeDefList) (ConstraintList) 
                | CreateTableAs (Annotation) (String) (SelectExpression) 
                | CreateType (Annotation) (String) (TypeAttributeDefList) 
                | CreateView (Annotation) (String) (SelectExpression) 
                | Delete (Annotation) (String) (Where) (Maybe SelectList) 
                | DropFunction (Annotation) (IfExists) (StringStringListPairList) (Cascade) 
                | DropSomething (Annotation) (DropType) (IfExists) (StringList) (Cascade) 
                | Execute (Annotation) (Expression) 
                | ExecuteInto (Annotation) (Expression) (StringList) 
                | ForIntegerStatement (Annotation) (String) (Expression) (Expression) (StatementList) 
                | ForSelectStatement (Annotation) (String) (SelectExpression) (StatementList) 
                | If (Annotation) (ExpressionStatementListPairList) (StatementList) 
                | Insert (Annotation) (String) (StringList) (SelectExpression) (Maybe SelectList) 
                | NullStatement (Annotation) 
                | Perform (Annotation) (Expression) 
                | Raise (Annotation) (RaiseType) (String) (ExpressionList) 
                | Return (Annotation) (Maybe Expression) 
                | ReturnNext (Annotation) (Expression) 
                | ReturnQuery (Annotation) (SelectExpression) 
                | SelectStatement (Annotation) (SelectExpression) 
                | Truncate (Annotation) (StringList) (RestartIdentity) (Cascade) 
                | Update (Annotation) (String) (SetClauseList) (Where) (Maybe SelectList) 
                | WhileStatement (Annotation) (Expression) (StatementList) 
                deriving ( Eq,Show)
-- cata
sem_Statement :: Statement  ->
                 T_Statement 
sem_Statement (Assignment _ann _target _value )  =
    (sem_Statement_Assignment _ann _target (sem_Expression _value ) )
sem_Statement (CaseStatement _ann _val _cases _els )  =
    (sem_Statement_CaseStatement _ann (sem_Expression _val ) (sem_ExpressionListStatementListPairList _cases ) (sem_StatementList _els ) )
sem_Statement (ContinueStatement _ann )  =
    (sem_Statement_ContinueStatement _ann )
sem_Statement (Copy _ann _table _targetCols _source )  =
    (sem_Statement_Copy _ann _table (sem_StringList _targetCols ) (sem_CopySource _source ) )
sem_Statement (CopyData _ann _insData )  =
    (sem_Statement_CopyData _ann _insData )
sem_Statement (CreateDomain _ann _name _typ _check )  =
    (sem_Statement_CreateDomain _ann _name (sem_TypeName _typ ) _check )
sem_Statement (CreateFunction _ann _lang _name _params _rettype _bodyQuote _body _vol )  =
    (sem_Statement_CreateFunction _ann (sem_Language _lang ) _name (sem_ParamDefList _params ) (sem_TypeName _rettype ) _bodyQuote (sem_FnBody _body ) (sem_Volatility _vol ) )
sem_Statement (CreateTable _ann _name _atts _cons )  =
    (sem_Statement_CreateTable _ann _name (sem_AttributeDefList _atts ) (sem_ConstraintList _cons ) )
sem_Statement (CreateTableAs _ann _name _expr )  =
    (sem_Statement_CreateTableAs _ann _name (sem_SelectExpression _expr ) )
sem_Statement (CreateType _ann _name _atts )  =
    (sem_Statement_CreateType _ann _name (sem_TypeAttributeDefList _atts ) )
sem_Statement (CreateView _ann _name _expr )  =
    (sem_Statement_CreateView _ann _name (sem_SelectExpression _expr ) )
sem_Statement (Delete _ann _table _whr _returning )  =
    (sem_Statement_Delete _ann _table (sem_Where _whr ) _returning )
sem_Statement (DropFunction _ann _ifE _sigs _cascade )  =
    (sem_Statement_DropFunction _ann (sem_IfExists _ifE ) (sem_StringStringListPairList _sigs ) (sem_Cascade _cascade ) )
sem_Statement (DropSomething _ann _dropType _ifE _names _cascade )  =
    (sem_Statement_DropSomething _ann (sem_DropType _dropType ) (sem_IfExists _ifE ) (sem_StringList _names ) (sem_Cascade _cascade ) )
sem_Statement (Execute _ann _expr )  =
    (sem_Statement_Execute _ann (sem_Expression _expr ) )
sem_Statement (ExecuteInto _ann _expr _targets )  =
    (sem_Statement_ExecuteInto _ann (sem_Expression _expr ) (sem_StringList _targets ) )
sem_Statement (ForIntegerStatement _ann _var _from _to _sts )  =
    (sem_Statement_ForIntegerStatement _ann _var (sem_Expression _from ) (sem_Expression _to ) (sem_StatementList _sts ) )
sem_Statement (ForSelectStatement _ann _var _sel _sts )  =
    (sem_Statement_ForSelectStatement _ann _var (sem_SelectExpression _sel ) (sem_StatementList _sts ) )
sem_Statement (If _ann _cases _els )  =
    (sem_Statement_If _ann (sem_ExpressionStatementListPairList _cases ) (sem_StatementList _els ) )
sem_Statement (Insert _ann _table _targetCols _insData _returning )  =
    (sem_Statement_Insert _ann _table (sem_StringList _targetCols ) (sem_SelectExpression _insData ) _returning )
sem_Statement (NullStatement _ann )  =
    (sem_Statement_NullStatement _ann )
sem_Statement (Perform _ann _expr )  =
    (sem_Statement_Perform _ann (sem_Expression _expr ) )
sem_Statement (Raise _ann _level _message _args )  =
    (sem_Statement_Raise _ann (sem_RaiseType _level ) _message (sem_ExpressionList _args ) )
sem_Statement (Return _ann _value )  =
    (sem_Statement_Return _ann _value )
sem_Statement (ReturnNext _ann _expr )  =
    (sem_Statement_ReturnNext _ann (sem_Expression _expr ) )
sem_Statement (ReturnQuery _ann _sel )  =
    (sem_Statement_ReturnQuery _ann (sem_SelectExpression _sel ) )
sem_Statement (SelectStatement _ann _ex )  =
    (sem_Statement_SelectStatement _ann (sem_SelectExpression _ex ) )
sem_Statement (Truncate _ann _tables _restartIdentity _cascade )  =
    (sem_Statement_Truncate _ann (sem_StringList _tables ) (sem_RestartIdentity _restartIdentity ) (sem_Cascade _cascade ) )
sem_Statement (Update _ann _table _assigns _whr _returning )  =
    (sem_Statement_Update _ann _table (sem_SetClauseList _assigns ) (sem_Where _whr ) _returning )
sem_Statement (WhileStatement _ann _expr _sts )  =
    (sem_Statement_WhileStatement _ann (sem_Expression _expr ) (sem_StatementList _sts ) )
-- semantic domain
type T_Statement  = Scope ->
                    ( Statement)
data Inh_Statement  = Inh_Statement {scope_Inh_Statement :: Scope}
data Syn_Statement  = Syn_Statement {annotatedTree_Syn_Statement :: Statement}
wrap_Statement :: T_Statement  ->
                  Inh_Statement  ->
                  Syn_Statement 
wrap_Statement sem (Inh_Statement _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Statement _lhsOannotatedTree ))
sem_Statement_Assignment :: Annotation ->
                            String ->
                            T_Expression  ->
                            T_Statement 
sem_Statement_Assignment ann_ target_ value_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _valueOscope :: Scope
              _valueIannotatedTree :: Expression
              _valueIliftedColumnName :: String
              _annotatedTree =
                  Assignment ann_ target_ _valueIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _valueOscope =
                  _lhsIscope
              ( _valueIannotatedTree,_valueIliftedColumnName) =
                  (value_ _valueOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CaseStatement :: Annotation ->
                               T_Expression  ->
                               T_ExpressionListStatementListPairList  ->
                               T_StatementList  ->
                               T_Statement 
sem_Statement_CaseStatement ann_ val_ cases_ els_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _valOscope :: Scope
              _casesOscope :: Scope
              _elsOscope :: Scope
              _valIannotatedTree :: Expression
              _valIliftedColumnName :: String
              _casesIannotatedTree :: ExpressionListStatementListPairList
              _elsIannotatedTree :: StatementList
              _annotatedTree =
                  CaseStatement ann_ _valIannotatedTree _casesIannotatedTree _elsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _valOscope =
                  _lhsIscope
              _casesOscope =
                  _lhsIscope
              _elsOscope =
                  _lhsIscope
              ( _valIannotatedTree,_valIliftedColumnName) =
                  (val_ _valOscope )
              ( _casesIannotatedTree) =
                  (cases_ _casesOscope )
              ( _elsIannotatedTree) =
                  (els_ _elsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_ContinueStatement :: Annotation ->
                                   T_Statement 
sem_Statement_ContinueStatement ann_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _annotatedTree =
                  ContinueStatement ann_
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Statement_Copy :: Annotation ->
                      String ->
                      T_StringList  ->
                      T_CopySource  ->
                      T_Statement 
sem_Statement_Copy ann_ table_ targetCols_ source_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _targetColsOscope :: Scope
              _sourceOscope :: Scope
              _targetColsIannotatedTree :: StringList
              _targetColsIstrings :: ([String])
              _sourceIannotatedTree :: CopySource
              _annotatedTree =
                  Copy ann_ table_ _targetColsIannotatedTree _sourceIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _targetColsOscope =
                  _lhsIscope
              _sourceOscope =
                  _lhsIscope
              ( _targetColsIannotatedTree,_targetColsIstrings) =
                  (targetCols_ _targetColsOscope )
              ( _sourceIannotatedTree) =
                  (source_ _sourceOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CopyData :: Annotation ->
                          String ->
                          T_Statement 
sem_Statement_CopyData ann_ insData_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _annotatedTree =
                  CopyData ann_ insData_
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Statement_CreateDomain :: Annotation ->
                              String ->
                              T_TypeName  ->
                              (Maybe Expression) ->
                              T_Statement 
sem_Statement_CreateDomain ann_ name_ typ_ check_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _namedTypeType =
                  case _typInamedType of
                    Left _ -> TypeCheckFailed
                    Right x -> x
              _tpe =
                  checkTypes [_namedTypeType    ] $ Right $ Pseudo Void
              _backTree =
                  CreateDomain ann_ name_ _typIannotatedTree check_
              _statementInfo =
                  CreateDomainInfo name_ _namedTypeType
              _annotatedTree =
                  CreateDomain ann_ name_ _typIannotatedTree check_
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CreateFunction :: Annotation ->
                                T_Language  ->
                                String ->
                                T_ParamDefList  ->
                                T_TypeName  ->
                                String ->
                                T_FnBody  ->
                                T_Volatility  ->
                                T_Statement 
sem_Statement_CreateFunction ann_ lang_ name_ params_ rettype_ bodyQuote_ body_ vol_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _langOscope :: Scope
              _paramsOscope :: Scope
              _rettypeOscope :: Scope
              _bodyOscope :: Scope
              _volOscope :: Scope
              _langIannotatedTree :: Language
              _paramsIannotatedTree :: ParamDefList
              _paramsIparams :: ([(String,Either [TypeError] Type)])
              _rettypeIannotatedTree :: TypeName
              _rettypeInamedType :: (Either [TypeError] Type)
              _bodyIannotatedTree :: FnBody
              _volIannotatedTree :: Volatility
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _retTypeType =
                  errorToTypeFail _rettypeInamedType
              _paramTypes =
                  let tpes = map snd _paramsIparams
                  in if null $ concat $ lefts tpes
                     then rights tpes
                     else [TypeCheckFailed]
              _tpe =
                  do
                    _rettypeInamedType
                    let tpes = map snd _paramsIparams
                    checkErrorList (concat $ lefts tpes) $ Pseudo Void
              _backTree =
                  CreateFunction ann_
                                 _langIannotatedTree
                                 name_
                                 _paramsIannotatedTree
                                 _rettypeIannotatedTree
                                 bodyQuote_
                                 _bodyIannotatedTree
                                 _volIannotatedTree
              _statementInfo =
                  CreateFunctionInfo (name_,_paramTypes    ,_retTypeType    )
              _annotatedTree =
                  CreateFunction ann_ _langIannotatedTree name_ _paramsIannotatedTree _rettypeIannotatedTree bodyQuote_ _bodyIannotatedTree _volIannotatedTree
              _langOscope =
                  _lhsIscope
              _paramsOscope =
                  _lhsIscope
              _rettypeOscope =
                  _lhsIscope
              _bodyOscope =
                  _lhsIscope
              _volOscope =
                  _lhsIscope
              ( _langIannotatedTree) =
                  (lang_ _langOscope )
              ( _paramsIannotatedTree,_paramsIparams) =
                  (params_ _paramsOscope )
              ( _rettypeIannotatedTree,_rettypeInamedType) =
                  (rettype_ _rettypeOscope )
              ( _bodyIannotatedTree) =
                  (body_ _bodyOscope )
              ( _volIannotatedTree) =
                  (vol_ _volOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CreateTable :: Annotation ->
                             String ->
                             T_AttributeDefList  ->
                             T_ConstraintList  ->
                             T_Statement 
sem_Statement_CreateTable ann_ name_ atts_ cons_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _attsOscope :: Scope
              _consOscope :: Scope
              _attsIannotatedTree :: AttributeDefList
              _attsIattrs :: ([(String, Either [TypeError] Type)])
              _consIannotatedTree :: ConstraintList
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _attrTypes =
                  map snd _attsIattrs
              _tpe =
                  checkErrorList (concat $ lefts _attrTypes    ) $ Pseudo Void
              _compositeType =
                  errorToTypeFailF (const $ UnnamedCompositeType doneAtts) _tpe
                  where
                    doneAtts = map (second errorToTypeFail) _attsIattrs
              _backTree =
                  CreateTable ann_ name_ _attsIannotatedTree _consIannotatedTree
              _statementInfo =
                  RelvarInfo (name_, TableComposite, _compositeType    )
              _annotatedTree =
                  CreateTable ann_ name_ _attsIannotatedTree _consIannotatedTree
              _attsOscope =
                  _lhsIscope
              _consOscope =
                  _lhsIscope
              ( _attsIannotatedTree,_attsIattrs) =
                  (atts_ _attsOscope )
              ( _consIannotatedTree) =
                  (cons_ _consOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CreateTableAs :: Annotation ->
                               String ->
                               T_SelectExpression  ->
                               T_Statement 
sem_Statement_CreateTableAs ann_ name_ expr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _exprIannotatedTree :: SelectExpression
              _selType =
                  getTypeAnnotation _exprIannotatedTree
              _tpe =
                  Right _selType
              _backTree =
                  CreateTableAs ann_ name_ _exprIannotatedTree
              _statementInfo =
                  RelvarInfo (name_, TableComposite, _selType    )
              _annotatedTree =
                  CreateTableAs ann_ name_ _exprIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              ( _exprIannotatedTree) =
                  (expr_ _exprOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CreateType :: Annotation ->
                            String ->
                            T_TypeAttributeDefList  ->
                            T_Statement 
sem_Statement_CreateType ann_ name_ atts_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _attsOscope :: Scope
              _attsIannotatedTree :: TypeAttributeDefList
              _attsIattrs :: ([(String, Either [TypeError] Type)])
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _attrTypes =
                  map snd _attsIattrs
              _tpe =
                  checkErrorList (concat $ lefts _attrTypes    ) $ Pseudo Void
              _compositeType =
                  errorToTypeFailF (const $ UnnamedCompositeType doneAtts) _tpe
                  where
                    doneAtts = map (second errorToTypeFail) _attsIattrs
              _backTree =
                  CreateType ann_ name_ _attsIannotatedTree
              _statementInfo =
                  RelvarInfo (name_, Composite, _compositeType    )
              _annotatedTree =
                  CreateType ann_ name_ _attsIannotatedTree
              _attsOscope =
                  _lhsIscope
              ( _attsIannotatedTree,_attsIattrs) =
                  (atts_ _attsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_CreateView :: Annotation ->
                            String ->
                            T_SelectExpression  ->
                            T_Statement 
sem_Statement_CreateView ann_ name_ expr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _exprIannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _tpe =
                  checkTypes [getTypeAnnotation _exprIannotatedTree] $ Right $ Pseudo Void
              _backTree =
                  CreateView ann_ name_ _exprIannotatedTree
              _statementInfo =
                  RelvarInfo (name_, ViewComposite, getTypeAnnotation _exprIannotatedTree)
              _annotatedTree =
                  CreateView ann_ name_ _exprIannotatedTree
              _exprOscope =
                  _lhsIscope
              ( _exprIannotatedTree) =
                  (expr_ _exprOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Delete :: Annotation ->
                        String ->
                        T_Where  ->
                        (Maybe SelectList) ->
                        T_Statement 
sem_Statement_Delete ann_ table_ whr_ returning_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _whrOscope :: Scope
              _whrIannotatedTree :: Where
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _tpe =
                  case checkRelationExists _lhsIscope table_ of
                    Just e -> Left [e]
                    Nothing -> do
                      whereType <- checkExpressionBool _whrIannotatedTree
                      return $ Pseudo Void
              _statementInfo =
                  DeleteInfo table_
              _backTree =
                  Delete ann_ table_ _whrIannotatedTree returning_
              _annotatedTree =
                  Delete ann_ table_ _whrIannotatedTree returning_
              _whrOscope =
                  _lhsIscope
              ( _whrIannotatedTree) =
                  (whr_ _whrOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_DropFunction :: Annotation ->
                              T_IfExists  ->
                              T_StringStringListPairList  ->
                              T_Cascade  ->
                              T_Statement 
sem_Statement_DropFunction ann_ ifE_ sigs_ cascade_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _ifEOscope :: Scope
              _sigsOscope :: Scope
              _cascadeOscope :: Scope
              _ifEIannotatedTree :: IfExists
              _sigsIannotatedTree :: StringStringListPairList
              _cascadeIannotatedTree :: Cascade
              _annotatedTree =
                  DropFunction ann_ _ifEIannotatedTree _sigsIannotatedTree _cascadeIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _ifEOscope =
                  _lhsIscope
              _sigsOscope =
                  _lhsIscope
              _cascadeOscope =
                  _lhsIscope
              ( _ifEIannotatedTree) =
                  (ifE_ _ifEOscope )
              ( _sigsIannotatedTree) =
                  (sigs_ _sigsOscope )
              ( _cascadeIannotatedTree) =
                  (cascade_ _cascadeOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_DropSomething :: Annotation ->
                               T_DropType  ->
                               T_IfExists  ->
                               T_StringList  ->
                               T_Cascade  ->
                               T_Statement 
sem_Statement_DropSomething ann_ dropType_ ifE_ names_ cascade_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _dropTypeOscope :: Scope
              _ifEOscope :: Scope
              _namesOscope :: Scope
              _cascadeOscope :: Scope
              _dropTypeIannotatedTree :: DropType
              _ifEIannotatedTree :: IfExists
              _namesIannotatedTree :: StringList
              _namesIstrings :: ([String])
              _cascadeIannotatedTree :: Cascade
              _annotatedTree =
                  DropSomething ann_ _dropTypeIannotatedTree _ifEIannotatedTree _namesIannotatedTree _cascadeIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _dropTypeOscope =
                  _lhsIscope
              _ifEOscope =
                  _lhsIscope
              _namesOscope =
                  _lhsIscope
              _cascadeOscope =
                  _lhsIscope
              ( _dropTypeIannotatedTree) =
                  (dropType_ _dropTypeOscope )
              ( _ifEIannotatedTree) =
                  (ifE_ _ifEOscope )
              ( _namesIannotatedTree,_namesIstrings) =
                  (names_ _namesOscope )
              ( _cascadeIannotatedTree) =
                  (cascade_ _cascadeOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Execute :: Annotation ->
                         T_Expression  ->
                         T_Statement 
sem_Statement_Execute ann_ expr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _annotatedTree =
                  Execute ann_ _exprIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_ExecuteInto :: Annotation ->
                             T_Expression  ->
                             T_StringList  ->
                             T_Statement 
sem_Statement_ExecuteInto ann_ expr_ targets_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _targetsOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _targetsIannotatedTree :: StringList
              _targetsIstrings :: ([String])
              _annotatedTree =
                  ExecuteInto ann_ _exprIannotatedTree _targetsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              _targetsOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
              ( _targetsIannotatedTree,_targetsIstrings) =
                  (targets_ _targetsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_ForIntegerStatement :: Annotation ->
                                     String ->
                                     T_Expression  ->
                                     T_Expression  ->
                                     T_StatementList  ->
                                     T_Statement 
sem_Statement_ForIntegerStatement ann_ var_ from_ to_ sts_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _fromOscope :: Scope
              _toOscope :: Scope
              _stsOscope :: Scope
              _fromIannotatedTree :: Expression
              _fromIliftedColumnName :: String
              _toIannotatedTree :: Expression
              _toIliftedColumnName :: String
              _stsIannotatedTree :: StatementList
              _annotatedTree =
                  ForIntegerStatement ann_ var_ _fromIannotatedTree _toIannotatedTree _stsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _fromOscope =
                  _lhsIscope
              _toOscope =
                  _lhsIscope
              _stsOscope =
                  _lhsIscope
              ( _fromIannotatedTree,_fromIliftedColumnName) =
                  (from_ _fromOscope )
              ( _toIannotatedTree,_toIliftedColumnName) =
                  (to_ _toOscope )
              ( _stsIannotatedTree) =
                  (sts_ _stsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_ForSelectStatement :: Annotation ->
                                    String ->
                                    T_SelectExpression  ->
                                    T_StatementList  ->
                                    T_Statement 
sem_Statement_ForSelectStatement ann_ var_ sel_ sts_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _selOscope :: Scope
              _stsOscope :: Scope
              _selIannotatedTree :: SelectExpression
              _stsIannotatedTree :: StatementList
              _annotatedTree =
                  ForSelectStatement ann_ var_ _selIannotatedTree _stsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _selOscope =
                  _lhsIscope
              _stsOscope =
                  _lhsIscope
              ( _selIannotatedTree) =
                  (sel_ _selOscope )
              ( _stsIannotatedTree) =
                  (sts_ _stsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_If :: Annotation ->
                    T_ExpressionStatementListPairList  ->
                    T_StatementList  ->
                    T_Statement 
sem_Statement_If ann_ cases_ els_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _casesOscope :: Scope
              _elsOscope :: Scope
              _casesIannotatedTree :: ExpressionStatementListPairList
              _elsIannotatedTree :: StatementList
              _annotatedTree =
                  If ann_ _casesIannotatedTree _elsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _casesOscope =
                  _lhsIscope
              _elsOscope =
                  _lhsIscope
              ( _casesIannotatedTree) =
                  (cases_ _casesOscope )
              ( _elsIannotatedTree) =
                  (els_ _elsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Insert :: Annotation ->
                        String ->
                        T_StringList  ->
                        T_SelectExpression  ->
                        (Maybe SelectList) ->
                        T_Statement 
sem_Statement_Insert ann_ table_ targetCols_ insData_ returning_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _targetColsOscope :: Scope
              _insDataOscope :: Scope
              _targetColsIannotatedTree :: StringList
              _targetColsIstrings :: ([String])
              _insDataIannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _columnStuff =
                  checkColumnConsistency _lhsIscope
                                         table_
                                         _targetColsIstrings
                                         (unwrapComposite $ unwrapSetOf $
                                                          getTypeAnnotation _insDataIannotatedTree)
              _tpe =
                  checkTypes [getTypeAnnotation _insDataIannotatedTree] $ do
                    _columnStuff
                    Right $ Pseudo Void
              _statementInfo =
                  InsertInfo table_ $ errorToTypeFailF UnnamedCompositeType _columnStuff
              _backTree =
                  Insert ann_ table_ _targetColsIannotatedTree
                         _insDataIannotatedTree returning_
              _annotatedTree =
                  Insert ann_ table_ _targetColsIannotatedTree _insDataIannotatedTree returning_
              _targetColsOscope =
                  _lhsIscope
              _insDataOscope =
                  _lhsIscope
              ( _targetColsIannotatedTree,_targetColsIstrings) =
                  (targetCols_ _targetColsOscope )
              ( _insDataIannotatedTree) =
                  (insData_ _insDataOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_NullStatement :: Annotation ->
                               T_Statement 
sem_Statement_NullStatement ann_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _annotatedTree =
                  NullStatement ann_
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Statement_Perform :: Annotation ->
                         T_Expression  ->
                         T_Statement 
sem_Statement_Perform ann_ expr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _annotatedTree =
                  Perform ann_ _exprIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Raise :: Annotation ->
                       T_RaiseType  ->
                       String ->
                       T_ExpressionList  ->
                       T_Statement 
sem_Statement_Raise ann_ level_ message_ args_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _levelOscope :: Scope
              _argsOscope :: Scope
              _levelIannotatedTree :: RaiseType
              _argsIannotatedTree :: ExpressionList
              _argsItypeList :: ([Type])
              _annotatedTree =
                  Raise ann_ _levelIannotatedTree message_ _argsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _levelOscope =
                  _lhsIscope
              _argsOscope =
                  _lhsIscope
              ( _levelIannotatedTree) =
                  (level_ _levelOscope )
              ( _argsIannotatedTree,_argsItypeList) =
                  (args_ _argsOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Return :: Annotation ->
                        (Maybe Expression) ->
                        T_Statement 
sem_Statement_Return ann_ value_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _annotatedTree =
                  Return ann_ value_
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Statement_ReturnNext :: Annotation ->
                            T_Expression  ->
                            T_Statement 
sem_Statement_ReturnNext ann_ expr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _annotatedTree =
                  ReturnNext ann_ _exprIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_ReturnQuery :: Annotation ->
                             T_SelectExpression  ->
                             T_Statement 
sem_Statement_ReturnQuery ann_ sel_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _selOscope :: Scope
              _selIannotatedTree :: SelectExpression
              _annotatedTree =
                  ReturnQuery ann_ _selIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _selOscope =
                  _lhsIscope
              ( _selIannotatedTree) =
                  (sel_ _selOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_SelectStatement :: Annotation ->
                                 T_SelectExpression  ->
                                 T_Statement 
sem_Statement_SelectStatement ann_ ex_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exOscope :: Scope
              _exIannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _tpe =
                  checkTypes [getTypeAnnotation _exIannotatedTree] $ Right $ Pseudo Void
              _statementInfo =
                  SelectInfo $ getTypeAnnotation _exIannotatedTree
              _backTree =
                  SelectStatement ann_ _exIannotatedTree
              _annotatedTree =
                  SelectStatement ann_ _exIannotatedTree
              _exOscope =
                  _lhsIscope
              ( _exIannotatedTree) =
                  (ex_ _exOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Truncate :: Annotation ->
                          T_StringList  ->
                          T_RestartIdentity  ->
                          T_Cascade  ->
                          T_Statement 
sem_Statement_Truncate ann_ tables_ restartIdentity_ cascade_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _tablesOscope :: Scope
              _restartIdentityOscope :: Scope
              _cascadeOscope :: Scope
              _tablesIannotatedTree :: StringList
              _tablesIstrings :: ([String])
              _restartIdentityIannotatedTree :: RestartIdentity
              _cascadeIannotatedTree :: Cascade
              _annotatedTree =
                  Truncate ann_ _tablesIannotatedTree _restartIdentityIannotatedTree _cascadeIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _tablesOscope =
                  _lhsIscope
              _restartIdentityOscope =
                  _lhsIscope
              _cascadeOscope =
                  _lhsIscope
              ( _tablesIannotatedTree,_tablesIstrings) =
                  (tables_ _tablesOscope )
              ( _restartIdentityIannotatedTree) =
                  (restartIdentity_ _restartIdentityOscope )
              ( _cascadeIannotatedTree) =
                  (cascade_ _cascadeOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_Update :: Annotation ->
                        String ->
                        T_SetClauseList  ->
                        T_Where  ->
                        (Maybe SelectList) ->
                        T_Statement 
sem_Statement_Update ann_ table_ assigns_ whr_ returning_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _assignsOscope :: Scope
              _whrOscope :: Scope
              _assignsIannotatedTree :: SetClauseList
              _assignsIpairs :: ([(String,Type)])
              _assignsIrowSetErrors :: ([TypeError])
              _whrIannotatedTree :: Where
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    $ Just $ StatementInfoA _statementInfo
              _tpe =
                  do
                  let re = checkRelationExists _lhsIscope table_
                  when (isJust re) $
                       Left [fromJust $ re]
                  whereType <- checkExpressionBool _whrIannotatedTree
                  chainTypeCheckFailed (whereType:map snd _assignsIpairs) $ do
                    _columnsConsistent
                    checkErrorList _assignsIrowSetErrors $ Pseudo Void
              _columnsConsistent =
                  checkColumnConsistency _lhsIscope table_ (map fst _assignsIpairs) _assignsIpairs
              _statementInfo =
                  UpdateInfo table_ $ flip errorToTypeFailF _columnsConsistent     $
                                           \c -> let colNames = map fst _assignsIpairs
                                                 in UnnamedCompositeType $ map (\t -> (t,getType c t)) colNames
                  where
                    getType cols t = fromJust $ lookup t cols
              _backTree =
                  Update ann_ table_ _assignsIannotatedTree _whrIannotatedTree returning_
              _annotatedTree =
                  Update ann_ table_ _assignsIannotatedTree _whrIannotatedTree returning_
              _assignsOscope =
                  _lhsIscope
              _whrOscope =
                  _lhsIscope
              ( _assignsIannotatedTree,_assignsIpairs,_assignsIrowSetErrors) =
                  (assigns_ _assignsOscope )
              ( _whrIannotatedTree) =
                  (whr_ _whrOscope )
          in  ( _lhsOannotatedTree)))
sem_Statement_WhileStatement :: Annotation ->
                                T_Expression  ->
                                T_StatementList  ->
                                T_Statement 
sem_Statement_WhileStatement ann_ expr_ sts_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Statement
              _exprOscope :: Scope
              _stsOscope :: Scope
              _exprIannotatedTree :: Expression
              _exprIliftedColumnName :: String
              _stsIannotatedTree :: StatementList
              _annotatedTree =
                  WhileStatement ann_ _exprIannotatedTree _stsIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _exprOscope =
                  _lhsIscope
              _stsOscope =
                  _lhsIscope
              ( _exprIannotatedTree,_exprIliftedColumnName) =
                  (expr_ _exprOscope )
              ( _stsIannotatedTree) =
                  (sts_ _stsOscope )
          in  ( _lhsOannotatedTree)))
-- StatementList -----------------------------------------------
type StatementList  = [(Statement)]
-- cata
sem_StatementList :: StatementList  ->
                     T_StatementList 
sem_StatementList list  =
    (Prelude.foldr sem_StatementList_Cons sem_StatementList_Nil (Prelude.map sem_Statement list) )
-- semantic domain
type T_StatementList  = Scope ->
                        ( StatementList)
data Inh_StatementList  = Inh_StatementList {scope_Inh_StatementList :: Scope}
data Syn_StatementList  = Syn_StatementList {annotatedTree_Syn_StatementList :: StatementList}
wrap_StatementList :: T_StatementList  ->
                      Inh_StatementList  ->
                      Syn_StatementList 
wrap_StatementList sem (Inh_StatementList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_StatementList _lhsOannotatedTree ))
sem_StatementList_Cons :: T_Statement  ->
                          T_StatementList  ->
                          T_StatementList 
sem_StatementList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: StatementList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: Statement
              _tlIannotatedTree :: StatementList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_StatementList_Nil :: T_StatementList 
sem_StatementList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: StatementList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- StringList --------------------------------------------------
type StringList  = [(String)]
-- cata
sem_StringList :: StringList  ->
                  T_StringList 
sem_StringList list  =
    (Prelude.foldr sem_StringList_Cons sem_StringList_Nil list )
-- semantic domain
type T_StringList  = Scope ->
                     ( StringList,([String]))
data Inh_StringList  = Inh_StringList {scope_Inh_StringList :: Scope}
data Syn_StringList  = Syn_StringList {annotatedTree_Syn_StringList :: StringList,strings_Syn_StringList :: [String]}
wrap_StringList :: T_StringList  ->
                   Inh_StringList  ->
                   Syn_StringList 
wrap_StringList sem (Inh_StringList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOstrings) =
             (sem _lhsIscope )
     in  (Syn_StringList _lhsOannotatedTree _lhsOstrings ))
sem_StringList_Cons :: String ->
                       T_StringList  ->
                       T_StringList 
sem_StringList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOstrings :: ([String])
              _lhsOannotatedTree :: StringList
              _tlOscope :: Scope
              _tlIannotatedTree :: StringList
              _tlIstrings :: ([String])
              _lhsOstrings =
                  hd_ : _tlIstrings
              _annotatedTree =
                  (:) hd_ _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _tlOscope =
                  _lhsIscope
              ( _tlIannotatedTree,_tlIstrings) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOstrings)))
sem_StringList_Nil :: T_StringList 
sem_StringList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOstrings :: ([String])
              _lhsOannotatedTree :: StringList
              _lhsOstrings =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOstrings)))
-- StringStringListPair ----------------------------------------
type StringStringListPair  = ( (String),(StringList))
-- cata
sem_StringStringListPair :: StringStringListPair  ->
                            T_StringStringListPair 
sem_StringStringListPair ( x1,x2)  =
    (sem_StringStringListPair_Tuple x1 (sem_StringList x2 ) )
-- semantic domain
type T_StringStringListPair  = Scope ->
                               ( StringStringListPair)
data Inh_StringStringListPair  = Inh_StringStringListPair {scope_Inh_StringStringListPair :: Scope}
data Syn_StringStringListPair  = Syn_StringStringListPair {annotatedTree_Syn_StringStringListPair :: StringStringListPair}
wrap_StringStringListPair :: T_StringStringListPair  ->
                             Inh_StringStringListPair  ->
                             Syn_StringStringListPair 
wrap_StringStringListPair sem (Inh_StringStringListPair _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_StringStringListPair _lhsOannotatedTree ))
sem_StringStringListPair_Tuple :: String ->
                                  T_StringList  ->
                                  T_StringStringListPair 
sem_StringStringListPair_Tuple x1_ x2_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: StringStringListPair
              _x2Oscope :: Scope
              _x2IannotatedTree :: StringList
              _x2Istrings :: ([String])
              _annotatedTree =
                  (x1_,_x2IannotatedTree)
              _lhsOannotatedTree =
                  _annotatedTree
              _x2Oscope =
                  _lhsIscope
              ( _x2IannotatedTree,_x2Istrings) =
                  (x2_ _x2Oscope )
          in  ( _lhsOannotatedTree)))
-- StringStringListPairList ------------------------------------
type StringStringListPairList  = [(StringStringListPair)]
-- cata
sem_StringStringListPairList :: StringStringListPairList  ->
                                T_StringStringListPairList 
sem_StringStringListPairList list  =
    (Prelude.foldr sem_StringStringListPairList_Cons sem_StringStringListPairList_Nil (Prelude.map sem_StringStringListPair list) )
-- semantic domain
type T_StringStringListPairList  = Scope ->
                                   ( StringStringListPairList)
data Inh_StringStringListPairList  = Inh_StringStringListPairList {scope_Inh_StringStringListPairList :: Scope}
data Syn_StringStringListPairList  = Syn_StringStringListPairList {annotatedTree_Syn_StringStringListPairList :: StringStringListPairList}
wrap_StringStringListPairList :: T_StringStringListPairList  ->
                                 Inh_StringStringListPairList  ->
                                 Syn_StringStringListPairList 
wrap_StringStringListPairList sem (Inh_StringStringListPairList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_StringStringListPairList _lhsOannotatedTree ))
sem_StringStringListPairList_Cons :: T_StringStringListPair  ->
                                     T_StringStringListPairList  ->
                                     T_StringStringListPairList 
sem_StringStringListPairList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: StringStringListPairList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: StringStringListPair
              _tlIannotatedTree :: StringStringListPairList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_StringStringListPairList_Nil :: T_StringStringListPairList 
sem_StringStringListPairList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: StringStringListPairList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- TableRef ----------------------------------------------------
data TableRef  = JoinedTref (Annotation) (TableRef) (Natural) (JoinType) (TableRef) (OnExpr) 
               | SubTref (Annotation) (SelectExpression) (String) 
               | Tref (Annotation) (String) 
               | TrefAlias (Annotation) (String) (String) 
               | TrefFun (Annotation) (Expression) 
               | TrefFunAlias (Annotation) (Expression) (String) 
               deriving ( Eq,Show)
-- cata
sem_TableRef :: TableRef  ->
                T_TableRef 
sem_TableRef (JoinedTref _ann _tbl _nat _joinType _tbl1 _onExpr )  =
    (sem_TableRef_JoinedTref _ann (sem_TableRef _tbl ) (sem_Natural _nat ) (sem_JoinType _joinType ) (sem_TableRef _tbl1 ) (sem_OnExpr _onExpr ) )
sem_TableRef (SubTref _ann _sel _alias )  =
    (sem_TableRef_SubTref _ann (sem_SelectExpression _sel ) _alias )
sem_TableRef (Tref _ann _tbl )  =
    (sem_TableRef_Tref _ann _tbl )
sem_TableRef (TrefAlias _ann _tbl _alias )  =
    (sem_TableRef_TrefAlias _ann _tbl _alias )
sem_TableRef (TrefFun _ann _fn )  =
    (sem_TableRef_TrefFun _ann (sem_Expression _fn ) )
sem_TableRef (TrefFunAlias _ann _fn _alias )  =
    (sem_TableRef_TrefFunAlias _ann (sem_Expression _fn ) _alias )
-- semantic domain
type T_TableRef  = Scope ->
                   ( TableRef,([QualifiedScope]),([String]))
data Inh_TableRef  = Inh_TableRef {scope_Inh_TableRef :: Scope}
data Syn_TableRef  = Syn_TableRef {annotatedTree_Syn_TableRef :: TableRef,idens_Syn_TableRef :: [QualifiedScope],joinIdens_Syn_TableRef :: [String]}
wrap_TableRef :: T_TableRef  ->
                 Inh_TableRef  ->
                 Syn_TableRef 
wrap_TableRef sem (Inh_TableRef _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens) =
             (sem _lhsIscope )
     in  (Syn_TableRef _lhsOannotatedTree _lhsOidens _lhsOjoinIdens ))
sem_TableRef_JoinedTref :: Annotation ->
                           T_TableRef  ->
                           T_Natural  ->
                           T_JoinType  ->
                           T_TableRef  ->
                           T_OnExpr  ->
                           T_TableRef 
sem_TableRef_JoinedTref ann_ tbl_ nat_ joinType_ tbl1_ onExpr_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: TableRef
              _lhsOidens :: ([QualifiedScope])
              _lhsOjoinIdens :: ([String])
              _tblOscope :: Scope
              _natOscope :: Scope
              _joinTypeOscope :: Scope
              _tbl1Oscope :: Scope
              _onExprOscope :: Scope
              _tblIannotatedTree :: TableRef
              _tblIidens :: ([QualifiedScope])
              _tblIjoinIdens :: ([String])
              _natIannotatedTree :: Natural
              _joinTypeIannotatedTree :: JoinType
              _tbl1IannotatedTree :: TableRef
              _tbl1Iidens :: ([QualifiedScope])
              _tbl1IjoinIdens :: ([String])
              _onExprIannotatedTree :: OnExpr
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  checkTypes [tblt
                            ,tbl1t] $
                     case (_natIannotatedTree, _onExprIannotatedTree) of
                            (Natural, _) -> unionJoinList $
                                            commonFieldNames tblt tbl1t
                            (_,Just (JoinUsing s)) -> unionJoinList s
                            _ -> unionJoinList []
                  where
                    tblt = getTypeAnnotation _tblIannotatedTree
                    tbl1t = getTypeAnnotation _tbl1IannotatedTree
                    unionJoinList s =
                        combineTableTypesWithUsingList _lhsIscope s tblt tbl1t
              _lhsOidens =
                  _tblIidens ++ _tbl1Iidens
              _lhsOjoinIdens =
                  commonFieldNames (getTypeAnnotation _tblIannotatedTree)
                                   (getTypeAnnotation _tbl1IannotatedTree)
              _backTree =
                  JoinedTref ann_
                             _tblIannotatedTree
                             _natIannotatedTree
                             _joinTypeIannotatedTree
                             _tbl1IannotatedTree
                             _onExprIannotatedTree
              _annotatedTree =
                  JoinedTref ann_ _tblIannotatedTree _natIannotatedTree _joinTypeIannotatedTree _tbl1IannotatedTree _onExprIannotatedTree
              _tblOscope =
                  _lhsIscope
              _natOscope =
                  _lhsIscope
              _joinTypeOscope =
                  _lhsIscope
              _tbl1Oscope =
                  _lhsIscope
              _onExprOscope =
                  _lhsIscope
              ( _tblIannotatedTree,_tblIidens,_tblIjoinIdens) =
                  (tbl_ _tblOscope )
              ( _natIannotatedTree) =
                  (nat_ _natOscope )
              ( _joinTypeIannotatedTree) =
                  (joinType_ _joinTypeOscope )
              ( _tbl1IannotatedTree,_tbl1Iidens,_tbl1IjoinIdens) =
                  (tbl1_ _tbl1Oscope )
              ( _onExprIannotatedTree) =
                  (onExpr_ _onExprOscope )
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
sem_TableRef_SubTref :: Annotation ->
                        T_SelectExpression  ->
                        String ->
                        T_TableRef 
sem_TableRef_SubTref ann_ sel_ alias_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: TableRef
              _lhsOidens :: ([QualifiedScope])
              _lhsOjoinIdens :: ([String])
              _selOscope :: Scope
              _selIannotatedTree :: SelectExpression
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  checkTypes [getTypeAnnotation _selIannotatedTree] $
                  Right $ unwrapSetOfComposite $ getTypeAnnotation _selIannotatedTree
              _backTree =
                  SubTref ann_ _selIannotatedTree alias_
              _lhsOidens =
                  [(alias_, (getTbCols _selIannotatedTree, []))]
              _lhsOjoinIdens =
                  []
              _annotatedTree =
                  SubTref ann_ _selIannotatedTree alias_
              _selOscope =
                  _lhsIscope
              ( _selIannotatedTree) =
                  (sel_ _selOscope )
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
sem_TableRef_Tref :: Annotation ->
                     String ->
                     T_TableRef 
sem_TableRef_Tref ann_ tbl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: TableRef
              _lhsOjoinIdens :: ([String])
              _lhsOidens :: ([QualifiedScope])
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  either Left (Right . fst) _relType
              _lhsOjoinIdens =
                  []
              _relType =
                  getRelationType _lhsIscope tbl_
              _unwrappedRelType =
                  either (const ([], [])) (both unwrapComposite) _relType
              _lhsOidens =
                  [(tbl_, _unwrappedRelType    )]
              _backTree =
                  Tref ann_ tbl_
              _annotatedTree =
                  Tref ann_ tbl_
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
sem_TableRef_TrefAlias :: Annotation ->
                          String ->
                          String ->
                          T_TableRef 
sem_TableRef_TrefAlias ann_ tbl_ alias_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: TableRef
              _lhsOjoinIdens :: ([String])
              _lhsOidens :: ([QualifiedScope])
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  either Left (Right . fst) _relType
              _lhsOjoinIdens =
                  []
              _relType =
                  getRelationType _lhsIscope tbl_
              _unwrappedRelType =
                  either (const ([], [])) (both unwrapComposite) _relType
              _lhsOidens =
                  [(alias_, _unwrappedRelType    )]
              _backTree =
                  TrefAlias ann_ tbl_ alias_
              _annotatedTree =
                  TrefAlias ann_ tbl_ alias_
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
sem_TableRef_TrefFun :: Annotation ->
                        T_Expression  ->
                        T_TableRef 
sem_TableRef_TrefFun ann_ fn_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: TableRef
              _lhsOjoinIdens :: ([String])
              _lhsOidens :: ([QualifiedScope])
              _fnOscope :: Scope
              _fnIannotatedTree :: Expression
              _fnIliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  getFnType _lhsIscope _alias _fnIannotatedTree
              _lhsOjoinIdens =
                  []
              _lhsOidens =
                  case getFunIdens
                            _lhsIscope _alias
                            _fnIannotatedTree of
                    Left e -> []
                    Right x -> [second (\l -> (unwrapComposite l, [])) x]
              _alias =
                  ""
              _backTree =
                  TrefFun ann_ _fnIannotatedTree
              _annotatedTree =
                  TrefFun ann_ _fnIannotatedTree
              _fnOscope =
                  _lhsIscope
              ( _fnIannotatedTree,_fnIliftedColumnName) =
                  (fn_ _fnOscope )
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
sem_TableRef_TrefFunAlias :: Annotation ->
                             T_Expression  ->
                             String ->
                             T_TableRef 
sem_TableRef_TrefFunAlias ann_ fn_ alias_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: TableRef
              _lhsOjoinIdens :: ([String])
              _lhsOidens :: ([QualifiedScope])
              _fnOscope :: Scope
              _fnIannotatedTree :: Expression
              _fnIliftedColumnName :: String
              _lhsOannotatedTree =
                  annTypesAndErrors _backTree
                    (errorToTypeFail _tpe    )
                    (getErrors _tpe    )
                    Nothing
              _tpe =
                  getFnType _lhsIscope alias_ _fnIannotatedTree
              _lhsOjoinIdens =
                  []
              _lhsOidens =
                  case getFunIdens
                            _lhsIscope _alias
                            _fnIannotatedTree of
                    Left e -> []
                    Right x -> [second (\l -> (unwrapComposite l, [])) x]
              _alias =
                  alias_
              _backTree =
                  TrefFunAlias ann_ _fnIannotatedTree alias_
              _annotatedTree =
                  TrefFunAlias ann_ _fnIannotatedTree _alias
              _fnOscope =
                  _lhsIscope
              ( _fnIannotatedTree,_fnIliftedColumnName) =
                  (fn_ _fnOscope )
          in  ( _lhsOannotatedTree,_lhsOidens,_lhsOjoinIdens)))
-- TypeAttributeDef --------------------------------------------
data TypeAttributeDef  = TypeAttDef (String) (TypeName) 
                       deriving ( Eq,Show)
-- cata
sem_TypeAttributeDef :: TypeAttributeDef  ->
                        T_TypeAttributeDef 
sem_TypeAttributeDef (TypeAttDef _name _typ )  =
    (sem_TypeAttributeDef_TypeAttDef _name (sem_TypeName _typ ) )
-- semantic domain
type T_TypeAttributeDef  = Scope ->
                           ( TypeAttributeDef,String,(Either [TypeError] Type))
data Inh_TypeAttributeDef  = Inh_TypeAttributeDef {scope_Inh_TypeAttributeDef :: Scope}
data Syn_TypeAttributeDef  = Syn_TypeAttributeDef {annotatedTree_Syn_TypeAttributeDef :: TypeAttributeDef,attrName_Syn_TypeAttributeDef :: String,namedType_Syn_TypeAttributeDef :: Either [TypeError] Type}
wrap_TypeAttributeDef :: T_TypeAttributeDef  ->
                         Inh_TypeAttributeDef  ->
                         Syn_TypeAttributeDef 
wrap_TypeAttributeDef sem (Inh_TypeAttributeDef _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOattrName,_lhsOnamedType) =
             (sem _lhsIscope )
     in  (Syn_TypeAttributeDef _lhsOannotatedTree _lhsOattrName _lhsOnamedType ))
sem_TypeAttributeDef_TypeAttDef :: String ->
                                   T_TypeName  ->
                                   T_TypeAttributeDef 
sem_TypeAttributeDef_TypeAttDef name_ typ_  =
    (\ _lhsIscope ->
         (let _lhsOattrName :: String
              _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: TypeAttributeDef
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _lhsOattrName =
                  name_
              _lhsOnamedType =
                  _typInamedType
              _annotatedTree =
                  TypeAttDef name_ _typIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree,_lhsOattrName,_lhsOnamedType)))
-- TypeAttributeDefList ----------------------------------------
type TypeAttributeDefList  = [(TypeAttributeDef)]
-- cata
sem_TypeAttributeDefList :: TypeAttributeDefList  ->
                            T_TypeAttributeDefList 
sem_TypeAttributeDefList list  =
    (Prelude.foldr sem_TypeAttributeDefList_Cons sem_TypeAttributeDefList_Nil (Prelude.map sem_TypeAttributeDef list) )
-- semantic domain
type T_TypeAttributeDefList  = Scope ->
                               ( TypeAttributeDefList,([(String, Either [TypeError] Type)]))
data Inh_TypeAttributeDefList  = Inh_TypeAttributeDefList {scope_Inh_TypeAttributeDefList :: Scope}
data Syn_TypeAttributeDefList  = Syn_TypeAttributeDefList {annotatedTree_Syn_TypeAttributeDefList :: TypeAttributeDefList,attrs_Syn_TypeAttributeDefList :: [(String, Either [TypeError] Type)]}
wrap_TypeAttributeDefList :: T_TypeAttributeDefList  ->
                             Inh_TypeAttributeDefList  ->
                             Syn_TypeAttributeDefList 
wrap_TypeAttributeDefList sem (Inh_TypeAttributeDefList _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOattrs) =
             (sem _lhsIscope )
     in  (Syn_TypeAttributeDefList _lhsOannotatedTree _lhsOattrs ))
sem_TypeAttributeDefList_Cons :: T_TypeAttributeDef  ->
                                 T_TypeAttributeDefList  ->
                                 T_TypeAttributeDefList 
sem_TypeAttributeDefList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOattrs :: ([(String, Either [TypeError] Type)])
              _lhsOannotatedTree :: TypeAttributeDefList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: TypeAttributeDef
              _hdIattrName :: String
              _hdInamedType :: (Either [TypeError] Type)
              _tlIannotatedTree :: TypeAttributeDefList
              _tlIattrs :: ([(String, Either [TypeError] Type)])
              _lhsOattrs =
                  (_hdIattrName, _hdInamedType) : _tlIattrs
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree,_hdIattrName,_hdInamedType) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree,_tlIattrs) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree,_lhsOattrs)))
sem_TypeAttributeDefList_Nil :: T_TypeAttributeDefList 
sem_TypeAttributeDefList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOattrs :: ([(String, Either [TypeError] Type)])
              _lhsOannotatedTree :: TypeAttributeDefList
              _lhsOattrs =
                  []
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree,_lhsOattrs)))
-- TypeName ----------------------------------------------------
data TypeName  = ArrayTypeName (TypeName) 
               | PrecTypeName (String) (Integer) 
               | SetOfTypeName (TypeName) 
               | SimpleTypeName (String) 
               deriving ( Eq,Show)
-- cata
sem_TypeName :: TypeName  ->
                T_TypeName 
sem_TypeName (ArrayTypeName _typ )  =
    (sem_TypeName_ArrayTypeName (sem_TypeName _typ ) )
sem_TypeName (PrecTypeName _tn _prec )  =
    (sem_TypeName_PrecTypeName _tn _prec )
sem_TypeName (SetOfTypeName _typ )  =
    (sem_TypeName_SetOfTypeName (sem_TypeName _typ ) )
sem_TypeName (SimpleTypeName _tn )  =
    (sem_TypeName_SimpleTypeName _tn )
-- semantic domain
type T_TypeName  = Scope ->
                   ( TypeName,(Either [TypeError] Type))
data Inh_TypeName  = Inh_TypeName {scope_Inh_TypeName :: Scope}
data Syn_TypeName  = Syn_TypeName {annotatedTree_Syn_TypeName :: TypeName,namedType_Syn_TypeName :: Either [TypeError] Type}
wrap_TypeName :: T_TypeName  ->
                 Inh_TypeName  ->
                 Syn_TypeName 
wrap_TypeName sem (Inh_TypeName _lhsIscope )  =
    (let ( _lhsOannotatedTree,_lhsOnamedType) =
             (sem _lhsIscope )
     in  (Syn_TypeName _lhsOannotatedTree _lhsOnamedType ))
sem_TypeName_ArrayTypeName :: T_TypeName  ->
                              T_TypeName 
sem_TypeName_ArrayTypeName typ_  =
    (\ _lhsIscope ->
         (let _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: TypeName
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _lhsOnamedType =
                  ArrayType <$> _typInamedType
              _lhsOannotatedTree =
                  ArrayTypeName _typIannotatedTree
              _annotatedTree =
                  ArrayTypeName _typIannotatedTree
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree,_lhsOnamedType)))
sem_TypeName_PrecTypeName :: String ->
                             Integer ->
                             T_TypeName 
sem_TypeName_PrecTypeName tn_ prec_  =
    (\ _lhsIscope ->
         (let _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: TypeName
              _lhsOnamedType =
                  Right TypeCheckFailed
              _lhsOannotatedTree =
                  PrecTypeName tn_ prec_
              _annotatedTree =
                  PrecTypeName tn_ prec_
          in  ( _lhsOannotatedTree,_lhsOnamedType)))
sem_TypeName_SetOfTypeName :: T_TypeName  ->
                              T_TypeName 
sem_TypeName_SetOfTypeName typ_  =
    (\ _lhsIscope ->
         (let _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: TypeName
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _lhsOnamedType =
                  SetOfType <$> _typInamedType
              _lhsOannotatedTree =
                  SetOfTypeName _typIannotatedTree
              _annotatedTree =
                  SetOfTypeName _typIannotatedTree
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree,_lhsOnamedType)))
sem_TypeName_SimpleTypeName :: String ->
                               T_TypeName 
sem_TypeName_SimpleTypeName tn_  =
    (\ _lhsIscope ->
         (let _lhsOnamedType :: (Either [TypeError] Type)
              _lhsOannotatedTree :: TypeName
              _lhsOnamedType =
                  lookupTypeByName _lhsIscope $ canonicalizeTypeName tn_
              _lhsOannotatedTree =
                  SimpleTypeName tn_
              _annotatedTree =
                  SimpleTypeName tn_
          in  ( _lhsOannotatedTree,_lhsOnamedType)))
-- VarDef ------------------------------------------------------
data VarDef  = VarDef (String) (TypeName) (Maybe Expression) 
             deriving ( Eq,Show)
-- cata
sem_VarDef :: VarDef  ->
              T_VarDef 
sem_VarDef (VarDef _name _typ _value )  =
    (sem_VarDef_VarDef _name (sem_TypeName _typ ) _value )
-- semantic domain
type T_VarDef  = Scope ->
                 ( VarDef)
data Inh_VarDef  = Inh_VarDef {scope_Inh_VarDef :: Scope}
data Syn_VarDef  = Syn_VarDef {annotatedTree_Syn_VarDef :: VarDef}
wrap_VarDef :: T_VarDef  ->
               Inh_VarDef  ->
               Syn_VarDef 
wrap_VarDef sem (Inh_VarDef _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_VarDef _lhsOannotatedTree ))
sem_VarDef_VarDef :: String ->
                     T_TypeName  ->
                     (Maybe Expression) ->
                     T_VarDef 
sem_VarDef_VarDef name_ typ_ value_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: VarDef
              _typOscope :: Scope
              _typIannotatedTree :: TypeName
              _typInamedType :: (Either [TypeError] Type)
              _annotatedTree =
                  VarDef name_ _typIannotatedTree value_
              _lhsOannotatedTree =
                  _annotatedTree
              _typOscope =
                  _lhsIscope
              ( _typIannotatedTree,_typInamedType) =
                  (typ_ _typOscope )
          in  ( _lhsOannotatedTree)))
-- VarDefList --------------------------------------------------
type VarDefList  = [(VarDef)]
-- cata
sem_VarDefList :: VarDefList  ->
                  T_VarDefList 
sem_VarDefList list  =
    (Prelude.foldr sem_VarDefList_Cons sem_VarDefList_Nil (Prelude.map sem_VarDef list) )
-- semantic domain
type T_VarDefList  = Scope ->
                     ( VarDefList)
data Inh_VarDefList  = Inh_VarDefList {scope_Inh_VarDefList :: Scope}
data Syn_VarDefList  = Syn_VarDefList {annotatedTree_Syn_VarDefList :: VarDefList}
wrap_VarDefList :: T_VarDefList  ->
                   Inh_VarDefList  ->
                   Syn_VarDefList 
wrap_VarDefList sem (Inh_VarDefList _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_VarDefList _lhsOannotatedTree ))
sem_VarDefList_Cons :: T_VarDef  ->
                       T_VarDefList  ->
                       T_VarDefList 
sem_VarDefList_Cons hd_ tl_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: VarDefList
              _hdOscope :: Scope
              _tlOscope :: Scope
              _hdIannotatedTree :: VarDef
              _tlIannotatedTree :: VarDefList
              _annotatedTree =
                  (:) _hdIannotatedTree _tlIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _hdOscope =
                  _lhsIscope
              _tlOscope =
                  _lhsIscope
              ( _hdIannotatedTree) =
                  (hd_ _hdOscope )
              ( _tlIannotatedTree) =
                  (tl_ _tlOscope )
          in  ( _lhsOannotatedTree)))
sem_VarDefList_Nil :: T_VarDefList 
sem_VarDefList_Nil  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: VarDefList
              _annotatedTree =
                  []
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Volatility --------------------------------------------------
data Volatility  = Immutable 
                 | Stable 
                 | Volatile 
                 deriving ( Eq,Show)
-- cata
sem_Volatility :: Volatility  ->
                  T_Volatility 
sem_Volatility (Immutable )  =
    (sem_Volatility_Immutable )
sem_Volatility (Stable )  =
    (sem_Volatility_Stable )
sem_Volatility (Volatile )  =
    (sem_Volatility_Volatile )
-- semantic domain
type T_Volatility  = Scope ->
                     ( Volatility)
data Inh_Volatility  = Inh_Volatility {scope_Inh_Volatility :: Scope}
data Syn_Volatility  = Syn_Volatility {annotatedTree_Syn_Volatility :: Volatility}
wrap_Volatility :: T_Volatility  ->
                   Inh_Volatility  ->
                   Syn_Volatility 
wrap_Volatility sem (Inh_Volatility _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Volatility _lhsOannotatedTree ))
sem_Volatility_Immutable :: T_Volatility 
sem_Volatility_Immutable  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Volatility
              _annotatedTree =
                  Immutable
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Volatility_Stable :: T_Volatility 
sem_Volatility_Stable  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Volatility
              _annotatedTree =
                  Stable
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
sem_Volatility_Volatile :: T_Volatility 
sem_Volatility_Volatile  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Volatility
              _annotatedTree =
                  Volatile
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))
-- Where -------------------------------------------------------
type Where  = (Maybe (Expression))
-- cata
sem_Where :: Where  ->
             T_Where 
sem_Where (Prelude.Just x )  =
    (sem_Where_Just (sem_Expression x ) )
sem_Where Prelude.Nothing  =
    sem_Where_Nothing
-- semantic domain
type T_Where  = Scope ->
                ( Where)
data Inh_Where  = Inh_Where {scope_Inh_Where :: Scope}
data Syn_Where  = Syn_Where {annotatedTree_Syn_Where :: Where}
wrap_Where :: T_Where  ->
              Inh_Where  ->
              Syn_Where 
wrap_Where sem (Inh_Where _lhsIscope )  =
    (let ( _lhsOannotatedTree) =
             (sem _lhsIscope )
     in  (Syn_Where _lhsOannotatedTree ))
sem_Where_Just :: T_Expression  ->
                  T_Where 
sem_Where_Just just_  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Where
              _justOscope :: Scope
              _justIannotatedTree :: Expression
              _justIliftedColumnName :: String
              _annotatedTree =
                  Just _justIannotatedTree
              _lhsOannotatedTree =
                  _annotatedTree
              _justOscope =
                  _lhsIscope
              ( _justIannotatedTree,_justIliftedColumnName) =
                  (just_ _justOscope )
          in  ( _lhsOannotatedTree)))
sem_Where_Nothing :: T_Where 
sem_Where_Nothing  =
    (\ _lhsIscope ->
         (let _lhsOannotatedTree :: Where
              _annotatedTree =
                  Nothing
              _lhsOannotatedTree =
                  _annotatedTree
          in  ( _lhsOannotatedTree)))