From 69747bc86f066a4c25d8a8c84ce303afcc400d23 Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 16 Oct 2019 18:19:57 +0200 Subject: [PATCH] Bug fix 3.4/disallow subqueries in prune (#10266) * backport of #10231 * added derived files --- CHANGELOG | 5 + arangod/Aql/Ast.cpp | 17 + arangod/Aql/Ast.h | 3 + arangod/Aql/AstNode.h | 1 + arangod/Aql/grammar.cpp | 1192 ++++++++++---------- arangod/Aql/grammar.h | 12 +- arangod/Aql/grammar.hpp | 12 +- arangod/Aql/grammar.y | 12 +- tests/js/server/aql/aql-graph-traverser.js | 14 + 9 files changed, 671 insertions(+), 597 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e01e4e3000..849ae20695 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,11 @@ v3.4.9 (XXX-XX-XX) ------------------- +* Disallow the usage of subqueries inside AQL traversal PRUNE conditions. + Using subqueries inside PRUNE conditions causes undefined behavior, + so such queries will now be aborted early on with a parse error + instead of running into undefined behavior. + * Fixed search not working in document view while in code mode. * Fixed issue #10090: fix repeatable seek to the same document in diff --git a/arangod/Aql/Ast.cpp b/arangod/Aql/Ast.cpp index 4a5b7fa070..2d41bcd563 100644 --- a/arangod/Aql/Ast.cpp +++ b/arangod/Aql/Ast.cpp @@ -743,6 +743,23 @@ AstNode* Ast::createNodeReference(Variable const* variable) { return node; } +/// @brief create an AST subquery reference node +AstNode* Ast::createNodeSubqueryReference(std::string const& variableName) { + AstNode* node = createNode(NODE_TYPE_REFERENCE); + node->setFlag(AstNodeFlagType::FLAG_SUBQUERY_REFERENCE); + + auto variable = _scopes.getVariable(variableName); + + if (variable == nullptr) { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, + "variable not found in reference AstNode"); + } + + node->setData(variable); + + return node; +} + /// @brief create an AST variable access AstNode* Ast::createNodeAccess(Variable const* variable, std::vector const& field) { diff --git a/arangod/Aql/Ast.h b/arangod/Aql/Ast.h index d20ff8a87f..8b96a16f80 100644 --- a/arangod/Aql/Ast.h +++ b/arangod/Aql/Ast.h @@ -246,6 +246,9 @@ class Ast { /// @brief create an AST reference node AstNode* createNodeReference(Variable const* variable); + /// @brief create an AST subquery reference node + AstNode* createNodeSubqueryReference(std::string const& variableName); + /// @brief create an AST parameter node for a value literal AstNode* createNodeParameter(char const* name, size_t length); diff --git a/arangod/Aql/AstNode.h b/arangod/Aql/AstNode.h index 3d35b50478..a596b7db2b 100644 --- a/arangod/Aql/AstNode.h +++ b/arangod/Aql/AstNode.h @@ -71,6 +71,7 @@ enum AstNodeFlagType : AstNodeFlagsType { FLAG_KEEP_VARIABLENAME = 0x0010000, // node is a reference to a variable name, not the variable value (used in KEEP nodes) FLAG_BIND_PARAMETER = 0x0020000, // node was created from a bind parameter FLAG_FINALIZED = 0x0040000, // node has been finalized and should not be modified; only set and checked in maintainer mode + FLAG_SUBQUERY_REFERENCE = 0x0080000, // node references a subquery }; /// @brief enumeration of AST node value types diff --git a/arangod/Aql/grammar.cpp b/arangod/Aql/grammar.cpp index 45547c1a0f..6566e11613 100644 --- a/arangod/Aql/grammar.cpp +++ b/arangod/Aql/grammar.cpp @@ -1,8 +1,9 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.3.2. */ /* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, + Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,11 +41,14 @@ define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ +/* Undocumented macros, especially those whose name start with YY_, + are private implementation details. Do not rely on them. */ + /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.4" +#define YYBISON_VERSION "3.3.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -67,8 +71,8 @@ #define yynerrs Aqlnerrs -/* Copy the first part of user declarations. */ -#line 9 "Aql/grammar.y" /* yacc.c:339 */ +/* First part of user prologue. */ +#line 9 "Aql/grammar.y" /* yacc.c:337 */ // we are using alloca here explicitly because we may // otherwise leak error messages that are generated by Bison. @@ -93,13 +97,16 @@ #include "Transaction/Context.h" #include "VocBase/AccessMode.h" -#line 97 "Aql/grammar.cpp" /* yacc.c:339 */ - +#line 101 "Aql/grammar.cpp" /* yacc.c:337 */ # ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif # else -# define YY_NULLPTR 0 +# define YY_NULLPTR ((void*)0) # endif # endif @@ -208,7 +215,7 @@ extern int Aqldebug; union YYSTYPE { -#line 34 "Aql/grammar.y" /* yacc.c:355 */ +#line 34 "Aql/grammar.y" /* yacc.c:352 */ arangodb::aql::AstNode* node; struct { @@ -218,7 +225,7 @@ union YYSTYPE bool boolval; int64_t intval; -#line 222 "Aql/grammar.cpp" /* yacc.c:355 */ +#line 229 "Aql/grammar.cpp" /* yacc.c:352 */ }; typedef union YYSTYPE YYSTYPE; @@ -246,8 +253,8 @@ int Aqlparse (arangodb::aql::Parser* parser); #endif /* !YY_AQL_AQL_GRAMMAR_HPP_INCLUDED */ -/* Copy the second part of user declarations. */ -#line 44 "Aql/grammar.y" /* yacc.c:358 */ +/* Second part of user prologue. */ +#line 44 "Aql/grammar.y" /* yacc.c:354 */ using namespace arangodb::aql; @@ -418,7 +425,7 @@ static AstNode* TransformOutputVariables(Parser* parser, AstNode const* names) { } -#line 422 "Aql/grammar.cpp" /* yacc.c:358 */ +#line 429 "Aql/grammar.cpp" /* yacc.c:354 */ #ifdef short # undef short @@ -439,13 +446,13 @@ typedef signed char yytype_int8; #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else -typedef unsigned short int yytype_uint16; +typedef unsigned short yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else -typedef short int yytype_int16; +typedef short yytype_int16; #endif #ifndef YYSIZE_T @@ -457,7 +464,7 @@ typedef short int yytype_int16; # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else -# define YYSIZE_T unsigned int +# define YYSIZE_T unsigned # endif #endif @@ -493,15 +500,6 @@ typedef short int yytype_int16; # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) #endif -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) -# endif -#endif - /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) @@ -509,7 +507,7 @@ typedef short int yytype_int16; # define YYUSE(E) /* empty */ #endif -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ @@ -673,16 +671,16 @@ union yyalloc /* YYNSTATES -- Number of states. */ #define YYNSTATES 372 -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 328 +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ + as returned by yylex. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -727,26 +725,26 @@ static const yytype_uint16 yyrline[] = 0, 389, 389, 392, 405, 409, 413, 420, 422, 422, 434, 439, 444, 446, 449, 452, 455, 458, 464, 466, 471, 473, 475, 477, 479, 481, 483, 485, 487, 489, - 491, 496, 503, 510, 516, 523, 550, 574, 587, 612, - 612, 670, 670, 693, 714, 722, 727, 729, 734, 741, - 751, 751, 765, 774, 786, 810, 866, 885, 912, 914, - 919, 926, 929, 932, 941, 955, 972, 972, 986, 986, - 996, 996, 1007, 1010, 1016, 1022, 1025, 1028, 1031, 1037, - 1042, 1049, 1057, 1060, 1066, 1076, 1086, 1094, 1105, 1110, - 1118, 1129, 1134, 1137, 1143, 1147, 1143, 1199, 1202, 1205, - 1211, 1211, 1221, 1227, 1230, 1233, 1236, 1239, 1242, 1248, - 1251, 1267, 1267, 1276, 1276, 1286, 1289, 1292, 1298, 1301, - 1304, 1307, 1310, 1313, 1316, 1319, 1322, 1325, 1328, 1331, - 1334, 1337, 1340, 1343, 1349, 1355, 1362, 1365, 1368, 1371, - 1374, 1377, 1380, 1383, 1389, 1392, 1398, 1400, 1405, 1408, - 1408, 1424, 1427, 1433, 1436, 1442, 1442, 1451, 1453, 1458, - 1461, 1467, 1470, 1496, 1516, 1519, 1533, 1533, 1542, 1544, - 1549, 1551, 1556, 1570, 1574, 1583, 1590, 1593, 1599, 1602, - 1608, 1611, 1614, 1620, 1623, 1629, 1632, 1635, 1639, 1645, - 1649, 1656, 1662, 1662, 1671, 1675, 1684, 1687, 1690, 1696, - 1699, 1705, 1738, 1741, 1744, 1751, 1761, 1761, 1774, 1789, - 1803, 1817, 1817, 1860, 1863, 1869, 1876, 1886, 1889, 1892, - 1895, 1898, 1904, 1908, 1912, 1922, 1929, 1935, 1938, 1943 + 491, 496, 503, 510, 516, 523, 550, 573, 586, 611, + 611, 669, 669, 701, 722, 730, 735, 737, 742, 749, + 759, 759, 773, 782, 794, 818, 874, 893, 920, 922, + 927, 934, 937, 940, 949, 963, 980, 980, 994, 994, + 1004, 1004, 1015, 1018, 1024, 1030, 1033, 1036, 1039, 1045, + 1050, 1057, 1065, 1068, 1074, 1084, 1094, 1102, 1113, 1118, + 1126, 1137, 1142, 1145, 1151, 1155, 1151, 1207, 1210, 1213, + 1219, 1219, 1229, 1235, 1238, 1241, 1244, 1247, 1250, 1256, + 1259, 1275, 1275, 1284, 1284, 1294, 1297, 1300, 1306, 1309, + 1312, 1315, 1318, 1321, 1324, 1327, 1330, 1333, 1336, 1339, + 1342, 1345, 1348, 1351, 1357, 1363, 1370, 1373, 1376, 1379, + 1382, 1385, 1388, 1391, 1397, 1400, 1406, 1408, 1413, 1416, + 1416, 1432, 1435, 1441, 1444, 1450, 1450, 1459, 1461, 1466, + 1469, 1475, 1478, 1504, 1524, 1527, 1541, 1541, 1550, 1552, + 1557, 1559, 1564, 1578, 1582, 1591, 1598, 1601, 1607, 1610, + 1616, 1619, 1622, 1628, 1631, 1637, 1640, 1643, 1647, 1653, + 1657, 1664, 1670, 1670, 1679, 1683, 1692, 1695, 1698, 1704, + 1707, 1713, 1746, 1749, 1752, 1759, 1769, 1769, 1782, 1797, + 1811, 1825, 1825, 1868, 1871, 1877, 1884, 1894, 1897, 1900, + 1903, 1906, 1912, 1916, 1920, 1930, 1937, 1943, 1946, 1951 }; #endif @@ -1376,22 +1374,22 @@ static const yytype_uint8 yyr2[] = #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (&yylloc, parser, YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (&yylloc, parser, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) /* Error token number */ #define YYTERROR 1 @@ -1450,10 +1448,10 @@ do { \ /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ YY_ATTRIBUTE_UNUSED -static unsigned +static int yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) { - unsigned res = 0; + int res = 0; int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; if (0 <= yylocp->first_line) { @@ -1496,41 +1494,41 @@ do { \ } while (0) -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, arangodb::aql::Parser* parser) +yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, arangodb::aql::Parser* parser) { - FILE *yyo = yyoutput; - YYUSE (yyo); + FILE *yyoutput = yyo; + YYUSE (yyoutput); YYUSE (yylocationp); YYUSE (parser); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); + YYPRINT (yyo, yytoknum[yytype], *yyvaluep); # endif YYUSE (yytype); } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, arangodb::aql::Parser* parser) +yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, arangodb::aql::Parser* parser) { - YYFPRINTF (yyoutput, "%s %s (", + YYFPRINTF (yyo, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); - YY_LOCATION_PRINT (yyoutput, *yylocationp); - YYFPRINTF (yyoutput, ": "); - yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, parser); - YYFPRINTF (yyoutput, ")"); + YY_LOCATION_PRINT (yyo, *yylocationp); + YYFPRINTF (yyo, ": "); + yy_symbol_value_print (yyo, yytype, yyvaluep, yylocationp, parser); + YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. @@ -1564,7 +1562,7 @@ do { \ static void yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, arangodb::aql::Parser* parser) { - unsigned long int yylno = yyrline[yyrule]; + unsigned long yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", @@ -1575,7 +1573,7 @@ yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) + &yyvsp[(yyi + 1) - (yynrhs)] , &(yylsp[(yyi + 1) - (yynrhs)]) , parser); YYFPRINTF (stderr, "\n"); } @@ -1679,7 +1677,10 @@ yytnamerr (char *yyres, const char *yystr) case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; - /* Fall through. */ + else + goto append; + + append: default: if (yyres) yyres[yyn] = *yyp; @@ -1697,7 +1698,7 @@ yytnamerr (char *yyres, const char *yystr) if (! yyres) return yystrlen (yystr); - return yystpcpy (yyres, yystr) - yyres; + return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres); } # endif @@ -1775,10 +1776,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) + yysize = yysize1; + else return 2; - yysize = yysize1; } } } @@ -1790,6 +1791,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, case N: \ yyformat = S; \ break + default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); @@ -1801,9 +1803,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) + yysize = yysize1; + else return 2; - yysize = yysize1; } if (*yymsg_alloc < yysize) @@ -1955,23 +1958,31 @@ YYLTYPE yylloc = yyloc_default; yylsp[0] = yylloc; goto yysetstate; + /*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | +| yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: +yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; - yysetstate: - *yyssp = yystate; + +/*--------------------------------------------------------------------. +| yynewstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + *yyssp = (yytype_int16) yystate; if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + goto yyexhaustedlab; +#else { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1); -#ifdef yyoverflow +# if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into @@ -1989,15 +2000,11 @@ YYLTYPE yylloc = yyloc_default; &yyvs1, yysize * sizeof (*yyvsp), &yyls1, yysize * sizeof (*yylsp), &yystacksize); - - yyls = yyls1; yyss = yyss1; yyvs = yyvs1; + yyls = yyls1; } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else +# else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; @@ -2014,23 +2021,23 @@ YYLTYPE yylloc = yyloc_default; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); YYSTACK_RELOCATE (yyls_alloc, yyls); -# undef YYSTACK_RELOCATE +# undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif -#endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; yylsp = yyls + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ YYDPRINTF ((stderr, "Entering state %d\n", yystate)); @@ -2039,11 +2046,11 @@ YYLTYPE yylloc = yyloc_default; goto yybackup; + /*-----------. | yybackup. | `-----------*/ yybackup: - /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ @@ -2116,7 +2123,7 @@ yydefault: /*-----------------------------. -| yyreduce -- Do a reduction. | +| yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ @@ -2132,21 +2139,22 @@ yyreduce: GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; - /* Default location. */ + /* Default location. */ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); + yyerror_range[1] = yyloc; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: -#line 389 "Aql/grammar.y" /* yacc.c:1646 */ +#line 389 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 2146 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2154 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 3: -#line 392 "Aql/grammar.y" /* yacc.c:1646 */ +#line 392 "Aql/grammar.y" /* yacc.c:1652 */ { char const* p = (yyvsp[0].node)->getStringValue(); size_t const len = (yyvsp[0].node)->getStringLength(); @@ -2157,217 +2165,217 @@ yyreduce: (yyval.node) = (yyvsp[0].node); } -#line 2161 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2169 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 4: -#line 405 "Aql/grammar.y" /* yacc.c:1646 */ +#line 405 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); node->addMember((yyvsp[0].node)); } -#line 2170 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2178 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 5: -#line 409 "Aql/grammar.y" /* yacc.c:1646 */ +#line 409 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); node->addMember((yyvsp[0].node)); } -#line 2179 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2187 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 6: -#line 413 "Aql/grammar.y" /* yacc.c:1646 */ +#line 413 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); node->addMember((yyvsp[0].node)); } -#line 2188 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2196 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 7: -#line 420 "Aql/grammar.y" /* yacc.c:1646 */ +#line 420 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2195 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2203 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 8: -#line 422 "Aql/grammar.y" /* yacc.c:1646 */ +#line 422 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 2204 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2212 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 9: -#line 425 "Aql/grammar.y" /* yacc.c:1646 */ +#line 425 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->popStack()); auto const& resolver = parser->query()->resolver(); auto withNode = parser->ast()->createNodeWithCollections(node, resolver); parser->ast()->addOperation(withNode); } -#line 2215 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2223 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 10: -#line 434 "Aql/grammar.y" /* yacc.c:1646 */ +#line 434 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2222 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2230 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 11: -#line 439 "Aql/grammar.y" /* yacc.c:1646 */ +#line 439 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2229 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2237 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 12: -#line 444 "Aql/grammar.y" /* yacc.c:1646 */ +#line 444 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2236 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2244 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 13: -#line 446 "Aql/grammar.y" /* yacc.c:1646 */ +#line 446 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->endNested(); } -#line 2244 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2252 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 14: -#line 449 "Aql/grammar.y" /* yacc.c:1646 */ +#line 449 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->endNested(); } -#line 2252 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2260 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 15: -#line 452 "Aql/grammar.y" /* yacc.c:1646 */ +#line 452 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->endNested(); } -#line 2260 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2268 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 16: -#line 455 "Aql/grammar.y" /* yacc.c:1646 */ +#line 455 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->endNested(); } -#line 2268 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2276 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 17: -#line 458 "Aql/grammar.y" /* yacc.c:1646 */ +#line 458 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->endNested(); } -#line 2276 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2284 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 18: -#line 464 "Aql/grammar.y" /* yacc.c:1646 */ +#line 464 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2283 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2291 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 19: -#line 466 "Aql/grammar.y" /* yacc.c:1646 */ +#line 466 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2290 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2298 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 20: -#line 471 "Aql/grammar.y" /* yacc.c:1646 */ +#line 471 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2297 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2305 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 21: -#line 473 "Aql/grammar.y" /* yacc.c:1646 */ +#line 473 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2304 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2312 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 22: -#line 475 "Aql/grammar.y" /* yacc.c:1646 */ +#line 475 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2311 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2319 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 23: -#line 477 "Aql/grammar.y" /* yacc.c:1646 */ +#line 477 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2318 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2326 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 24: -#line 479 "Aql/grammar.y" /* yacc.c:1646 */ +#line 479 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2325 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2333 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 25: -#line 481 "Aql/grammar.y" /* yacc.c:1646 */ +#line 481 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2332 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2340 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 26: -#line 483 "Aql/grammar.y" /* yacc.c:1646 */ +#line 483 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2339 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2347 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 27: -#line 485 "Aql/grammar.y" /* yacc.c:1646 */ +#line 485 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2346 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2354 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 28: -#line 487 "Aql/grammar.y" /* yacc.c:1646 */ +#line 487 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2353 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2361 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 29: -#line 489 "Aql/grammar.y" /* yacc.c:1646 */ +#line 489 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2360 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2368 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 30: -#line 491 "Aql/grammar.y" /* yacc.c:1646 */ +#line 491 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2367 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2375 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 31: -#line 496 "Aql/grammar.y" /* yacc.c:1646 */ +#line 496 "Aql/grammar.y" /* yacc.c:1652 */ { auto wrapperNode = parser->ast()->createNodeArray(); parser->pushArray(wrapperNode); @@ -2375,28 +2383,28 @@ yyreduce: AstNode* node = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); parser->pushArrayElement(node); } -#line 2379 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2387 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 32: -#line 503 "Aql/grammar.y" /* yacc.c:1646 */ +#line 503 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* node = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); parser->pushArrayElement(node); } -#line 2388 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2396 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 33: -#line 510 "Aql/grammar.y" /* yacc.c:1646 */ +#line 510 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->popArray(); } -#line 2396 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2404 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 34: -#line 516 "Aql/grammar.y" /* yacc.c:1646 */ +#line 516 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); // Prune @@ -2404,11 +2412,11 @@ yyreduce: // Options node->addMember(parser->ast()->createNodeNop()); } -#line 2408 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2416 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 35: -#line 523 "Aql/grammar.y" /* yacc.c:1646 */ +#line 523 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); if (TRI_CaseEqualString((yyvsp[-1].strval).value, "PRUNE")) { @@ -2436,11 +2444,11 @@ yyreduce: parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected qualifier '%s', expecting 'PRUNE' or 'OPTIONS'", (yyvsp[-1].strval).value, yylloc.first_line, yylloc.first_column); } } -#line 2440 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2448 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 36: -#line 550 "Aql/grammar.y" /* yacc.c:1646 */ +#line 550 "Aql/grammar.y" /* yacc.c:1652 */ { /* prune and options */ auto node = static_cast(parser->peekStack()); @@ -2460,13 +2468,12 @@ yyreduce: node->addMember((yyvsp[-2].node)); // Options node->addMember((yyvsp[0].node)); - } -#line 2466 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2473 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 37: -#line 574 "Aql/grammar.y" /* yacc.c:1646 */ +#line 573 "Aql/grammar.y" /* yacc.c:1652 */ { auto infoNode = parser->ast()->createNodeArray(); // Direction @@ -2477,11 +2484,11 @@ yyreduce: infoNode->addMember((yyvsp[0].node)); (yyval.node) = infoNode; } -#line 2481 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2488 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 38: -#line 587 "Aql/grammar.y" /* yacc.c:1646 */ +#line 586 "Aql/grammar.y" /* yacc.c:1652 */ { if (!TRI_CaseEqualString((yyvsp[-3].strval).value, "TO")) { parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected qualifier '%s', expecting 'TO'", (yyvsp[-3].strval).value, yylloc.first_line, yylloc.first_column); @@ -2502,11 +2509,11 @@ yyreduce: infoNode->addMember(opts); (yyval.node) = infoNode; } -#line 2506 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2513 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 39: -#line 612 "Aql/grammar.y" /* yacc.c:1646 */ +#line 611 "Aql/grammar.y" /* yacc.c:1652 */ { // first open a new scope (after expression is evaluated) parser->ast()->scopes()->start(arangodb::aql::AQL_SCOPE_FOR); @@ -2526,11 +2533,11 @@ yyreduce: parser->pushStack(variableNode); } -#line 2530 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2537 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 40: -#line 630 "Aql/grammar.y" /* yacc.c:1646 */ +#line 629 "Aql/grammar.y" /* yacc.c:1652 */ { // now we can handle the optional SEARCH condition and OPTIONS. AstNode* variableNode = static_cast(parser->popStack()); @@ -2571,11 +2578,11 @@ yyreduce: parser->ast()->addOperation(node); } -#line 2575 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2582 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 41: -#line 670 "Aql/grammar.y" /* yacc.c:1646 */ +#line 669 "Aql/grammar.y" /* yacc.c:1652 */ { // first open a new scope (after expression is evaluated) parser->ast()->scopes()->start(arangodb::aql::AQL_SCOPE_FOR); @@ -2594,22 +2601,31 @@ yyreduce: parser->pushStack(graphInfoNode); // This stack push/pop magic is necessary to allow v, e, and p in the prune condition } -#line 2598 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2605 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 42: -#line 687 "Aql/grammar.y" /* yacc.c:1646 */ +#line 686 "Aql/grammar.y" /* yacc.c:1652 */ { auto graphInfoNode = static_cast(parser->popStack()); auto variablesNode = static_cast(parser->popStack()); + + auto prune = graphInfoNode->getMember(3); + if (prune != nullptr) { + Ast::traverseReadOnly(prune, [&](AstNode const* node) { + if (node->type == NODE_TYPE_REFERENCE && node->hasFlag(AstNodeFlagType::FLAG_SUBQUERY_REFERENCE)) { + parser->registerParseError(TRI_ERROR_QUERY_PARSE, "prune condition must not use a subquery", yylloc.first_line, yylloc.first_column); + } + }); + } auto node = parser->ast()->createNodeTraversal(variablesNode, graphInfoNode); parser->ast()->addOperation(node); } -#line 2609 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2625 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 43: -#line 693 "Aql/grammar.y" /* yacc.c:1646 */ +#line 701 "Aql/grammar.y" /* yacc.c:1652 */ { // first open a new scope (after expression is evaluated) parser->ast()->scopes()->start(arangodb::aql::AQL_SCOPE_FOR); @@ -2628,51 +2644,51 @@ yyreduce: parser->ast()->addOperation(node); } -#line 2632 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2648 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 44: -#line 714 "Aql/grammar.y" /* yacc.c:1646 */ +#line 722 "Aql/grammar.y" /* yacc.c:1652 */ { // operand is a reference. can use it directly auto node = parser->ast()->createNodeFilter((yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 2642 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2658 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 45: -#line 722 "Aql/grammar.y" /* yacc.c:1646 */ +#line 730 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2649 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2665 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 46: -#line 727 "Aql/grammar.y" /* yacc.c:1646 */ +#line 735 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2656 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2672 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 47: -#line 729 "Aql/grammar.y" /* yacc.c:1646 */ +#line 737 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2663 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2679 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 48: -#line 734 "Aql/grammar.y" /* yacc.c:1646 */ +#line 742 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeLet((yyvsp[-2].strval).value, (yyvsp[-2].strval).length, (yyvsp[0].node), true); parser->ast()->addOperation(node); } -#line 2672 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2688 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 49: -#line 741 "Aql/grammar.y" /* yacc.c:1646 */ +#line 749 "Aql/grammar.y" /* yacc.c:1652 */ { if (!TRI_CaseEqualString((yyvsp[-2].strval).value, "COUNT")) { parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected qualifier '%s', expecting 'COUNT'", (yyvsp[-2].strval).value, yylloc.first_line, yylloc.first_column); @@ -2680,20 +2696,20 @@ yyreduce: (yyval.strval) = (yyvsp[0].strval); } -#line 2684 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2700 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 50: -#line 751 "Aql/grammar.y" /* yacc.c:1646 */ +#line 759 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 2693 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2709 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 51: -#line 754 "Aql/grammar.y" /* yacc.c:1646 */ +#line 762 "Aql/grammar.y" /* yacc.c:1652 */ { auto list = static_cast(parser->popStack()); @@ -2702,11 +2718,11 @@ yyreduce: } (yyval.node) = list; } -#line 2706 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2722 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 52: -#line 765 "Aql/grammar.y" /* yacc.c:1646 */ +#line 773 "Aql/grammar.y" /* yacc.c:1652 */ { /* COLLECT WITH COUNT INTO var OPTIONS ... */ auto scopes = parser->ast()->scopes(); @@ -2716,11 +2732,11 @@ yyreduce: auto node = parser->ast()->createNodeCollectCount(parser->ast()->createNodeArray(), (yyvsp[-1].strval).value, (yyvsp[-1].strval).length, (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 2720 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2736 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 53: -#line 774 "Aql/grammar.y" /* yacc.c:1646 */ +#line 782 "Aql/grammar.y" /* yacc.c:1652 */ { /* COLLECT var = expr WITH COUNT INTO var OPTIONS ... */ auto scopes = parser->ast()->scopes(); @@ -2733,11 +2749,11 @@ yyreduce: auto node = parser->ast()->createNodeCollectCount((yyvsp[-2].node), (yyvsp[-1].strval).value, (yyvsp[-1].strval).length, (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 2737 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2753 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 54: -#line 786 "Aql/grammar.y" /* yacc.c:1646 */ +#line 794 "Aql/grammar.y" /* yacc.c:1652 */ { /* AGGREGATE var = expr OPTIONS ... */ std::unordered_set variablesIntroduced; @@ -2762,11 +2778,11 @@ yyreduce: auto node = parser->ast()->createNodeCollect(parser->ast()->createNodeArray(), (yyvsp[-2].node), into, intoExpression, nullptr, (yyvsp[-1].node)); parser->ast()->addOperation(node); } -#line 2766 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2782 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 55: -#line 810 "Aql/grammar.y" /* yacc.c:1646 */ +#line 818 "Aql/grammar.y" /* yacc.c:1652 */ { /* COLLECT var = expr AGGREGATE var = expr OPTIONS ... */ std::unordered_set variablesIntroduced; @@ -2823,11 +2839,11 @@ yyreduce: auto node = parser->ast()->createNodeCollect((yyvsp[-3].node), (yyvsp[-2].node), into, intoExpression, nullptr, (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 2827 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2843 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 56: -#line 866 "Aql/grammar.y" /* yacc.c:1646 */ +#line 874 "Aql/grammar.y" /* yacc.c:1652 */ { /* COLLECT var = expr INTO var OPTIONS ... */ std::unordered_set variablesIntroduced; @@ -2847,11 +2863,11 @@ yyreduce: auto node = parser->ast()->createNodeCollect((yyvsp[-2].node), parser->ast()->createNodeArray(), into, intoExpression, nullptr, (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 2851 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2867 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 57: -#line 885 "Aql/grammar.y" /* yacc.c:1646 */ +#line 893 "Aql/grammar.y" /* yacc.c:1652 */ { /* COLLECT var = expr INTO var KEEP ... OPTIONS ... */ std::unordered_set variablesIntroduced; @@ -2876,61 +2892,61 @@ yyreduce: auto node = parser->ast()->createNodeCollect((yyvsp[-3].node), parser->ast()->createNodeArray(), into, intoExpression, (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 2880 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2896 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 58: -#line 912 "Aql/grammar.y" /* yacc.c:1646 */ +#line 920 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2887 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2903 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 59: -#line 914 "Aql/grammar.y" /* yacc.c:1646 */ +#line 922 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 2894 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2910 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 60: -#line 919 "Aql/grammar.y" /* yacc.c:1646 */ +#line 927 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeAssign((yyvsp[-2].strval).value, (yyvsp[-2].strval).length, (yyvsp[0].node)); parser->pushArrayElement(node); } -#line 2903 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2919 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 61: -#line 926 "Aql/grammar.y" /* yacc.c:1646 */ +#line 934 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = nullptr; } -#line 2911 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2927 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 62: -#line 929 "Aql/grammar.y" /* yacc.c:1646 */ +#line 937 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 2919 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2935 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 63: -#line 932 "Aql/grammar.y" /* yacc.c:1646 */ +#line 940 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); node->addMember(parser->ast()->createNodeValueString((yyvsp[-2].strval).value, (yyvsp[-2].strval).length)); node->addMember((yyvsp[0].node)); (yyval.node) = node; } -#line 2930 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2946 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 64: -#line 941 "Aql/grammar.y" /* yacc.c:1646 */ +#line 949 "Aql/grammar.y" /* yacc.c:1652 */ { if (! parser->ast()->scopes()->existsVariable((yyvsp[0].strval).value, (yyvsp[0].strval).length)) { parser->registerParseError(TRI_ERROR_QUERY_PARSE, "use of unknown variable '%s' for KEEP", (yyvsp[0].strval).value, yylloc.first_line, yylloc.first_column); @@ -2945,11 +2961,11 @@ yyreduce: node->setFlag(FLAG_KEEP_VARIABLENAME); parser->pushArrayElement(node); } -#line 2949 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2965 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 65: -#line 955 "Aql/grammar.y" /* yacc.c:1646 */ +#line 963 "Aql/grammar.y" /* yacc.c:1652 */ { if (! parser->ast()->scopes()->existsVariable((yyvsp[0].strval).value, (yyvsp[0].strval).length)) { parser->registerParseError(TRI_ERROR_QUERY_PARSE, "use of unknown variable '%s' for KEEP", (yyvsp[0].strval).value, yylloc.first_line, yylloc.first_column); @@ -2964,11 +2980,11 @@ yyreduce: node->setFlag(FLAG_KEEP_VARIABLENAME); parser->pushArrayElement(node); } -#line 2968 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2984 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 66: -#line 972 "Aql/grammar.y" /* yacc.c:1646 */ +#line 980 "Aql/grammar.y" /* yacc.c:1652 */ { if (!TRI_CaseEqualString((yyvsp[0].strval).value, "KEEP")) { parser->registerParseError(TRI_ERROR_QUERY_PARSE, "unexpected qualifier '%s', expecting 'KEEP'", (yyvsp[0].strval).value, yylloc.first_line, yylloc.first_column); @@ -2977,158 +2993,158 @@ yyreduce: auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 2981 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 2997 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 67: -#line 979 "Aql/grammar.y" /* yacc.c:1646 */ +#line 987 "Aql/grammar.y" /* yacc.c:1652 */ { auto list = static_cast(parser->popStack()); (yyval.node) = list; } -#line 2990 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3006 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 68: -#line 986 "Aql/grammar.y" /* yacc.c:1646 */ +#line 994 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 2999 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3015 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 69: -#line 989 "Aql/grammar.y" /* yacc.c:1646 */ +#line 997 "Aql/grammar.y" /* yacc.c:1652 */ { auto list = static_cast(parser->popStack()); (yyval.node) = list; } -#line 3008 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3024 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 70: -#line 996 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1004 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 3017 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3033 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 71: -#line 999 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1007 "Aql/grammar.y" /* yacc.c:1652 */ { auto list = static_cast(parser->popStack()); auto node = parser->ast()->createNodeSort(list); parser->ast()->addOperation(node); } -#line 3027 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3043 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 72: -#line 1007 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1015 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushArrayElement((yyvsp[0].node)); } -#line 3035 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3051 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 73: -#line 1010 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1018 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushArrayElement((yyvsp[0].node)); } -#line 3043 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3059 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 74: -#line 1016 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1024 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeSortElement((yyvsp[-1].node), (yyvsp[0].node)); } -#line 3051 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3067 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 75: -#line 1022 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1030 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueBool(true); } -#line 3059 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3075 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 76: -#line 1025 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1033 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueBool(true); } -#line 3067 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3083 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 77: -#line 1028 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1036 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueBool(false); } -#line 3075 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3091 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 78: -#line 1031 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1039 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3083 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3099 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 79: -#line 1037 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1045 "Aql/grammar.y" /* yacc.c:1652 */ { auto offset = parser->ast()->createNodeValueInt(0); auto node = parser->ast()->createNodeLimit(offset, (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3093 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3109 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 80: -#line 1042 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1050 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeLimit((yyvsp[-2].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3102 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3118 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 81: -#line 1049 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1057 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeReturn((yyvsp[0].node)); parser->ast()->addOperation(node); parser->ast()->scopes()->endNested(); } -#line 3112 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3128 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 82: -#line 1057 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1065 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3120 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3136 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 83: -#line 1060 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1068 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3128 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3144 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 84: -#line 1066 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1074 "Aql/grammar.y" /* yacc.c:1652 */ { if (!parser->configureWriteQuery((yyvsp[-1].node), (yyvsp[0].node))) { YYABORT; @@ -3136,11 +3152,11 @@ yyreduce: auto node = parser->ast()->createNodeRemove((yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3140 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3156 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 85: -#line 1076 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1084 "Aql/grammar.y" /* yacc.c:1652 */ { if (!parser->configureWriteQuery((yyvsp[-1].node), (yyvsp[0].node))) { YYABORT; @@ -3148,11 +3164,11 @@ yyreduce: auto node = parser->ast()->createNodeInsert((yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3152 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3168 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 86: -#line 1086 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1094 "Aql/grammar.y" /* yacc.c:1652 */ { if (!parser->configureWriteQuery((yyvsp[-1].node), (yyvsp[0].node))) { YYABORT; @@ -3161,11 +3177,11 @@ yyreduce: AstNode* node = parser->ast()->createNodeUpdate(nullptr, (yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3165 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3181 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 87: -#line 1094 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1102 "Aql/grammar.y" /* yacc.c:1652 */ { if (!parser->configureWriteQuery((yyvsp[-1].node), (yyvsp[0].node))) { YYABORT; @@ -3174,18 +3190,18 @@ yyreduce: AstNode* node = parser->ast()->createNodeUpdate((yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3178 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3194 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 88: -#line 1105 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1113 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3185 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3201 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 89: -#line 1110 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1118 "Aql/grammar.y" /* yacc.c:1652 */ { if (!parser->configureWriteQuery((yyvsp[-1].node), (yyvsp[0].node))) { YYABORT; @@ -3194,11 +3210,11 @@ yyreduce: AstNode* node = parser->ast()->createNodeReplace(nullptr, (yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3198 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3214 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 90: -#line 1118 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1126 "Aql/grammar.y" /* yacc.c:1652 */ { if (!parser->configureWriteQuery((yyvsp[-1].node), (yyvsp[0].node))) { YYABORT; @@ -3207,44 +3223,44 @@ yyreduce: AstNode* node = parser->ast()->createNodeReplace((yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3211 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3227 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 91: -#line 1129 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1137 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3218 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3234 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 92: -#line 1134 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1142 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = static_cast(NODE_TYPE_UPDATE); } -#line 3226 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3242 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 93: -#line 1137 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1145 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = static_cast(NODE_TYPE_REPLACE); } -#line 3234 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3250 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 94: -#line 1143 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1151 "Aql/grammar.y" /* yacc.c:1652 */ { // reserve a variable named "$OLD", we might need it in the update expression // and in a later return thing parser->pushStack(parser->ast()->createNodeVariable(TRI_CHAR_LENGTH_PAIR(Variable::NAME_OLD), true)); } -#line 3244 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3260 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 95: -#line 1147 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1155 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* variableNode = static_cast(parser->popStack()); @@ -3284,11 +3300,11 @@ yyreduce: parser->pushStack(forNode); } -#line 3288 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3304 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 96: -#line 1185 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1193 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* forNode = static_cast(parser->popStack()); forNode->changeMember(1, (yyvsp[-1].node)); @@ -3300,35 +3316,35 @@ yyreduce: auto node = parser->ast()->createNodeUpsert(static_cast((yyvsp[-3].intval)), parser->ast()->createNodeReference(TRI_CHAR_LENGTH_PAIR(Variable::NAME_OLD)), (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[-1].node), (yyvsp[0].node)); parser->ast()->addOperation(node); } -#line 3304 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3320 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 97: -#line 1199 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1207 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeQuantifier(Quantifier::ALL); } -#line 3312 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3328 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 98: -#line 1202 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1210 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeQuantifier(Quantifier::ANY); } -#line 3320 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3336 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 99: -#line 1205 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1213 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeQuantifier(Quantifier::NONE); } -#line 3328 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3344 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 100: -#line 1211 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1219 "Aql/grammar.y" /* yacc.c:1652 */ { auto const scopeType = parser->ast()->scopes()->type(); @@ -3337,83 +3353,83 @@ yyreduce: parser->registerParseError(TRI_ERROR_QUERY_PARSE, "cannot use DISTINCT modifier on top-level query element", yylloc.first_line, yylloc.first_column); } } -#line 3341 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3357 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 101: -#line 1218 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1226 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeDistinct((yyvsp[0].node)); } -#line 3349 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3365 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 102: -#line 1221 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1229 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3357 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3373 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 103: -#line 1227 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1235 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3365 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3381 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 104: -#line 1230 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1238 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3373 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3389 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 105: -#line 1233 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1241 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3381 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3397 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 106: -#line 1236 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1244 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3389 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3405 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 107: -#line 1239 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1247 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3397 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3413 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 108: -#line 1242 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1250 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeRange((yyvsp[-2].node), (yyvsp[0].node)); } -#line 3405 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3421 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 109: -#line 1248 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1256 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.strval) = (yyvsp[0].strval); } -#line 3413 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3429 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 110: -#line 1251 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1259 "Aql/grammar.y" /* yacc.c:1652 */ { std::string temp((yyvsp[-2].strval).value, (yyvsp[-2].strval).length); temp.append("::"); @@ -3427,215 +3443,215 @@ yyreduce: (yyval.strval).value = p; (yyval.strval).length = temp.size(); } -#line 3431 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3447 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 111: -#line 1267 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1275 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushStack((yyvsp[-1].strval).value); auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 3442 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3458 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 112: -#line 1272 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1280 "Aql/grammar.y" /* yacc.c:1652 */ { auto list = static_cast(parser->popStack()); (yyval.node) = parser->ast()->createNodeFunctionCall(static_cast(parser->popStack()), list); } -#line 3451 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3467 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 113: -#line 1276 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1284 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushStack(node); } -#line 3460 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3476 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 114: -#line 1279 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1287 "Aql/grammar.y" /* yacc.c:1652 */ { auto list = static_cast(parser->popStack()); (yyval.node) = parser->ast()->createNodeFunctionCall(TRI_CHAR_LENGTH_PAIR("LIKE"), list); } -#line 3469 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3485 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 115: -#line 1286 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1294 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeUnaryOperator(NODE_TYPE_OPERATOR_UNARY_PLUS, (yyvsp[0].node)); } -#line 3477 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3493 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 116: -#line 1289 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1297 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeUnaryOperator(NODE_TYPE_OPERATOR_UNARY_MINUS, (yyvsp[0].node)); } -#line 3485 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3501 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 117: -#line 1292 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1300 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeUnaryOperator(NODE_TYPE_OPERATOR_UNARY_NOT, (yyvsp[0].node)); } -#line 3493 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3509 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 118: -#line 1298 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1306 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_OR, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3501 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3517 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 119: -#line 1301 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1309 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_AND, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3509 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3525 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 120: -#line 1304 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1312 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_PLUS, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3517 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3533 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 121: -#line 1307 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1315 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_MINUS, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3525 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3541 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 122: -#line 1310 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1318 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_TIMES, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3533 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3549 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 123: -#line 1313 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1321 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_DIV, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3541 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3557 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 124: -#line 1316 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1324 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_MOD, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3549 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3565 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 125: -#line 1319 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1327 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_EQ, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3557 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3573 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 126: -#line 1322 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1330 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_NE, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3565 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3581 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 127: -#line 1325 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1333 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_LT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3573 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3589 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 128: -#line 1328 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1336 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_GT, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3581 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3597 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 129: -#line 1331 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1339 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_LE, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3589 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3605 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 130: -#line 1334 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1342 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_GE, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3597 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3613 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 131: -#line 1337 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1345 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_IN, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3605 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3621 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 132: -#line 1340 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1348 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryOperator(NODE_TYPE_OPERATOR_BINARY_NIN, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3613 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3629 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 133: -#line 1343 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1351 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* arguments = parser->ast()->createNodeArray(2); arguments->addMember((yyvsp[-2].node)); arguments->addMember((yyvsp[0].node)); (yyval.node) = parser->ast()->createNodeFunctionCall(TRI_CHAR_LENGTH_PAIR("LIKE"), arguments); } -#line 3624 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3640 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 134: -#line 1349 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1357 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* arguments = parser->ast()->createNodeArray(2); arguments->addMember((yyvsp[-2].node)); arguments->addMember((yyvsp[0].node)); (yyval.node) = parser->ast()->createNodeFunctionCall(TRI_CHAR_LENGTH_PAIR("REGEX_TEST"), arguments); } -#line 3635 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3651 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 135: -#line 1355 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1363 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* arguments = parser->ast()->createNodeArray(2); arguments->addMember((yyvsp[-2].node)); @@ -3643,122 +3659,122 @@ yyreduce: AstNode* node = parser->ast()->createNodeFunctionCall(TRI_CHAR_LENGTH_PAIR("REGEX_TEST"), arguments); (yyval.node) = parser->ast()->createNodeUnaryOperator(NODE_TYPE_OPERATOR_UNARY_NOT, node); } -#line 3647 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3663 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 136: -#line 1362 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1370 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_EQ, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3655 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3671 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 137: -#line 1365 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1373 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_NE, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3663 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3679 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 138: -#line 1368 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1376 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_LT, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3671 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3687 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 139: -#line 1371 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1379 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_GT, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3679 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3695 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 140: -#line 1374 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1382 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_LE, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3687 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3703 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 141: -#line 1377 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1385 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_GE, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3695 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3711 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 142: -#line 1380 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1388 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_IN, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3703 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3719 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 143: -#line 1383 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1391 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeBinaryArrayOperator(NODE_TYPE_OPERATOR_BINARY_ARRAY_NIN, (yyvsp[-3].node), (yyvsp[0].node), (yyvsp[-2].node)); } -#line 3711 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3727 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 144: -#line 1389 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1397 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeTernaryOperator((yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); } -#line 3719 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3735 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 145: -#line 1392 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1400 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeTernaryOperator((yyvsp[-3].node), (yyvsp[-3].node), (yyvsp[0].node)); } -#line 3727 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3743 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 146: -#line 1398 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1406 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3734 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3750 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 147: -#line 1400 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1408 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3741 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3757 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 148: -#line 1405 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1413 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3749 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3765 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 149: -#line 1408 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1416 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->start(arangodb::aql::AQL_SCOPE_SUBQUERY); parser->ast()->startSubQuery(); } -#line 3758 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3774 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 150: -#line 1411 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1419 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* node = parser->ast()->endSubQuery(); parser->ast()->scopes()->endCurrent(); @@ -3767,100 +3783,100 @@ yyreduce: auto subQuery = parser->ast()->createNodeLet(variableName.c_str(), variableName.size(), node, false); parser->ast()->addOperation(subQuery); - (yyval.node) = parser->ast()->createNodeReference(variableName); + (yyval.node) = parser->ast()->createNodeSubqueryReference(variableName); } -#line 3773 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3789 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 151: -#line 1424 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1432 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushArrayElement((yyvsp[0].node)); } -#line 3781 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3797 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 152: -#line 1427 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1435 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushArrayElement((yyvsp[0].node)); } -#line 3789 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3805 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 153: -#line 1433 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1441 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3797 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3813 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 154: -#line 1436 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1444 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 3805 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3821 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 155: -#line 1442 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1450 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushArray(node); } -#line 3814 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3830 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 156: -#line 1445 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1453 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->popArray(); } -#line 3822 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3838 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 157: -#line 1451 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1459 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3829 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3845 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 158: -#line 1453 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1461 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3836 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3852 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 159: -#line 1458 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1466 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushArrayElement((yyvsp[0].node)); } -#line 3844 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3860 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 160: -#line 1461 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1469 "Aql/grammar.y" /* yacc.c:1652 */ { parser->pushArrayElement((yyvsp[0].node)); } -#line 3852 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3868 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 161: -#line 1467 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1475 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = nullptr; } -#line 3860 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3876 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 162: -#line 1470 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1478 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[0].node) == nullptr) { ABORT_OOM @@ -3887,11 +3903,11 @@ yyreduce: (yyval.node) = node; } -#line 3891 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3907 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 163: -#line 1496 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1504 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[-2].node) == nullptr) { ABORT_OOM @@ -3909,19 +3925,19 @@ yyreduce: node->addMember((yyvsp[0].node)); (yyval.node) = node; } -#line 3913 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3929 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 164: -#line 1516 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1524 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = nullptr; } -#line 3921 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3937 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 165: -#line 1519 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1527 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[0].node) == nullptr) { ABORT_OOM @@ -3933,56 +3949,56 @@ yyreduce: (yyval.node) = (yyvsp[0].node); } -#line 3937 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3953 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 166: -#line 1533 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1541 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeObject(); parser->pushStack(node); } -#line 3946 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3962 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 167: -#line 1536 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1544 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = static_cast(parser->popStack()); } -#line 3954 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3970 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 168: -#line 1542 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1550 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3961 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3977 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 169: -#line 1544 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1552 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3968 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3984 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 170: -#line 1549 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1557 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3975 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3991 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 171: -#line 1551 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1559 "Aql/grammar.y" /* yacc.c:1652 */ { } -#line 3982 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 3998 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 172: -#line 1556 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1564 "Aql/grammar.y" /* yacc.c:1652 */ { // attribute-name-only (comparable to JS enhanced object literals, e.g. { foo, bar }) auto ast = parser->ast(); @@ -3997,20 +4013,20 @@ yyreduce: auto node = ast->createNodeReference(variable); parser->pushObjectElement((yyvsp[0].strval).value, (yyvsp[0].strval).length, node); } -#line 4001 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4017 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 173: -#line 1570 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1578 "Aql/grammar.y" /* yacc.c:1652 */ { // attribute-name : attribute-value parser->pushObjectElement((yyvsp[-2].strval).value, (yyvsp[-2].strval).length, (yyvsp[0].node)); } -#line 4010 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4026 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 174: -#line 1574 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1582 "Aql/grammar.y" /* yacc.c:1652 */ { // bind-parameter : attribute-value if ((yyvsp[-2].strval).length < 1 || (yyvsp[-2].strval).value[0] == '@') { @@ -4020,232 +4036,232 @@ yyreduce: auto param = parser->ast()->createNodeParameter((yyvsp[-2].strval).value, (yyvsp[-2].strval).length); parser->pushObjectElement(param, (yyvsp[0].node)); } -#line 4024 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4040 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 175: -#line 1583 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1591 "Aql/grammar.y" /* yacc.c:1652 */ { // [ attribute-name-expression ] : attribute-value parser->pushObjectElement((yyvsp[-3].node), (yyvsp[0].node)); } -#line 4033 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4049 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 176: -#line 1590 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1598 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = 1; } -#line 4041 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4057 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 177: -#line 1593 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1601 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = (yyvsp[-1].intval) + 1; } -#line 4049 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4065 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 178: -#line 1599 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1607 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = nullptr; } -#line 4057 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4073 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 179: -#line 1602 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1610 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4065 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4081 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 180: -#line 1608 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1616 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = nullptr; } -#line 4073 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4089 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 181: -#line 1611 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1619 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeArrayLimit(nullptr, (yyvsp[0].node)); } -#line 4081 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4097 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 182: -#line 1614 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1622 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeArrayLimit((yyvsp[-2].node), (yyvsp[0].node)); } -#line 4089 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4105 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 183: -#line 1620 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1628 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = nullptr; } -#line 4097 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4113 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 184: -#line 1623 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1631 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4105 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4121 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 185: -#line 1629 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1637 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 4113 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4129 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 186: -#line 1632 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1640 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4121 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4137 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 187: -#line 1635 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1643 "Aql/grammar.y" /* yacc.c:1652 */ { auto tmp = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); (yyval.node) = parser->ast()->createNodeCollectionDirection((yyvsp[-1].intval), tmp); } -#line 4130 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4146 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 188: -#line 1639 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1647 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeCollectionDirection((yyvsp[-1].intval), (yyvsp[0].node)); } -#line 4138 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4154 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 189: -#line 1645 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1653 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); node->addMember((yyvsp[0].node)); } -#line 4147 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4163 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 190: -#line 1649 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1657 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->peekStack()); node->addMember((yyvsp[0].node)); } -#line 4156 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4172 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 191: -#line 1656 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1664 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); node->addMember((yyvsp[0].node)); auto const& resolver = parser->query()->resolver(); (yyval.node) = parser->ast()->createNodeCollectionList(node, resolver); } -#line 4167 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4183 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 192: -#line 1662 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1670 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = parser->ast()->createNodeArray(); parser->pushStack(node); node->addMember((yyvsp[-1].node)); } -#line 4177 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4193 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 193: -#line 1666 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1674 "Aql/grammar.y" /* yacc.c:1652 */ { auto node = static_cast(parser->popStack()); auto const& resolver = parser->query()->resolver(); (yyval.node) = parser->ast()->createNodeCollectionList(node, resolver); } -#line 4187 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4203 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 194: -#line 1671 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1679 "Aql/grammar.y" /* yacc.c:1652 */ { // graph name (yyval.node) = (yyvsp[0].node); } -#line 4196 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4212 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 195: -#line 1675 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1683 "Aql/grammar.y" /* yacc.c:1652 */ { // graph name (yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 4205 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4221 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 196: -#line 1684 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1692 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = 2; } -#line 4213 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4229 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 197: -#line 1687 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1695 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = 1; } -#line 4221 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4237 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 198: -#line 1690 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1698 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.intval) = 0; } -#line 4229 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4245 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 199: -#line 1696 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1704 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeDirection((yyvsp[0].intval), 1); } -#line 4237 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4253 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 200: -#line 1699 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1707 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeDirection((yyvsp[0].intval), (yyvsp[-1].node)); } -#line 4245 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4261 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 201: -#line 1705 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1713 "Aql/grammar.y" /* yacc.c:1652 */ { // variable or collection or view auto ast = parser->ast(); @@ -4279,27 +4295,27 @@ yyreduce: (yyval.node) = node; } -#line 4283 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4299 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 202: -#line 1738 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1746 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4291 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4307 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 203: -#line 1741 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1749 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4299 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4315 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 204: -#line 1744 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1752 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); @@ -4307,11 +4323,11 @@ yyreduce: ABORT_OOM } } -#line 4311 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4327 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 205: -#line 1751 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1759 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[-1].node)->type == NODE_TYPE_EXPANSION) { // create a dummy passthru node that reduces and evaluates the expansion first @@ -4322,20 +4338,20 @@ yyreduce: (yyval.node) = (yyvsp[-1].node); } } -#line 4326 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4342 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 206: -#line 1761 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1769 "Aql/grammar.y" /* yacc.c:1652 */ { parser->ast()->scopes()->start(arangodb::aql::AQL_SCOPE_SUBQUERY); parser->ast()->startSubQuery(); } -#line 4335 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4351 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 207: -#line 1764 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1772 "Aql/grammar.y" /* yacc.c:1652 */ { AstNode* node = parser->ast()->endSubQuery(); parser->ast()->scopes()->endCurrent(); @@ -4346,11 +4362,11 @@ yyreduce: (yyval.node) = parser->ast()->createNodeReference(variableName); } -#line 4350 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4366 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 208: -#line 1774 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1782 "Aql/grammar.y" /* yacc.c:1652 */ { // named variable access, e.g. variable.reference if ((yyvsp[-2].node)->type == NODE_TYPE_EXPANSION) { @@ -4366,11 +4382,11 @@ yyreduce: (yyval.node) = parser->ast()->createNodeAttributeAccess((yyvsp[-2].node), (yyvsp[0].strval).value, (yyvsp[0].strval).length); } } -#line 4370 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4386 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 209: -#line 1789 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1797 "Aql/grammar.y" /* yacc.c:1652 */ { // named variable access, e.g. variable.@reference if ((yyvsp[-2].node)->type == NODE_TYPE_EXPANSION) { @@ -4385,11 +4401,11 @@ yyreduce: (yyval.node) = parser->ast()->createNodeBoundAttributeAccess((yyvsp[-2].node), (yyvsp[0].node)); } } -#line 4389 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4405 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 210: -#line 1803 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1811 "Aql/grammar.y" /* yacc.c:1652 */ { // indexed variable access, e.g. variable[index] if ((yyvsp[-3].node)->type == NODE_TYPE_EXPANSION) { @@ -4404,11 +4420,11 @@ yyreduce: (yyval.node) = parser->ast()->createNodeIndexedAccess((yyvsp[-3].node), (yyvsp[-1].node)); } } -#line 4408 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4424 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 211: -#line 1817 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1825 "Aql/grammar.y" /* yacc.c:1652 */ { // variable expansion, e.g. variable[*], with optional FILTER, LIMIT and RETURN clauses if ((yyvsp[0].intval) > 1 && (yyvsp[-2].node)->type == NODE_TYPE_EXPANSION) { @@ -4432,11 +4448,11 @@ yyreduce: auto scopes = parser->ast()->scopes(); scopes->stackCurrentVariable(scopes->getVariable(nextName)); } -#line 4436 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4452 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 212: -#line 1839 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1847 "Aql/grammar.y" /* yacc.c:1652 */ { auto scopes = parser->ast()->scopes(); scopes->unstackCurrentVariable(); @@ -4455,27 +4471,27 @@ yyreduce: (yyval.node) = parser->ast()->createNodeExpansion((yyvsp[-5].intval), iterator, parser->ast()->createNodeReference(variable->name), (yyvsp[-3].node), (yyvsp[-2].node), (yyvsp[-1].node)); } } -#line 4459 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4475 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 213: -#line 1860 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1868 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4467 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4483 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 214: -#line 1863 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1871 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4475 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4491 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 215: -#line 1869 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1877 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[0].node) == nullptr) { ABORT_OOM @@ -4483,11 +4499,11 @@ yyreduce: (yyval.node) = (yyvsp[0].node); } -#line 4487 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4503 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 216: -#line 1876 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1884 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[0].node) == nullptr) { ABORT_OOM @@ -4495,69 +4511,69 @@ yyreduce: (yyval.node) = (yyvsp[0].node); } -#line 4499 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4515 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 217: -#line 1886 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1894 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueString((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 4507 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4523 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 218: -#line 1889 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1897 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = (yyvsp[0].node); } -#line 4515 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4531 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 219: -#line 1892 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1900 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueNull(); } -#line 4523 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4539 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 220: -#line 1895 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1903 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueBool(true); } -#line 4531 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4547 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 221: -#line 1898 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1906 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeValueBool(false); } -#line 4539 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4555 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 222: -#line 1904 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1912 "Aql/grammar.y" /* yacc.c:1652 */ { auto const& resolver = parser->query()->resolver(); (yyval.node) = parser->ast()->createNodeCollection(resolver, (yyvsp[0].strval).value, (yyvsp[0].strval).length, arangodb::AccessMode::Type::WRITE); } -#line 4548 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4564 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 223: -#line 1908 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1916 "Aql/grammar.y" /* yacc.c:1652 */ { auto const& resolver = parser->query()->resolver(); (yyval.node) = parser->ast()->createNodeCollection(resolver, (yyvsp[0].strval).value, (yyvsp[0].strval).length, arangodb::AccessMode::Type::WRITE); } -#line 4557 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4573 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 224: -#line 1912 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1920 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[0].strval).length < 2 || (yyvsp[0].strval).value[0] != '@') { parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), (yyvsp[0].strval).value, yylloc.first_line, yylloc.first_column); @@ -4565,11 +4581,11 @@ yyreduce: (yyval.node) = parser->ast()->createNodeParameterDatasource((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 4569 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4585 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 225: -#line 1922 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1930 "Aql/grammar.y" /* yacc.c:1652 */ { if ((yyvsp[0].strval).length < 2 || (yyvsp[0].strval).value[0] != '@') { parser->registerParseError(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE, TRI_errno_string(TRI_ERROR_QUERY_BIND_PARAMETER_TYPE), (yyvsp[0].strval).value, yylloc.first_line, yylloc.first_column); @@ -4577,43 +4593,43 @@ yyreduce: (yyval.node) = parser->ast()->createNodeParameterDatasource((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 4581 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4597 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 226: -#line 1929 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1937 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.node) = parser->ast()->createNodeParameter((yyvsp[0].strval).value, (yyvsp[0].strval).length); } -#line 4589 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4605 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 227: -#line 1935 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1943 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.strval) = (yyvsp[0].strval); } -#line 4597 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4613 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 228: -#line 1938 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1946 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.strval) = (yyvsp[0].strval); } -#line 4605 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4621 "Aql/grammar.cpp" /* yacc.c:1652 */ break; case 229: -#line 1943 "Aql/grammar.y" /* yacc.c:1646 */ +#line 1951 "Aql/grammar.y" /* yacc.c:1652 */ { (yyval.strval) = (yyvsp[0].strval); } -#line 4613 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4629 "Aql/grammar.cpp" /* yacc.c:1652 */ break; -#line 4617 "Aql/grammar.cpp" /* yacc.c:1646 */ +#line 4633 "Aql/grammar.cpp" /* yacc.c:1652 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -4639,14 +4655,13 @@ yyreduce: /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } goto yynewstate; @@ -4729,14 +4744,11 @@ yyerrlab: | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - yyerror_range[1] = yylsp[1-yylen]; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); @@ -4802,6 +4814,7 @@ yyacceptlab: yyresult = 0; goto yyreturn; + /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ @@ -4809,6 +4822,7 @@ yyabortlab: yyresult = 1; goto yyreturn; + #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | @@ -4819,6 +4833,10 @@ yyexhaustedlab: /* Fall through. */ #endif + +/*-----------------------------------------------------. +| yyreturn -- parsing is finished, return the result. | +`-----------------------------------------------------*/ yyreturn: if (yychar != YYEMPTY) { diff --git a/arangod/Aql/grammar.h b/arangod/Aql/grammar.h index 69f5372e46..aaecbda37e 100644 --- a/arangod/Aql/grammar.h +++ b/arangod/Aql/grammar.h @@ -1,8 +1,9 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.3.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, + Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +31,9 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +/* Undocumented macros, especially those whose name start with YY_, + are private implementation details. Do not rely on them. */ + #ifndef YY_AQL_AQL_GRAMMAR_HPP_INCLUDED # define YY_AQL_AQL_GRAMMAR_HPP_INCLUDED /* Debug traces. */ @@ -125,7 +129,7 @@ extern int Aqldebug; union YYSTYPE { -#line 34 "Aql/grammar.y" /* yacc.c:1909 */ +#line 34 "Aql/grammar.y" /* yacc.c:1921 */ arangodb::aql::AstNode* node; struct { @@ -135,7 +139,7 @@ union YYSTYPE bool boolval; int64_t intval; -#line 139 "Aql/grammar.hpp" /* yacc.c:1909 */ +#line 143 "Aql/grammar.hpp" /* yacc.c:1921 */ }; typedef union YYSTYPE YYSTYPE; diff --git a/arangod/Aql/grammar.hpp b/arangod/Aql/grammar.hpp index 69f5372e46..aaecbda37e 100644 --- a/arangod/Aql/grammar.hpp +++ b/arangod/Aql/grammar.hpp @@ -1,8 +1,9 @@ -/* A Bison parser, made by GNU Bison 3.0.4. */ +/* A Bison parser, made by GNU Bison 3.3.2. */ /* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, + Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +31,9 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +/* Undocumented macros, especially those whose name start with YY_, + are private implementation details. Do not rely on them. */ + #ifndef YY_AQL_AQL_GRAMMAR_HPP_INCLUDED # define YY_AQL_AQL_GRAMMAR_HPP_INCLUDED /* Debug traces. */ @@ -125,7 +129,7 @@ extern int Aqldebug; union YYSTYPE { -#line 34 "Aql/grammar.y" /* yacc.c:1909 */ +#line 34 "Aql/grammar.y" /* yacc.c:1921 */ arangodb::aql::AstNode* node; struct { @@ -135,7 +139,7 @@ union YYSTYPE bool boolval; int64_t intval; -#line 139 "Aql/grammar.hpp" /* yacc.c:1909 */ +#line 143 "Aql/grammar.hpp" /* yacc.c:1921 */ }; typedef union YYSTYPE YYSTYPE; diff --git a/arangod/Aql/grammar.y b/arangod/Aql/grammar.y index 57e4f80001..80baa9dabf 100644 --- a/arangod/Aql/grammar.y +++ b/arangod/Aql/grammar.y @@ -566,7 +566,6 @@ prune_and_options: node->addMember($2); // Options node->addMember($4); - } ; @@ -687,6 +686,15 @@ for_statement: } prune_and_options { auto graphInfoNode = static_cast(parser->popStack()); auto variablesNode = static_cast(parser->popStack()); + + auto prune = graphInfoNode->getMember(3); + if (prune != nullptr) { + Ast::traverseReadOnly(prune, [&](AstNode const* node) { + if (node->type == NODE_TYPE_REFERENCE && node->hasFlag(AstNodeFlagType::FLAG_SUBQUERY_REFERENCE)) { + parser->registerParseError(TRI_ERROR_QUERY_PARSE, "prune condition must not use a subquery", yylloc.first_line, yylloc.first_column); + } + }); + } auto node = parser->ast()->createNodeTraversal(variablesNode, graphInfoNode); parser->ast()->addOperation(node); } @@ -1416,7 +1424,7 @@ expression_or_query: auto subQuery = parser->ast()->createNodeLet(variableName.c_str(), variableName.size(), node, false); parser->ast()->addOperation(subQuery); - $$ = parser->ast()->createNodeReference(variableName); + $$ = parser->ast()->createNodeSubqueryReference(variableName); } ; diff --git a/tests/js/server/aql/aql-graph-traverser.js b/tests/js/server/aql/aql-graph-traverser.js index d6db91205b..c9e51be666 100644 --- a/tests/js/server/aql/aql-graph-traverser.js +++ b/tests/js/server/aql/aql-graph-traverser.js @@ -2021,6 +2021,20 @@ function complexFilteringSuite() { tearDownAll: cleanup, + testPruneWithSubquery: function () { + let query = `FOR v,e,p IN 1..100 OUTBOUND @start @ecol PRUNE 2 <= LENGTH(FOR w IN p.vertices FILTER w._id == v._id RETURN 1) RETURN p`; + try { + let bindVars = { + '@eCol': en, + 'start': vertex.Tri1 + }; + db._query(query, bindVars); + fail(); + } catch (err) { + assertEqual(err.errorNum, errors.ERROR_QUERY_PARSE.code); + } + }, + testVertexEarlyPruneHighDepth: function () { var query = `WITH ${vn} FOR v, e, p IN 100 OUTBOUND @start @@eCol