parse functions whose name is a keyword
This commit is contained in:
parent
90e66f4888
commit
c0b4358d89
|
@ -711,6 +711,7 @@ all the value expressions which start with an identifier
|
||||||
> -- todo: work out how to left factor this
|
> -- todo: work out how to left factor this
|
||||||
> try (TypedLit <$> typeName <*> singleQuotesOnlyStringTok)
|
> try (TypedLit <$> typeName <*> singleQuotesOnlyStringTok)
|
||||||
> <|> multisetSetFunction
|
> <|> multisetSetFunction
|
||||||
|
> <|> (try keywordFunction <**> app)
|
||||||
> <|> (names <**> option Iden app)
|
> <|> (names <**> option Iden app)
|
||||||
> where
|
> where
|
||||||
> -- this is a special case because set is a reserved keyword
|
> -- this is a special case because set is a reserved keyword
|
||||||
|
@ -719,6 +720,70 @@ all the value expressions which start with an identifier
|
||||||
> App [Name Nothing "set"] . (:[]) <$>
|
> App [Name Nothing "set"] . (:[]) <$>
|
||||||
> (try (keyword_ "set" *> openParen)
|
> (try (keyword_ "set" *> openParen)
|
||||||
> *> valueExpr <* closeParen)
|
> *> valueExpr <* closeParen)
|
||||||
|
> keywordFunction =
|
||||||
|
> let makeKeywordFunction x = if map toLower x `elem` keywordFunctionNames
|
||||||
|
> then return [Name Nothing x]
|
||||||
|
> else fail ""
|
||||||
|
> in unquotedIdentifierTok [] Nothing >>= makeKeywordFunction
|
||||||
|
> -- todo: this list should be in the dialects
|
||||||
|
> -- we should have tests to check these work
|
||||||
|
> -- we should have tests to check if they are used elsewhere, you
|
||||||
|
> -- get a keyword failure
|
||||||
|
> -- these are the names of functions which are also keywords
|
||||||
|
> -- so this identifier can only be used unquoted for a function application
|
||||||
|
> -- and nowhere else
|
||||||
|
> -- not sure if this list is 100% correct
|
||||||
|
> -- todo: make a corresponding list of reserved keywords which can be
|
||||||
|
> -- parsed as an identifier
|
||||||
|
> keywordFunctionNames = ["abs"
|
||||||
|
> ,"all"
|
||||||
|
> ,"any"
|
||||||
|
> ,"array_agg"
|
||||||
|
> ,"avg"
|
||||||
|
> ,"ceil"
|
||||||
|
> ,"ceiling"
|
||||||
|
> ,"char_length"
|
||||||
|
> ,"character_length"
|
||||||
|
> ,"coalesce"
|
||||||
|
> ,"collect"
|
||||||
|
> ,"contains"
|
||||||
|
> ,"convert"
|
||||||
|
> ,"corr"
|
||||||
|
> ,"covar_pop"
|
||||||
|
> ,"covar_samp"
|
||||||
|
> ,"count"
|
||||||
|
> ,"cume_dist"
|
||||||
|
> ,"grouping"
|
||||||
|
> ,"intersection"
|
||||||
|
> ,"ln"
|
||||||
|
> ,"max"
|
||||||
|
> ,"mod"
|
||||||
|
> ,"percent_rank"
|
||||||
|
> ,"percentile_cont"
|
||||||
|
> ,"percentile_disc"
|
||||||
|
> ,"power"
|
||||||
|
> ,"rank"
|
||||||
|
> ,"regr_avgx"
|
||||||
|
> ,"regr_avgy"
|
||||||
|
> ,"regr_count"
|
||||||
|
> ,"regr_intercept"
|
||||||
|
> ,"regr_r2"
|
||||||
|
> ,"regr_slope"
|
||||||
|
> ,"regr_sxx"
|
||||||
|
> ,"regr_sxy"
|
||||||
|
> ,"regr_syy"
|
||||||
|
> ,"row"
|
||||||
|
> ,"row_number"
|
||||||
|
> ,"some"
|
||||||
|
> ,"stddev_pop"
|
||||||
|
> ,"stddev_samp"
|
||||||
|
> ,"sum"
|
||||||
|
> ,"upper"
|
||||||
|
> ,"var_pop"
|
||||||
|
> ,"var_samp"
|
||||||
|
> ,"width_bucket"
|
||||||
|
> ]
|
||||||
|
|
||||||
|
|
||||||
=== special
|
=== special
|
||||||
|
|
||||||
|
@ -2096,17 +2161,20 @@ The standard has a weird mix of reserved keywords and unreserved
|
||||||
keywords (I'm not sure what exactly being an unreserved keyword
|
keywords (I'm not sure what exactly being an unreserved keyword
|
||||||
means).
|
means).
|
||||||
|
|
||||||
|
can't work out if aggregate functions are supposed to be reserved or
|
||||||
|
not, leave them unreserved for now
|
||||||
|
|
||||||
> reservedWord :: Dialect -> [String]
|
> reservedWord :: Dialect -> [String]
|
||||||
> reservedWord d | diSyntaxFlavour d == ANSI2011 =
|
> reservedWord d | diSyntaxFlavour d == ANSI2011 =
|
||||||
> ["abs"
|
> ["abs"
|
||||||
> --,"all"
|
> ,"all"
|
||||||
> ,"allocate"
|
> ,"allocate"
|
||||||
> ,"alter"
|
> ,"alter"
|
||||||
> ,"and"
|
> ,"and"
|
||||||
> --,"any"
|
> ,"any"
|
||||||
> ,"are"
|
> ,"are"
|
||||||
> ,"array"
|
> ,"array"
|
||||||
> --,"array_agg"
|
> ,"array_agg"
|
||||||
> ,"array_max_cardinality"
|
> ,"array_max_cardinality"
|
||||||
> ,"as"
|
> ,"as"
|
||||||
> ,"asensitive"
|
> ,"asensitive"
|
||||||
|
@ -2114,7 +2182,7 @@ means).
|
||||||
> ,"at"
|
> ,"at"
|
||||||
> ,"atomic"
|
> ,"atomic"
|
||||||
> ,"authorization"
|
> ,"authorization"
|
||||||
> --,"avg"
|
> ,"avg"
|
||||||
> ,"begin"
|
> ,"begin"
|
||||||
> ,"begin_frame"
|
> ,"begin_frame"
|
||||||
> ,"begin_partition"
|
> ,"begin_partition"
|
||||||
|
@ -2142,7 +2210,7 @@ means).
|
||||||
> ,"close"
|
> ,"close"
|
||||||
> ,"coalesce"
|
> ,"coalesce"
|
||||||
> ,"collate"
|
> ,"collate"
|
||||||
> --,"collect"
|
> ,"collect"
|
||||||
> ,"column"
|
> ,"column"
|
||||||
> ,"commit"
|
> ,"commit"
|
||||||
> ,"condition"
|
> ,"condition"
|
||||||
|
@ -2150,15 +2218,15 @@ means).
|
||||||
> ,"constraint"
|
> ,"constraint"
|
||||||
> ,"contains"
|
> ,"contains"
|
||||||
> ,"convert"
|
> ,"convert"
|
||||||
> --,"corr"
|
> ,"corr"
|
||||||
> ,"corresponding"
|
> ,"corresponding"
|
||||||
> --,"count"
|
> ,"count"
|
||||||
> --,"covar_pop"
|
> ,"covar_pop"
|
||||||
> --,"covar_samp"
|
> ,"covar_samp"
|
||||||
> ,"create"
|
> ,"create"
|
||||||
> ,"cross"
|
> ,"cross"
|
||||||
> ,"cube"
|
> ,"cube"
|
||||||
> --,"cume_dist"
|
> ,"cume_dist"
|
||||||
> ,"current"
|
> ,"current"
|
||||||
> ,"current_catalog"
|
> ,"current_catalog"
|
||||||
> --,"current_date"
|
> --,"current_date"
|
||||||
|
@ -2225,7 +2293,7 @@ means).
|
||||||
> ,"global"
|
> ,"global"
|
||||||
> ,"grant"
|
> ,"grant"
|
||||||
> ,"group"
|
> ,"group"
|
||||||
> --,"grouping"
|
> ,"grouping"
|
||||||
> ,"groups"
|
> ,"groups"
|
||||||
> ,"having"
|
> ,"having"
|
||||||
> ,"hold"
|
> ,"hold"
|
||||||
|
@ -2240,7 +2308,7 @@ means).
|
||||||
> ,"int"
|
> ,"int"
|
||||||
> ,"integer"
|
> ,"integer"
|
||||||
> ,"intersect"
|
> ,"intersect"
|
||||||
> --,"intersection"
|
> ,"intersection"
|
||||||
> ,"interval"
|
> ,"interval"
|
||||||
> ,"into"
|
> ,"into"
|
||||||
> ,"is"
|
> ,"is"
|
||||||
|
@ -2261,7 +2329,7 @@ means).
|
||||||
> ,"localtimestamp"
|
> ,"localtimestamp"
|
||||||
> ,"lower"
|
> ,"lower"
|
||||||
> ,"match"
|
> ,"match"
|
||||||
> --,"max"
|
> ,"max"
|
||||||
> ,"member"
|
> ,"member"
|
||||||
> ,"merge"
|
> ,"merge"
|
||||||
> ,"method"
|
> ,"method"
|
||||||
|
@ -2304,9 +2372,9 @@ means).
|
||||||
> ,"parameter"
|
> ,"parameter"
|
||||||
> ,"partition"
|
> ,"partition"
|
||||||
> ,"percent"
|
> ,"percent"
|
||||||
> --,"percent_rank"
|
> ,"percent_rank"
|
||||||
> --,"percentile_cont"
|
> ,"percentile_cont"
|
||||||
> --,"percentile_disc"
|
> ,"percentile_disc"
|
||||||
> ,"period"
|
> ,"period"
|
||||||
> ,"portion"
|
> ,"portion"
|
||||||
> ,"position"
|
> ,"position"
|
||||||
|
@ -2318,22 +2386,22 @@ means).
|
||||||
> ,"primary"
|
> ,"primary"
|
||||||
> ,"procedure"
|
> ,"procedure"
|
||||||
> ,"range"
|
> ,"range"
|
||||||
> --,"rank"
|
> ,"rank"
|
||||||
> ,"reads"
|
> ,"reads"
|
||||||
> ,"real"
|
> ,"real"
|
||||||
> ,"recursive"
|
> ,"recursive"
|
||||||
> ,"ref"
|
> ,"ref"
|
||||||
> ,"references"
|
> ,"references"
|
||||||
> ,"referencing"
|
> ,"referencing"
|
||||||
> --,"regr_avgx"
|
> ,"regr_avgx"
|
||||||
> --,"regr_avgy"
|
> ,"regr_avgy"
|
||||||
> --,"regr_count"
|
> ,"regr_count"
|
||||||
> --,"regr_intercept"
|
> ,"regr_intercept"
|
||||||
> --,"regr_r2"
|
> ,"regr_r2"
|
||||||
> --,"regr_slope"
|
> ,"regr_slope"
|
||||||
> --,"regr_sxx"
|
> ,"regr_sxx"
|
||||||
> --,"regr_sxy"
|
> ,"regr_sxy"
|
||||||
> --,"regr_syy"
|
> ,"regr_syy"
|
||||||
> ,"release"
|
> ,"release"
|
||||||
> ,"result"
|
> ,"result"
|
||||||
> ,"return"
|
> ,"return"
|
||||||
|
@ -2342,7 +2410,7 @@ means).
|
||||||
> ,"right"
|
> ,"right"
|
||||||
> ,"rollback"
|
> ,"rollback"
|
||||||
> ,"rollup"
|
> ,"rollup"
|
||||||
> --,"row"
|
> ,"row"
|
||||||
> ,"row_number"
|
> ,"row_number"
|
||||||
> ,"rows"
|
> ,"rows"
|
||||||
> ,"savepoint"
|
> ,"savepoint"
|
||||||
|
@ -2356,7 +2424,7 @@ means).
|
||||||
> ,"set"
|
> ,"set"
|
||||||
> ,"similar"
|
> ,"similar"
|
||||||
> ,"smallint"
|
> ,"smallint"
|
||||||
> --,"some"
|
> ,"some"
|
||||||
> ,"specific"
|
> ,"specific"
|
||||||
> ,"specifictype"
|
> ,"specifictype"
|
||||||
> ,"sql"
|
> ,"sql"
|
||||||
|
@ -2366,13 +2434,13 @@ means).
|
||||||
> ,"sqrt"
|
> ,"sqrt"
|
||||||
> --,"start"
|
> --,"start"
|
||||||
> ,"static"
|
> ,"static"
|
||||||
> --,"stddev_pop"
|
> ,"stddev_pop"
|
||||||
> --,"stddev_samp"
|
> ,"stddev_samp"
|
||||||
> ,"submultiset"
|
> ,"submultiset"
|
||||||
> ,"substring"
|
> ,"substring"
|
||||||
> ,"substring_regex"
|
> ,"substring_regex"
|
||||||
> ,"succeeds"
|
> ,"succeeds"
|
||||||
> --,"sum"
|
> ,"sum"
|
||||||
> ,"symmetric"
|
> ,"symmetric"
|
||||||
> ,"system"
|
> ,"system"
|
||||||
> ,"system_time"
|
> ,"system_time"
|
||||||
|
@ -2407,8 +2475,8 @@ means).
|
||||||
> --,"value"
|
> --,"value"
|
||||||
> ,"values"
|
> ,"values"
|
||||||
> ,"value_of"
|
> ,"value_of"
|
||||||
> --,"var_pop"
|
> ,"var_pop"
|
||||||
> --,"var_samp"
|
> ,"var_samp"
|
||||||
> ,"varbinary"
|
> ,"varbinary"
|
||||||
> ,"varchar"
|
> ,"varchar"
|
||||||
> ,"varying"
|
> ,"varying"
|
||||||
|
|
|
@ -20,6 +20,7 @@ Tests for parsing value expressions
|
||||||
> ,subqueries
|
> ,subqueries
|
||||||
> ,aggregates
|
> ,aggregates
|
||||||
> ,windowFunctions
|
> ,windowFunctions
|
||||||
|
> ,functionsWithReservedNames
|
||||||
> ]
|
> ]
|
||||||
|
|
||||||
> literals :: TestItem
|
> literals :: TestItem
|
||||||
|
@ -404,3 +405,11 @@ target_string
|
||||||
> [("(a)", Parens (Iden [Name Nothing "a"]))
|
> [("(a)", Parens (Iden [Name Nothing "a"]))
|
||||||
> ,("(a + b)", Parens (BinOp (Iden [Name Nothing "a"]) [Name Nothing "+"] (Iden [Name Nothing "b"])))
|
> ,("(a + b)", Parens (BinOp (Iden [Name Nothing "a"]) [Name Nothing "+"] (Iden [Name Nothing "b"])))
|
||||||
> ]
|
> ]
|
||||||
|
|
||||||
|
> functionsWithReservedNames :: TestItem
|
||||||
|
> functionsWithReservedNames = Group "functionsWithReservedNames" $ map t
|
||||||
|
> ["abs"
|
||||||
|
> ,"char_length"
|
||||||
|
> ]
|
||||||
|
> where
|
||||||
|
> t fn = TestValueExpr ansi2011 (fn ++ "(a)") $ App [Name Nothing fn] [Iden [Name Nothing "a"]]
|
||||||
|
|
Loading…
Reference in a new issue