!2888 issue修复:操作符优先级问题导致特定表达式语法解析失败问题修复

Merge pull request !2888 from zhangzhixian/master
This commit is contained in:
opengauss-bot
2023-02-17 03:22:41 +00:00
committed by Gitee
4 changed files with 18 additions and 6 deletions

View File

@ -940,6 +940,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm
END_OF_INPUT
END_OF_INPUT_COLON
END_OF_PROC
NOT_IN
/* Precedence: lowest to highest */
%nonassoc COMMENT
@ -960,7 +961,7 @@ static void setDelimiterName(core_yyscan_t yyscanner, char*input, VariableSetStm
%nonassoc ESCAPE
%nonassoc OVERLAPS
%nonassoc BETWEEN
%nonassoc IN_P
%nonassoc IN_P NOT_IN
%left POSTFIXOP /* dummy for postfix Op rules */
%nonassoc lower_than_index
%nonassoc INDEX
@ -23894,25 +23895,25 @@ a_expr: c_expr { $$ = $1; }
$$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3, @2);
}
}
| a_expr NOT IN_P in_expr
| a_expr NOT_IN in_expr %prec NOT_IN
{
/* in_expr returns a SubLink or a list of a_exprs */
if (IsA($4, SubLink))
if (IsA($3, SubLink))
{
/* generate NOT (foo = ANY (subquery)) */
/* Make an = ANY node */
SubLink *n = (SubLink *) $4;
SubLink *n = (SubLink *) $3;
n->subLinkType = ANY_SUBLINK;
n->testexpr = $1;
n->operName = list_make1(makeString("="));
n->location = @3;
n->location = @2;
/* Stick a NOT on top */
$$ = (Node *) makeA_Expr(AEXPR_NOT, NIL, NULL, (Node *) n, @2);
}
else
{
/* generate scalar NOT IN expression */
$$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
$$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $3, @2);
}
}
| a_expr subquery_Op sub_type select_with_parens %prec Op

View File

@ -231,6 +231,9 @@ int base_yylex(YYSTYPE* lvalp, YYLTYPE* llocp, core_yyscan_t yyscanner)
case ENFORCED:
cur_token = NOT_ENFORCED;
break;
case IN_P:
cur_token = NOT_IN;
break;
default:
/* save the lookahead token for next time */
SET_LOOKAHEAD_TOKEN();

View File

@ -470,6 +470,12 @@ SELECT 1-2::bool;
0
(1 row)
select true >= 'ss' not in (md5('ss'));
?column?
----------
t
(1 row)
--
-- Clean up
-- Many tables are retained by the regression test, but these do not seem

View File

@ -206,6 +206,8 @@ SELECT -2::bool;
SELECT 1-2::bool;
select true >= 'ss' not in (md5('ss'));
--
-- Clean up
-- Many tables are retained by the regression test, but these do not seem