Skip to content

Commit

Permalink
feat: Remove unnecessary JOINs of vertices
Browse files Browse the repository at this point in the history
(cherry picked from commit 1070d8f)
  • Loading branch information
protodef authored and emotionbug committed Jul 7, 2022
1 parent 57e6b37 commit 3ced882
Show file tree
Hide file tree
Showing 6 changed files with 1,701 additions and 817 deletions.
22 changes: 19 additions & 3 deletions src/backend/parser/gram.y
Original file line number Diff line number Diff line change
Expand Up @@ -15184,8 +15184,23 @@ cypher_types:
cypher_varlen_opt:
'*' cypher_range_opt
{
if ($2 == NULL)
$2 = (Node *) makeNode(A_Indices);
A_Indices *n = (A_Indices *) $2;

if (n->lidx == NULL)
n->lidx = makeIntConst(1, -1);

if (n->uidx != NULL)
{
A_Const *lidx = (A_Const *) n->lidx;
A_Const *uidx = (A_Const *) n->uidx;

if (lidx->val.val.ival > uidx->val.val.ival)
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("invalid range"),
parser_errposition(@2)));
}

$$ = $2;
}
| /* EMPTY */
Expand All @@ -15208,7 +15223,7 @@ cypher_range_opt:
$$ = (Node *) n;
}
| /* EMPTY */
{ $$ = NULL; }
{ $$ = (Node *) makeNode(A_Indices); }
;

cypher_range_idx_opt:
Expand Down Expand Up @@ -16120,6 +16135,7 @@ wrapCypherWithSelect(Node *stmt)

sub = makeNode(RangeSubselect);
sub->subquery = stmt;
/* CYPHER_SUBQUERY_ALIAS */
sub->alias = makeAlias("_", NIL);

select = makeNode(SelectStmt);
Expand Down
77 changes: 48 additions & 29 deletions src/backend/parser/parse_clause.c
Original file line number Diff line number Diff line change
Expand Up @@ -3286,27 +3286,8 @@ add_expr_to_group_exprs(Expr *expr, List **group_exprs)
{
Expr *gexpr = (Expr *) lfirst(gl);

switch (nodeTag(gexpr))
{
case T_FieldSelect:
if (equal(gexpr, expr))
return false;
break;
case T_Var:
{
Var *gvar = (Var *) gexpr;
Var *var = (Var *) expr;

if (gvar->varno == var->varno &&
gvar->varattno == var->varattno &&
gvar->varlevelsup == 0)
return false;
}
break;
default:
/* can't happen */
Assert(!"invalid node");
}
if (equal(gexpr, expr))
return false;
}

*group_exprs = lappend(*group_exprs, expr);
Expand All @@ -3323,6 +3304,7 @@ typedef struct
static bool
gen_group_exprs_walker(Node *node, gen_group_exprs_context *ctx)
{
FieldSelect *fselect;
Var *var;

if (node == NULL)
Expand Down Expand Up @@ -3350,21 +3332,58 @@ gen_group_exprs_walker(Node *node, gen_group_exprs_context *ctx)
* need to consider pre-existing variables and expressions in the GROUP BY.
*/

if (IsA(node, OpExpr))
{
OpExpr *op = (OpExpr *) node;

/* #>> */
if (op->opno == 3206)
{
Node *arg1 = linitial(op->args);

if (IsA(arg1, FieldSelect))
{
fselect = (FieldSelect *) arg1;
if (!IsA(fselect->arg, Var))
return gen_group_exprs_walker((Node *) fselect->arg, ctx);

var = (Var *) fselect->arg;
if ((int) var->varlevelsup != ctx->sublevels_up)
return false;

add_expr_to_group_exprs((Expr *) op, &ctx->group_exprs);
return false;
}

if (IsA(arg1, Var))
{
var = (Var *) arg1;
if ((int) var->varlevelsup != ctx->sublevels_up)
return false;

add_expr_to_group_exprs((Expr *) op, &ctx->group_exprs);
return false;
}
}

return gen_group_exprs_walker((Node *) op->args, ctx);
}

if (IsA(node, FieldSelect))
{
FieldSelect *fs = (FieldSelect *) node;
fselect = (FieldSelect *) node;

/* NOTE: There might be other cases to check. */

if (!IsA(fs->arg, Var))
return gen_group_exprs_walker((Node *) fs->arg, ctx);
if (!IsA(fselect->arg, Var))
return gen_group_exprs_walker((Node *) fselect->arg, ctx);

var = (Var *) fs->arg;
var = (Var *) fselect->arg;

if ((int) var->varlevelsup != ctx->sublevels_up)
return false;

add_expr_to_group_exprs((Expr *) fs, &ctx->group_exprs);
add_expr_to_group_exprs((Expr *) fselect, &ctx->group_exprs);
return false;
}

Expand All @@ -3384,14 +3403,14 @@ gen_group_exprs_walker(Node *node, gen_group_exprs_context *ctx)
bool result;

ctx->sublevels_up++;
result = query_tree_walker((Query *) node, gen_group_exprs_walker,
(void *) ctx, 0);
result = query_tree_walker((Query *) node, gen_group_exprs_walker, ctx,
0);
ctx->sublevels_up--;

return result;
}

return expression_tree_walker(node, gen_group_exprs_walker, (void *) ctx);
return expression_tree_walker(node, gen_group_exprs_walker, ctx);
}

/*
Expand Down

0 comments on commit 3ced882

Please sign in to comment.