> {-# LANGUAGE OverloadedStrings #-} > module Database.HsSqlPpp.Dialects.Ansi (ansiDialect) where > import Database.HsSqlPpp.Internals.Dialect > import Database.HsSqlPpp.Internals.Catalog.CatalogBuilder > import Database.HsSqlPpp.Internals.Catalog.CatalogTypes > import Database.HsSqlPpp.Dialects.BaseCatalog > ansiDialect :: Dialect > ansiDialect = Dialect > {diName = "ansi" > ,diSyntaxFlavour = Ansi > ,diCanonicalTypeNames = [("char",["character"]) > ,("varchar",["char varying","character varying"]) > ,("clob",["character large object","char large object"]) > ,("nchar",["national character","national char"]) > ,("nvarchar",["national character varying" > ,"national char varying" > ,"nchar varying"]) > ,("nclob",["national character large object" > ,"nchar large object"]) > -- todo: this list isn't complete > ,("varbinary",["binary varying"]) > ,("blob",["binary large object"]) > ,("int",["integer"]) > ,("float",["double precision"]) > ] > ,diTextTypes = ["char","varchar","clob","nchar","nvarchar","nclob"] > ,diDatetimeTypes = ["date","time","timestamp","interval"] > ,diNumberTypes = ["smallint","int","bigint","decimal","numeric","float","real"] > ,namesForAnsiTypes = [("char","char") > ,("varchar","varchar") > ,("bigint","bigint") > ,("boolean","boolean") > ,("numeric","numeric") > ,("int","int") > ,("date","date") > ,("time","time") > ,("timestamp","timestamp") > ] -- todo: finish this > ,diDefaultCatalog = ansiCatalog > } > ansiCatalog :: Catalog > ansiCatalog = > (\l -> case l of > Left x -> error $ show x -- todo: what is the best way to handle this? > Right e -> e) $ > flip updateCatalog emptyCatalog ( > -- todo: duplicated list of text types > [CatCreateScalarType "char" > ,CatCreateScalarType "varchar" > ,CatCreateScalarType "clob" > ,CatCreateScalarType "nchar" > ,CatCreateScalarType "nvarchar" > ,CatCreateScalarType "nclob" > ,CatCreateScalarType "binary" > ,CatCreateScalarType "varbinary" > ,CatCreateScalarType "blob" > ,CatCreateScalarType "numeric" > ,CatCreateScalarType "decimal" > ,CatCreateScalarType "smallint" > ,CatCreateScalarType "int" > ,CatCreateScalarType "bigint" > ,CatCreateScalarType "float" > ,CatCreateScalarType "real" > ,CatCreateScalarType "boolean" > ,CatCreateScalarType "date" > ,CatCreateScalarType "time" > ,CatCreateScalarType "timestamp" > ,CatCreateScalarType "interval" > ] what to do about these? position char_length extract substring convert translate trim overlay nromalize between in like collate > ++ [CatCreateFunction charLen [t] False "int" > | t <- ["char","varchar","clob" > ,"nchar","nvarchar","nclob"] > , charLen <- ["char_length", "character_length", "octet_length"] ] > ++ concat > -- unary +- all numeric types plus interval > [ [CatCreatePrefixOp "+" n n > ,CatCreatePrefixOp "-" n n] > | n <- ["numeric","decimal","smallint","int","bigint" > ,"float","real","interval"] ] > -- binary + - * / all numeric types > ++ concat > [ [ CatCreateBinaryOp "+" n n n > ,CatCreateBinaryOp "-" n n n > ,CatCreateBinaryOp "*" n n n > ,CatCreateBinaryOp "/" n n n] > | n <- ["numeric","decimal","smallint","int","bigint" > ,"float","real"] ] > -- || concatenation on strings, binaries and arrays > -- not sure how arrays will work right now > ++ [CatCreateBinaryOp "||" s s s > | s <- ["char","varchar","clob" > ,"nchar","nvarchar", "nclob" > ,"binary","varbinary","blob" ] ] > -- comparisons, should some of these be generic? > -- maybe want the option of user defined types > -- not having comparisons? not sure about types without > -- equals makes any sense here > ++ [CatCreateBinaryOp op t t "boolean" > | op <- ["=","<>","<",">","<=",">="] > , t <- ["char","varchar","clob" > ,"nchar","nvarchar","nclob" > ,"binary","varbinary","blob" > ,"numeric","decimal" > ,"smallint","int","bigint" > ,"float","real" > ,"boolean" > ,"date","time","timestamp","interval" > ] ] > > ++ [CatCreateFunction "abs" [t] False t > | t <- ["numeric", "decimal", "smallint", "int", "bigint", "float","real"]] > ++ [CatCreateFunction "mod" [t,t] False t > | t <- ["numeric", "smallint", "int", "bigint"]] > ++ [CatCreateFunction fn [t] False t > | t <- ["float","real"] > , fn <- ["ln","exp","pow","sqrt"] ] > ++ [CatCreateFunction fn [t] False t > | t <- ["float","real","numeric"] > , fn <- ["floor","ceil","ceiling"] ] > ++ [CatCreateFunction "width_bucket" [t,t,t,"numeric"] False "numeric" > | t <- ["char","varchar","clob" > ,"nchar","nvarchar","nclob" > ,"binary","varbinary","blob" > ,"numeric","decimal" > ,"smallint","int","bigint" > ,"float","real" > ,"boolean" > ,"date","time","timestamp","interval" > ] ] > ++ [CatCreateFunction fn [t] False t > | t <- ["char","varchar","clob" > ,"nchar","nvarchar","nclob"] > , fn <- ["lower","upper"] ] > ++ concat > [ [ CatCreateBinaryOp "+" dt "interval" dt > ,CatCreateBinaryOp "+" "interval" dt dt > ,CatCreateBinaryOp "-" dt "interval" dt] > | dt <- ["date","time","timestamp"]] > ++ [CatCreateBinaryOp "+" "interval" "interval" "interval" > ,CatCreateBinaryOp "-" "interval" "interval" "interval"] quick and dirty to get tpch working > ++ > [ CatCreateAggregate "sum" [ "numeric" ] "numeric" > , CatCreateAggregate "sum" [ "smallint" ] "smallint" > --todo: figure out what the options for the types are here > , CatCreateAggregate "sum" [ "int" ] "bigint" > , CatCreateAggregate "sum" [ "bigint" ] "bigint" > , CatCreateAggregate "avg" [ "numeric" ] "numeric" > , CatCreateAggregate "max" [ "numeric" ] "numeric" > , CatCreateAggregate "min" [ "numeric" ] "numeric" > , CatCreateAggregate "count" [ "any" ] "bigint"] > ++ [ > --todo: these are taken from postgres catalog > -- they need careful review to see if they are exactly > -- what we want in the ansi dialect > CatCreateCast "boolean" "int" ExplicitCastContext, > CatCreateCast "boolean" "varchar" AssignmentCastContext, > CatCreateCast "char" "int" ExplicitCastContext, > CatCreateCast "char" "varchar" AssignmentCastContext, > CatCreateCast "date" "timestamp" ImplicitCastContext, > CatCreateCast "real" "float" ImplicitCastContext, > CatCreateCast "real" "smallint" AssignmentCastContext, > CatCreateCast "real" "int" AssignmentCastContext, > CatCreateCast "real" "bigint" AssignmentCastContext, > CatCreateCast "real" "numeric" AssignmentCastContext, > CatCreateCast "float" "real" AssignmentCastContext, > CatCreateCast "float" "smallint" AssignmentCastContext, > CatCreateCast "float" "int" AssignmentCastContext, > CatCreateCast "float" "bigint" AssignmentCastContext, > CatCreateCast "float" "numeric" AssignmentCastContext, > CatCreateCast "smallint" "real" ImplicitCastContext, > CatCreateCast "smallint" "float" ImplicitCastContext, > CatCreateCast "smallint" "int" ImplicitCastContext, > CatCreateCast "smallint" "bigint" ImplicitCastContext, > CatCreateCast "smallint" "numeric" ImplicitCastContext, > CatCreateCast "int" "boolean" ExplicitCastContext, > CatCreateCast "int" "char" ExplicitCastContext, > CatCreateCast "int" "real" ImplicitCastContext, > CatCreateCast "int" "float" ImplicitCastContext, > CatCreateCast "int" "smallint" AssignmentCastContext, > CatCreateCast "int" "bigint" ImplicitCastContext, > CatCreateCast "int" "numeric" ImplicitCastContext, > CatCreateCast "bigint" "real" ImplicitCastContext, > CatCreateCast "bigint" "float" ImplicitCastContext, > CatCreateCast "bigint" "smallint" AssignmentCastContext, > CatCreateCast "bigint" "int" AssignmentCastContext, > CatCreateCast "bigint" "numeric" ImplicitCastContext, > CatCreateCast "interval" "interval" ImplicitCastContext, > CatCreateCast "interval" "time" AssignmentCastContext, > CatCreateCast "numeric" "real" ImplicitCastContext, > CatCreateCast "numeric" "float" ImplicitCastContext, > CatCreateCast "numeric" "smallint" AssignmentCastContext, > CatCreateCast "numeric" "int" AssignmentCastContext, > CatCreateCast "numeric" "bigint" AssignmentCastContext, > CatCreateCast "numeric" "numeric" ImplicitCastContext, > CatCreateCast "time" "interval" ImplicitCastContext, > CatCreateCast "time" "time" ImplicitCastContext, > CatCreateCast "timestamp" "date" AssignmentCastContext, > CatCreateCast "timestamp" "time" AssignmentCastContext, > CatCreateCast "timestamp" "timestamp" ImplicitCastContext, > CatCreateCast "varchar" "char" AssignmentCastContext, > CatCreateCast "varchar" "varchar" ImplicitCastContext, > CatCreateTypeCategoryEntry "boolean" ("B", True), > CatCreateTypeCategoryEntry "char" ("S", False), > CatCreateTypeCategoryEntry "date" ("D", False), > CatCreateTypeCategoryEntry "real" ("N", False), > CatCreateTypeCategoryEntry "float" ("N", True), > CatCreateTypeCategoryEntry "smallint" ("N", False), > CatCreateTypeCategoryEntry "int" ("N", False), > CatCreateTypeCategoryEntry "bigint" ("N", False), > CatCreateTypeCategoryEntry "interval" ("T", True), > CatCreateTypeCategoryEntry "numeric" ("N", False), > CatCreateTypeCategoryEntry "time" ("D", False), > CatCreateTypeCategoryEntry "timestamp" ("D", False), > CatCreateTypeCategoryEntry "varchar" ("S", False)] > ++ baseCatalog "boolean" "int" ["char","varchar","clob","nchar","nvarchar","nclob"] > )