From 0bf6ac23615e1c60810337cef2e2f3b6790a5434 Mon Sep 17 00:00:00 2001 From: tangenta Date: Mon, 25 May 2020 14:22:32 +0800 Subject: [PATCH 1/3] update expression-syntax.md --- expression-syntax.md | 211 +++++++++++++++++++++++++++++++------------ 1 file changed, 154 insertions(+), 57 deletions(-) diff --git a/expression-syntax.md b/expression-syntax.md index 91de1f6dcd60..35306fc195ec 100644 --- a/expression-syntax.md +++ b/expression-syntax.md @@ -1,68 +1,165 @@ --- title: 表达式语法 +summary: 本文列出 TiDB 的表达式语法。 category: reference aliases: ['/docs-cn/dev/reference/sql/language-structure/expression-syntax/'] --- # 表达式语法 (Expression Syntax) -在 TiDB 中,以下规则是表达式的语法,你可以在 `parser/parser.y` 中找到定义。TiDB 的语法解析是基于 yacc 的。 +在 TiDB 中,以下规则是表达式的语法,详情可参考 [TiDB SQL 语法](https://pingcap.github.io/sqlgram/#Expression)。 ``` -Expression: - singleAtIdentifier assignmentEq Expression - | Expression logOr Expression - | Expression "XOR" Expression - | Expression logAnd Expression - | "NOT" Expression - | Factor IsOrNotOp trueKwd - | Factor IsOrNotOp falseKwd - | Factor IsOrNotOp "UNKNOWN" - | Factor - -Factor: - Factor IsOrNotOp "NULL" - | Factor CompareOp PredicateExpr - | Factor CompareOp singleAtIdentifier assignmentEq PredicateExpr - | Factor CompareOp AnyOrAll SubSelect - | PredicateExpr - -PredicateExpr: - PrimaryFactor InOrNotOp '(' ExpressionList ')' - | PrimaryFactor InOrNotOp SubSelect - | PrimaryFactor BetweenOrNotOp PrimaryFactor "AND" PredicateExpr - | PrimaryFactor LikeOrNotOp PrimaryExpression LikeEscapeOpt - | PrimaryFactor RegexpOrNotOp PrimaryExpression - | PrimaryFactor - -PrimaryFactor: - PrimaryFactor '|' PrimaryFactor - | PrimaryFactor '&' PrimaryFactor - | PrimaryFactor "<<" PrimaryFactor - | PrimaryFactor ">>" PrimaryFactor - | PrimaryFactor '+' PrimaryFactor - | PrimaryFactor '-' PrimaryFactor - | PrimaryFactor '*' PrimaryFactor - | PrimaryFactor '/' PrimaryFactor - | PrimaryFactor '%' PrimaryFactor - | PrimaryFactor "DIV" PrimaryFactor - | PrimaryFactor "MOD" PrimaryFactor - | PrimaryFactor '^' PrimaryFactor - | PrimaryExpression - -PrimaryExpression: - Operand - | FunctionCallKeyword - | FunctionCallNonKeyword - | FunctionCallAgg - | FunctionCallGeneric - | Identifier jss stringLit - | Identifier juss stringLit - | SubSelect - | '!' PrimaryExpression - | '~' PrimaryExpression - | '-' PrimaryExpression - | '+' PrimaryExpression - | "BINARY" PrimaryExpression - | PrimaryExpression "COLLATE" StringName +Expression ::= + singleAtIdentifier assignmentEq Expression +| Expression logOr Expression +| Expression "XOR" Expression +| Expression logAnd Expression +| "NOT" Expression +| "MATCH" '(' ColumnNameList ')' "AGAINST" '(' BitExpr FulltextSearchModifierOpt ')' +| BoolPri IsOrNotOp trueKwd +| BoolPri IsOrNotOp falseKwd +| BoolPri IsOrNotOp "UNKNOWN" +| BoolPri + +BitExpr ::= + BitExpr '|' BitExpr +| BitExpr '&' BitExpr +| BitExpr "<<" BitExpr +| BitExpr ">>" BitExpr +| BitExpr '+' BitExpr +| BitExpr '-' BitExpr +| BitExpr '+' "INTERVAL" Expression TimeUnit +| BitExpr '-' "INTERVAL" Expression TimeUnit +| BitExpr '*' BitExpr +| BitExpr '/' BitExpr +| BitExpr '%' BitExpr +| BitExpr "DIV" BitExpr +| BitExpr "MOD" BitExpr +| BitExpr '^' BitExpr +| SimpleExpr + +FulltextSearchModifierOpt ::= + +| "IN" "NATURAL" "LANGUAGE" "MODE" +| "IN" "NATURAL" "LANGUAGE" "MODE" "WITH" "QUERY" "EXPANSION" +| "IN" "BOOLEAN" "MODE" +| "WITH" "QUERY" "EXPANSION" + +BoolPri ::= + BoolPri IsOrNotOp "NULL" +| BoolPri CompareOp PredicateExpr +| BoolPri CompareOp AnyOrAll SubSelect +| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr +| PredicateExpr + +IsOrNotOp ::= + "IS" +| "IS" "NOT" + +SimpleExpr ::= + SimpleIdent +| FunctionCallKeyword +| FunctionCallNonKeyword +| FunctionCallGeneric +| SimpleExpr "COLLATE" CollationName +| WindowFuncCall +| Literal +| paramMarker +| Variable +| SumExpr +| '!' SimpleExpr +| '~' SimpleExpr +| '-' SimpleExpr +| '+' SimpleExpr +| SimpleExpr pipes SimpleExpr +| not2 SimpleExpr +| SubSelect +| '(' Expression ')' +| '(' ExpressionList ',' Expression ')' +| "ROW" '(' ExpressionList ',' Expression ')' +| "EXISTS" SubSelect +| "BINARY" SimpleExpr +| builtinCast '(' Expression "AS" CastType ')' +| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" +| "CONVERT" '(' Expression ',' CastType ')' +| "CONVERT" '(' Expression "USING" CharsetName ')' +| "DEFAULT" '(' SimpleIdent ')' +| "VALUES" '(' SimpleIdent ')' +| SimpleIdent jss stringLit +| SimpleIdent juss stringLit + +CompareOp ::= + ">=" +| '>' +| "<=" +| '<' +| "!=" +| "<>" +| "=" +| "<=>" + +PredicateExpr ::= + BitExpr InOrNotOp '(' ExpressionList ')' +| BitExpr InOrNotOp SubSelect +| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr +| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt +| BitExpr RegexpOrNotOp SimpleExpr +| BitExpr + +AnyOrAll ::= + "ANY" +| "SOME" +| "ALL" + +SubSelect ::= + '(' SelectStmt ')' +| '(' UnionStmt ')' + +SimpleIdent ::= + Identifier +| Identifier '.' Identifier +| '.' Identifier '.' Identifier +| Identifier '.' Identifier '.' Identifier + +Literal ::= + "FALSE" +| "NULL" +| "TRUE" +| floatLit +| decLit +| intLit +| StringLiteral +| "UNDERSCORE_CHARSET" stringLit +| hexLit +| bitLit + +Variable ::= + SystemVariable +| UserVariable + +SumExpr ::= + "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinBitAnd '(' Expression ')' OptWindowingClause +| builtinBitAnd '(' "ALL" Expression ')' OptWindowingClause +| builtinBitOr '(' Expression ')' OptWindowingClause +| builtinBitOr '(' "ALL" Expression ')' OptWindowingClause +| builtinBitXor '(' Expression ')' OptWindowingClause +| builtinBitXor '(' "ALL" Expression ')' OptWindowingClause +| builtinCount '(' DistinctKwd ExpressionList ')' +| builtinCount '(' "ALL" Expression ')' OptWindowingClause +| builtinCount '(' Expression ')' OptWindowingClause +| builtinCount '(' '*' ')' OptWindowingClause +| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' OptWindowingClause +| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' Expression ',' Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' "ALL" Expression ',' Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' Expression ',' "ALL" Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' "ALL" Expression ',' "ALL" Expression ')' OptWindowingClause ``` From 762484e2e780eb8dd5da1e34b8585ac3ad80c9d5 Mon Sep 17 00:00:00 2001 From: tangenta Date: Mon, 25 May 2020 14:28:19 +0800 Subject: [PATCH 2/3] replace all the tabs with spaces --- expression-syntax.md | 248 +++++++++++++++++++++---------------------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/expression-syntax.md b/expression-syntax.md index 35306fc195ec..a3a546eb538f 100644 --- a/expression-syntax.md +++ b/expression-syntax.md @@ -11,155 +11,155 @@ aliases: ['/docs-cn/dev/reference/sql/language-structure/expression-syntax/'] ``` Expression ::= - singleAtIdentifier assignmentEq Expression -| Expression logOr Expression -| Expression "XOR" Expression -| Expression logAnd Expression -| "NOT" Expression -| "MATCH" '(' ColumnNameList ')' "AGAINST" '(' BitExpr FulltextSearchModifierOpt ')' -| BoolPri IsOrNotOp trueKwd -| BoolPri IsOrNotOp falseKwd -| BoolPri IsOrNotOp "UNKNOWN" -| BoolPri + singleAtIdentifier assignmentEq Expression +| Expression logOr Expression +| Expression "XOR" Expression +| Expression logAnd Expression +| "NOT" Expression +| "MATCH" '(' ColumnNameList ')' "AGAINST" '(' BitExpr FulltextSearchModifierOpt ')' +| BoolPri IsOrNotOp trueKwd +| BoolPri IsOrNotOp falseKwd +| BoolPri IsOrNotOp "UNKNOWN" +| BoolPri BitExpr ::= - BitExpr '|' BitExpr -| BitExpr '&' BitExpr -| BitExpr "<<" BitExpr -| BitExpr ">>" BitExpr -| BitExpr '+' BitExpr -| BitExpr '-' BitExpr -| BitExpr '+' "INTERVAL" Expression TimeUnit -| BitExpr '-' "INTERVAL" Expression TimeUnit -| BitExpr '*' BitExpr -| BitExpr '/' BitExpr -| BitExpr '%' BitExpr -| BitExpr "DIV" BitExpr -| BitExpr "MOD" BitExpr -| BitExpr '^' BitExpr -| SimpleExpr + BitExpr '|' BitExpr +| BitExpr '&' BitExpr +| BitExpr "<<" BitExpr +| BitExpr ">>" BitExpr +| BitExpr '+' BitExpr +| BitExpr '-' BitExpr +| BitExpr '+' "INTERVAL" Expression TimeUnit +| BitExpr '-' "INTERVAL" Expression TimeUnit +| BitExpr '*' BitExpr +| BitExpr '/' BitExpr +| BitExpr '%' BitExpr +| BitExpr "DIV" BitExpr +| BitExpr "MOD" BitExpr +| BitExpr '^' BitExpr +| SimpleExpr FulltextSearchModifierOpt ::= -| "IN" "NATURAL" "LANGUAGE" "MODE" -| "IN" "NATURAL" "LANGUAGE" "MODE" "WITH" "QUERY" "EXPANSION" -| "IN" "BOOLEAN" "MODE" -| "WITH" "QUERY" "EXPANSION" +| "IN" "NATURAL" "LANGUAGE" "MODE" +| "IN" "NATURAL" "LANGUAGE" "MODE" "WITH" "QUERY" "EXPANSION" +| "IN" "BOOLEAN" "MODE" +| "WITH" "QUERY" "EXPANSION" BoolPri ::= - BoolPri IsOrNotOp "NULL" -| BoolPri CompareOp PredicateExpr -| BoolPri CompareOp AnyOrAll SubSelect -| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr -| PredicateExpr + BoolPri IsOrNotOp "NULL" +| BoolPri CompareOp PredicateExpr +| BoolPri CompareOp AnyOrAll SubSelect +| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr +| PredicateExpr IsOrNotOp ::= - "IS" -| "IS" "NOT" + "IS" +| "IS" "NOT" SimpleExpr ::= - SimpleIdent -| FunctionCallKeyword -| FunctionCallNonKeyword -| FunctionCallGeneric -| SimpleExpr "COLLATE" CollationName -| WindowFuncCall -| Literal -| paramMarker -| Variable -| SumExpr -| '!' SimpleExpr -| '~' SimpleExpr -| '-' SimpleExpr -| '+' SimpleExpr -| SimpleExpr pipes SimpleExpr -| not2 SimpleExpr -| SubSelect -| '(' Expression ')' -| '(' ExpressionList ',' Expression ')' -| "ROW" '(' ExpressionList ',' Expression ')' -| "EXISTS" SubSelect -| "BINARY" SimpleExpr -| builtinCast '(' Expression "AS" CastType ')' -| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" -| "CONVERT" '(' Expression ',' CastType ')' -| "CONVERT" '(' Expression "USING" CharsetName ')' -| "DEFAULT" '(' SimpleIdent ')' -| "VALUES" '(' SimpleIdent ')' -| SimpleIdent jss stringLit -| SimpleIdent juss stringLit + SimpleIdent +| FunctionCallKeyword +| FunctionCallNonKeyword +| FunctionCallGeneric +| SimpleExpr "COLLATE" CollationName +| WindowFuncCall +| Literal +| paramMarker +| Variable +| SumExpr +| '!' SimpleExpr +| '~' SimpleExpr +| '-' SimpleExpr +| '+' SimpleExpr +| SimpleExpr pipes SimpleExpr +| not2 SimpleExpr +| SubSelect +| '(' Expression ')' +| '(' ExpressionList ',' Expression ')' +| "ROW" '(' ExpressionList ',' Expression ')' +| "EXISTS" SubSelect +| "BINARY" SimpleExpr +| builtinCast '(' Expression "AS" CastType ')' +| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" +| "CONVERT" '(' Expression ',' CastType ')' +| "CONVERT" '(' Expression "USING" CharsetName ')' +| "DEFAULT" '(' SimpleIdent ')' +| "VALUES" '(' SimpleIdent ')' +| SimpleIdent jss stringLit +| SimpleIdent juss stringLit CompareOp ::= - ">=" -| '>' -| "<=" -| '<' -| "!=" -| "<>" -| "=" -| "<=>" + ">=" +| '>' +| "<=" +| '<' +| "!=" +| "<>" +| "=" +| "<=>" PredicateExpr ::= - BitExpr InOrNotOp '(' ExpressionList ')' -| BitExpr InOrNotOp SubSelect -| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr -| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt -| BitExpr RegexpOrNotOp SimpleExpr -| BitExpr + BitExpr InOrNotOp '(' ExpressionList ')' +| BitExpr InOrNotOp SubSelect +| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr +| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt +| BitExpr RegexpOrNotOp SimpleExpr +| BitExpr AnyOrAll ::= - "ANY" -| "SOME" -| "ALL" + "ANY" +| "SOME" +| "ALL" SubSelect ::= - '(' SelectStmt ')' -| '(' UnionStmt ')' + '(' SelectStmt ')' +| '(' UnionStmt ')' SimpleIdent ::= - Identifier -| Identifier '.' Identifier -| '.' Identifier '.' Identifier -| Identifier '.' Identifier '.' Identifier + Identifier +| Identifier '.' Identifier +| '.' Identifier '.' Identifier +| Identifier '.' Identifier '.' Identifier Literal ::= - "FALSE" -| "NULL" -| "TRUE" -| floatLit -| decLit -| intLit -| StringLiteral -| "UNDERSCORE_CHARSET" stringLit -| hexLit -| bitLit + "FALSE" +| "NULL" +| "TRUE" +| floatLit +| decLit +| intLit +| StringLiteral +| "UNDERSCORE_CHARSET" stringLit +| hexLit +| bitLit Variable ::= - SystemVariable -| UserVariable + SystemVariable +| UserVariable SumExpr ::= - "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinBitAnd '(' Expression ')' OptWindowingClause -| builtinBitAnd '(' "ALL" Expression ')' OptWindowingClause -| builtinBitOr '(' Expression ')' OptWindowingClause -| builtinBitOr '(' "ALL" Expression ')' OptWindowingClause -| builtinBitXor '(' Expression ')' OptWindowingClause -| builtinBitXor '(' "ALL" Expression ')' OptWindowingClause -| builtinCount '(' DistinctKwd ExpressionList ')' -| builtinCount '(' "ALL" Expression ')' OptWindowingClause -| builtinCount '(' Expression ')' OptWindowingClause -| builtinCount '(' '*' ')' OptWindowingClause -| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' OptWindowingClause -| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' Expression ',' Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' "ALL" Expression ',' Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' Expression ',' "ALL" Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' "ALL" Expression ',' "ALL" Expression ')' OptWindowingClause + "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinBitAnd '(' Expression ')' OptWindowingClause +| builtinBitAnd '(' "ALL" Expression ')' OptWindowingClause +| builtinBitOr '(' Expression ')' OptWindowingClause +| builtinBitOr '(' "ALL" Expression ')' OptWindowingClause +| builtinBitXor '(' Expression ')' OptWindowingClause +| builtinBitXor '(' "ALL" Expression ')' OptWindowingClause +| builtinCount '(' DistinctKwd ExpressionList ')' +| builtinCount '(' "ALL" Expression ')' OptWindowingClause +| builtinCount '(' Expression ')' OptWindowingClause +| builtinCount '(' '*' ')' OptWindowingClause +| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' OptWindowingClause +| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' Expression ',' Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' "ALL" Expression ',' Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' Expression ',' "ALL" Expression ')' OptWindowingClause +| "JSON_OBJECTAGG" '(' "ALL" Expression ',' "ALL" Expression ')' OptWindowingClause ``` From 3422ada3ef464686838ef3095901b33851cb8aa2 Mon Sep 17 00:00:00 2001 From: tangenta Date: Mon, 25 May 2020 18:06:52 +0800 Subject: [PATCH 3/3] add some description and change syntax bnf to png --- expression-syntax.md | 161 ++++--------------------------------------- 1 file changed, 15 insertions(+), 146 deletions(-) diff --git a/expression-syntax.md b/expression-syntax.md index a3a546eb538f..70c680091279 100644 --- a/expression-syntax.md +++ b/expression-syntax.md @@ -2,164 +2,33 @@ title: 表达式语法 summary: 本文列出 TiDB 的表达式语法。 category: reference -aliases: ['/docs-cn/dev/reference/sql/language-structure/expression-syntax/'] --- # 表达式语法 (Expression Syntax) -在 TiDB 中,以下规则是表达式的语法,详情可参考 [TiDB SQL 语法](https://pingcap.github.io/sqlgram/#Expression)。 +表达式是一个或多个值、操作符或函数的组合。在 TiDB 中,表达式主要使用在 `SELECT` 语句的各个子句中,包括 Group by 子句、Where 子句、Having 子句、Join 条件以及窗口函数等。此外,部分 DDL 语句也会使用到表达式,例如建表时默认值的设置、生成列的设置,分区规则等。 -``` -Expression ::= - singleAtIdentifier assignmentEq Expression -| Expression logOr Expression -| Expression "XOR" Expression -| Expression logAnd Expression -| "NOT" Expression -| "MATCH" '(' ColumnNameList ')' "AGAINST" '(' BitExpr FulltextSearchModifierOpt ')' -| BoolPri IsOrNotOp trueKwd -| BoolPri IsOrNotOp falseKwd -| BoolPri IsOrNotOp "UNKNOWN" -| BoolPri +表达式包含几种类型: -BitExpr ::= - BitExpr '|' BitExpr -| BitExpr '&' BitExpr -| BitExpr "<<" BitExpr -| BitExpr ">>" BitExpr -| BitExpr '+' BitExpr -| BitExpr '-' BitExpr -| BitExpr '+' "INTERVAL" Expression TimeUnit -| BitExpr '-' "INTERVAL" Expression TimeUnit -| BitExpr '*' BitExpr -| BitExpr '/' BitExpr -| BitExpr '%' BitExpr -| BitExpr "DIV" BitExpr -| BitExpr "MOD" BitExpr -| BitExpr '^' BitExpr -| SimpleExpr ++ 标识符,可参考[模式对象名](/schema-object-names.md)。 ++ 谓词、数值、字符串、日期表达式等,这些类型的[字面值](/literal-values.md)也是表达式。 ++ 函数调用,窗口函数等。可参考[函数和操作符概述](/functions-and-operators/functions-and-operators-overview.md) 和 [窗口函数](/functions-and-operators/window-functions.md)。 ++ 其他,包括 paramMarker(即 `?`)、系统变量和用户变量、CASE 表达式等。 -FulltextSearchModifierOpt ::= +以下规则是表达式的语法,该语法基于 TiDB parser 的 [parser.y](https://github.com/pingcap/parser/blob/master/parser.y) 文件中所定义的规则。此外,下列语法图的可导航版本请参考 [TiDB SQL 语法图](https://pingcap.github.io/sqlgram/#Expression)。 -| "IN" "NATURAL" "LANGUAGE" "MODE" -| "IN" "NATURAL" "LANGUAGE" "MODE" "WITH" "QUERY" "EXPANSION" -| "IN" "BOOLEAN" "MODE" -| "WITH" "QUERY" "EXPANSION" +**Expression:** -BoolPri ::= - BoolPri IsOrNotOp "NULL" -| BoolPri CompareOp PredicateExpr -| BoolPri CompareOp AnyOrAll SubSelect -| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr -| PredicateExpr +![Expression](/media/sqlgram/Expression.png) -IsOrNotOp ::= - "IS" -| "IS" "NOT" +**PredicateExpr:** -SimpleExpr ::= - SimpleIdent -| FunctionCallKeyword -| FunctionCallNonKeyword -| FunctionCallGeneric -| SimpleExpr "COLLATE" CollationName -| WindowFuncCall -| Literal -| paramMarker -| Variable -| SumExpr -| '!' SimpleExpr -| '~' SimpleExpr -| '-' SimpleExpr -| '+' SimpleExpr -| SimpleExpr pipes SimpleExpr -| not2 SimpleExpr -| SubSelect -| '(' Expression ')' -| '(' ExpressionList ',' Expression ')' -| "ROW" '(' ExpressionList ',' Expression ')' -| "EXISTS" SubSelect -| "BINARY" SimpleExpr -| builtinCast '(' Expression "AS" CastType ')' -| "CASE" ExpressionOpt WhenClauseList ElseOpt "END" -| "CONVERT" '(' Expression ',' CastType ')' -| "CONVERT" '(' Expression "USING" CharsetName ')' -| "DEFAULT" '(' SimpleIdent ')' -| "VALUES" '(' SimpleIdent ')' -| SimpleIdent jss stringLit -| SimpleIdent juss stringLit +![PredicateExpr](/media/sqlgram/PredicateExpr.png) -CompareOp ::= - ">=" -| '>' -| "<=" -| '<' -| "!=" -| "<>" -| "=" -| "<=>" +**BitExpr:** -PredicateExpr ::= - BitExpr InOrNotOp '(' ExpressionList ')' -| BitExpr InOrNotOp SubSelect -| BitExpr BetweenOrNotOp BitExpr "AND" PredicateExpr -| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt -| BitExpr RegexpOrNotOp SimpleExpr -| BitExpr +![BitExpr](/media/sqlgram/BitExpr.png) -AnyOrAll ::= - "ANY" -| "SOME" -| "ALL" +**SimpleExpr:** -SubSelect ::= - '(' SelectStmt ')' -| '(' UnionStmt ')' - -SimpleIdent ::= - Identifier -| Identifier '.' Identifier -| '.' Identifier '.' Identifier -| Identifier '.' Identifier '.' Identifier - -Literal ::= - "FALSE" -| "NULL" -| "TRUE" -| floatLit -| decLit -| intLit -| StringLiteral -| "UNDERSCORE_CHARSET" stringLit -| hexLit -| bitLit - -Variable ::= - SystemVariable -| UserVariable - -SumExpr ::= - "AVG" '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinBitAnd '(' Expression ')' OptWindowingClause -| builtinBitAnd '(' "ALL" Expression ')' OptWindowingClause -| builtinBitOr '(' Expression ')' OptWindowingClause -| builtinBitOr '(' "ALL" Expression ')' OptWindowingClause -| builtinBitXor '(' Expression ')' OptWindowingClause -| builtinBitXor '(' "ALL" Expression ')' OptWindowingClause -| builtinCount '(' DistinctKwd ExpressionList ')' -| builtinCount '(' "ALL" Expression ')' OptWindowingClause -| builtinCount '(' Expression ')' OptWindowingClause -| builtinCount '(' '*' ')' OptWindowingClause -| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')' OptWindowingClause -| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' Expression ',' Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' "ALL" Expression ',' Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' Expression ',' "ALL" Expression ')' OptWindowingClause -| "JSON_OBJECTAGG" '(' "ALL" Expression ',' "ALL" Expression ')' OptWindowingClause -``` +![SimpleExpr](/media/sqlgram/SimpleExpr.png)