表达式语法 (Expression Syntax)

表达式是一个或多个值、操作符或函数的组合。在 TiDB 中,表达式主要使用在 SELECT 语句的各个子句中,包括 Group by 子句、Where 子句、Having 子句、Join 条件以及窗口函数等。此外,部分 DDL 语句也会使用到表达式,例如建表时默认值的设置、生成列的设置,分区规则等。

表达式包含几种类型:

  • 标识符,可参考模式对象名
  • 谓词、数值、字符串、日期表达式等,这些类型的字面值也是表达式。
  • 函数调用,窗口函数等。可参考函数和操作符概述窗口函数
  • 其他,包括 paramMarker(即 ?)、系统变量和用户变量、CASE 表达式等。

以下规则是表达式的语法,该语法基于 TiDB parser 的 parser.y 文件中所定义的规则。此外,下列语法图的可导航版本请参考 TiDB SQL 语法图

  1. Expression ::=
  2. ( singleAtIdentifier assignmentEq | 'NOT' | Expression ( logOr | 'XOR' | logAnd ) ) Expression
  3. | 'MATCH' '(' ColumnNameList ')' 'AGAINST' '(' BitExpr FulltextSearchModifierOpt ')'
  4. | PredicateExpr ( IsOrNotOp 'NULL' | CompareOp ( ( singleAtIdentifier assignmentEq )? PredicateExpr | AnyOrAll SubSelect ) )* ( IsOrNotOp ( trueKwd | falseKwd | 'UNKNOWN' ) )?
  5. PredicateExpr ::=
  6. BitExpr ( BetweenOrNotOp BitExpr 'AND' BitExpr )* ( InOrNotOp ( '(' ExpressionList ')' | SubSelect ) | LikeOrNotOp SimpleExpr LikeEscapeOpt | RegexpOrNotOp SimpleExpr )?
  7. BitExpr ::=
  8. BitExpr ( ( '|' | '&' | '<<' | '>>' | '*' | '/' | '%' | 'DIV' | 'MOD' | '^' ) BitExpr | ( '+' | '-' ) ( BitExpr | "INTERVAL" Expression TimeUnit ) )
  9. | SimpleExpr
  10. SimpleExpr ::=
  11. SimpleIdent ( ( '->' | '->>' ) stringLit )?
  12. | FunctionCallKeyword
  13. | FunctionCallNonKeyword
  14. | FunctionCallGeneric
  15. | SimpleExpr ( 'COLLATE' CollationName | pipes SimpleExpr )
  16. | WindowFuncCall
  17. | Literal
  18. | paramMarker
  19. | Variable
  20. | SumExpr
  21. | ( '!' | '~' | '-' | '+' | 'NOT' | 'BINARY' ) SimpleExpr
  22. | 'EXISTS'? SubSelect
  23. | ( ( '(' ( ExpressionList ',' )? | 'ROW' '(' ExpressionList ',' ) Expression | builtinCast '(' Expression 'AS' CastType | ( 'DEFAULT' | 'VALUES' ) '(' SimpleIdent | 'CONVERT' '(' Expression ( ',' CastType | 'USING' CharsetName ) ) ')'
  24. | 'CASE' ExpressionOpt WhenClause+ ElseOpt 'END'