From 786ea250bab8ef4aa4ef220b0f93c53ad38afd06 Mon Sep 17 00:00:00 2001 From: Max Neunhoeffer Date: Wed, 21 May 2014 11:20:03 +0200 Subject: [PATCH] Snapshot. --- .../Ahuacatl/ahuacatl-access-optimiser.cpp | 38 +- arangod/Ahuacatl/ahuacatl-ast-node.cpp | 6 +- arangod/Ahuacatl/ahuacatl-bind-parameter.cpp | 9 +- arangod/Ahuacatl/ahuacatl-codegen.cpp | 7 +- arangod/Ahuacatl/ahuacatl-codegen.h | 2 +- arangod/Ahuacatl/ahuacatl-collections.cpp | 2 +- arangod/Ahuacatl/ahuacatl-error.cpp | 3 +- arangod/Ahuacatl/ahuacatl-explain.cpp | 6 +- arangod/Ahuacatl/ahuacatl-functions.cpp | 3 +- arangod/Ahuacatl/ahuacatl-grammar.cpp | 5136 ++++++++++------- arangod/Ahuacatl/ahuacatl-grammar.h | 4 +- arangod/Ahuacatl/ahuacatl-grammar.yy | 2 +- arangod/Ahuacatl/ahuacatl-index.cpp | 3 +- arangod/Ahuacatl/ahuacatl-optimiser.cpp | 20 +- arangod/Ahuacatl/ahuacatl-scope.cpp | 6 +- .../Ahuacatl/ahuacatl-statement-walker.cpp | 7 +- arangod/Ahuacatl/ahuacatl-variable.cpp | 2 +- arangod/Makefile.files | 8 +- arangod/VocBase/document-collection.h | 34 - arangod/VocBase/replication-dump.cpp | 1 + arangod/VocBase/replication-logger.cpp | 1 + arangod/VocBase/voc-shaper.h | 34 + lib/V8/v8-execution.cpp | 49 +- lib/V8/v8-execution.h | 23 +- 24 files changed, 3075 insertions(+), 2331 deletions(-) diff --git a/arangod/Ahuacatl/ahuacatl-access-optimiser.cpp b/arangod/Ahuacatl/ahuacatl-access-optimiser.cpp index 0c7a65ea82..641ac1108f 100644 --- a/arangod/Ahuacatl/ahuacatl-access-optimiser.cpp +++ b/arangod/Ahuacatl/ahuacatl-access-optimiser.cpp @@ -282,7 +282,7 @@ static bool InsertOrs (TRI_aql_context_t* const context, orElement = FindOrElement(dest, fieldAccess->_fullName); if (orElement == NULL) { // element not found. create a new one - orElement = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(or_element_t), false); + orElement = static_cast(TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(or_element_t), false)); if (orElement == NULL) { // out of memory return false; @@ -2061,7 +2061,7 @@ static TRI_vector_pointer_t* MergeVectors (TRI_aql_context_t* const context, // this is an OR merge // we need to check which elements are contained in just one of the vectors and // remove them. if we don't do this, we would probably restrict the query too much - orElements = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_vector_pointer_t), false); + orElements = static_cast(TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_vector_pointer_t), false)); if (orElements == NULL) { TRI_SetErrorContextAql(__FILE__, __LINE__, context, TRI_ERROR_OUT_OF_MEMORY, NULL); @@ -2159,7 +2159,7 @@ static TRI_vector_pointer_t* MergeVectors (TRI_aql_context_t* const context, static TRI_aql_field_access_t* CreateAccessForNode (TRI_aql_context_t* const context, const TRI_aql_attribute_name_t* const field, - const TRI_aql_node_type_e operator, + const TRI_aql_node_type_e operatorarg, const TRI_aql_node_t* const node) { TRI_aql_field_access_t* fieldAccess; TRI_json_t* value; @@ -2189,7 +2189,7 @@ static TRI_aql_field_access_t* CreateAccessForNode (TRI_aql_context_t* const con SetNameLength(fieldAccess); - if (operator == TRI_AQL_NODE_OPERATOR_BINARY_NE) { + if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_NE) { // create an all items access, and we're done fieldAccess->_type = TRI_AQL_ACCESS_ALL; @@ -2200,7 +2200,7 @@ static TRI_aql_field_access_t* CreateAccessForNode (TRI_aql_context_t* const con node->_type == TRI_AQL_NODE_ATTRIBUTE_ACCESS) { // create the reference access fieldAccess->_type = TRI_AQL_ACCESS_REFERENCE; - fieldAccess->_value._reference._operator = operator; + fieldAccess->_value._reference._operator = operatorarg; if (node->_type == TRI_AQL_NODE_REFERENCE) { fieldAccess->_value._reference._type = TRI_AQL_REFERENCE_VARIABLE; @@ -2225,36 +2225,36 @@ static TRI_aql_field_access_t* CreateAccessForNode (TRI_aql_context_t* const con assert(value != NULL); - if (operator == TRI_AQL_NODE_OPERATOR_BINARY_EQ) { + if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_EQ) { // create an exact value access fieldAccess->_type = TRI_AQL_ACCESS_EXACT; fieldAccess->_value._value = value; } - else if (operator == TRI_AQL_NODE_OPERATOR_BINARY_LT) { + else if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_LT) { // create a single range access fieldAccess->_type = TRI_AQL_ACCESS_RANGE_SINGLE; fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_UPPER_EXCLUDED; fieldAccess->_value._singleRange._value = value; } - else if (operator == TRI_AQL_NODE_OPERATOR_BINARY_LE) { + else if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_LE) { // create a single range access fieldAccess->_type = TRI_AQL_ACCESS_RANGE_SINGLE; fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_UPPER_INCLUDED; fieldAccess->_value._singleRange._value = value; } - else if (operator == TRI_AQL_NODE_OPERATOR_BINARY_GT) { + else if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_GT) { // create a single range access fieldAccess->_type = TRI_AQL_ACCESS_RANGE_SINGLE; fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_LOWER_EXCLUDED; fieldAccess->_value._singleRange._value = value; } - else if (operator == TRI_AQL_NODE_OPERATOR_BINARY_GE) { + else if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_GE) { // create a single range access fieldAccess->_type = TRI_AQL_ACCESS_RANGE_SINGLE; fieldAccess->_value._singleRange._type = TRI_AQL_RANGE_LOWER_INCLUDED; fieldAccess->_value._singleRange._value = value; } - else if (operator == TRI_AQL_NODE_OPERATOR_BINARY_IN) { + else if (operatorarg == TRI_AQL_NODE_OPERATOR_BINARY_IN) { TRI_json_t* list; if (value->_type != TRI_JSON_LIST) { @@ -2301,7 +2301,7 @@ static TRI_aql_field_access_t* CreateAccessForNode (TRI_aql_context_t* const con static TRI_aql_field_access_t* GetAttributeAccess (TRI_aql_context_t* const context, const TRI_aql_attribute_name_t* const field, - const TRI_aql_node_type_e operator, + const TRI_aql_node_type_e operatorarg, const TRI_aql_node_t* const node) { TRI_aql_field_access_t* fieldAccess; @@ -2313,7 +2313,7 @@ static TRI_aql_field_access_t* GetAttributeAccess (TRI_aql_context_t* const cont return NULL; } - fieldAccess = CreateAccessForNode(context, field, operator, node); + fieldAccess = CreateAccessForNode(context, field, operatorarg, node); if (fieldAccess == NULL) { // OOM @@ -2486,7 +2486,7 @@ static TRI_vector_pointer_t* ProcessNode (TRI_aql_context_t* const context, TRI_aql_attribute_name_t* field; TRI_aql_node_t* node1; TRI_aql_node_t* node2; - TRI_aql_node_type_e operator; + TRI_aql_node_type_e oper; bool useBoth; /* @@ -2502,7 +2502,7 @@ static TRI_vector_pointer_t* ProcessNode (TRI_aql_context_t* const context, // collection.attribute|reference|fcall operator const value|reference|attribute access|fcall node1 = lhs; node2 = rhs; - operator = node->_type; + oper = node->_type; if (IsSameAttributeAccess(lhs, rhs)) { // we must not optimise something like FILTER a.x == a.x @@ -2520,7 +2520,7 @@ static TRI_vector_pointer_t* ProcessNode (TRI_aql_context_t* const context, // const value|reference|attribute|fcall access operator collection.attribute|reference|fcall node1 = rhs; node2 = lhs; - operator = TRI_ReverseOperatorRelationalAql(node->_type); + oper = TRI_ReverseOperatorRelationalAql(node->_type); if (IsSameAttributeAccess(lhs, rhs)) { // we must not optimise something like FILTER a.x == a.x @@ -2528,7 +2528,7 @@ static TRI_vector_pointer_t* ProcessNode (TRI_aql_context_t* const context, } - TRI_ASSERT_MAINTAINER(operator != TRI_AQL_NODE_NOP); + TRI_ASSERT_MAINTAINER(oper != TRI_AQL_NODE_NOP); if (lhs->_type == TRI_AQL_NODE_REFERENCE || lhs->_type == TRI_AQL_NODE_ATTRIBUTE_ACCESS || lhs->_type == TRI_AQL_NODE_FCALL) { // expression of type reference|attribute access|fcall operator reference|attribute access|fcall @@ -2555,7 +2555,7 @@ again: field = GetAttributeName(context, node1); if (field && node2->_type != TRI_AQL_NODE_FCALL) { - TRI_aql_field_access_t* attributeAccess = GetAttributeAccess(context, field, operator, node2); + TRI_aql_field_access_t* attributeAccess = GetAttributeAccess(context, field, oper, node2); TRI_vector_pointer_t* result; TRI_DestroyStringBuffer(&field->_name); @@ -2592,7 +2592,7 @@ again: node1 = node2; node2 = tempNode; - operator = TRI_ReverseOperatorRelationalAql(node->_type); + oper = TRI_ReverseOperatorRelationalAql(node->_type); // and try again previous = result; diff --git a/arangod/Ahuacatl/ahuacatl-ast-node.cpp b/arangod/Ahuacatl/ahuacatl-ast-node.cpp index be604f067b..4b49c18903 100644 --- a/arangod/Ahuacatl/ahuacatl-ast-node.cpp +++ b/arangod/Ahuacatl/ahuacatl-ast-node.cpp @@ -1063,7 +1063,8 @@ TRI_aql_node_t* TRI_CreateNodeFcallAql (TRI_aql_context_t* const context, bool TRI_PushListAql (TRI_aql_context_t* const context, const TRI_aql_node_t* const value) { - TRI_aql_node_t* node = TRI_PeekStackParseAql(context); + TRI_aql_node_t* node + = static_cast(TRI_PeekStackParseAql(context)); assert(node); @@ -1083,7 +1084,8 @@ bool TRI_PushListAql (TRI_aql_context_t* const context, bool TRI_PushArrayAql (TRI_aql_context_t* const context, const char* const name, const TRI_aql_node_t* const value) { - TRI_aql_node_t* node = TRI_PeekStackParseAql(context); + TRI_aql_node_t* node + = static_cast(TRI_PeekStackParseAql(context)); TRI_aql_node_t* element; assert(node); diff --git a/arangod/Ahuacatl/ahuacatl-bind-parameter.cpp b/arangod/Ahuacatl/ahuacatl-bind-parameter.cpp index e870cdb4c6..efed5c9800 100644 --- a/arangod/Ahuacatl/ahuacatl-bind-parameter.cpp +++ b/arangod/Ahuacatl/ahuacatl-bind-parameter.cpp @@ -221,7 +221,7 @@ bool TRI_EqualBindParameterAql (TRI_associative_pointer_t* array, void const* element) { TRI_aql_bind_parameter_t* parameter = (TRI_aql_bind_parameter_t*) element; - return TRI_EqualString(key, parameter->_name); + return TRI_EqualString(static_cast(key), parameter->_name); } //////////////////////////////////////////////////////////////////////////////// @@ -281,8 +281,11 @@ bool TRI_AddParameterValuesAql (TRI_aql_context_t* const context, } for (i = 0; i < n; i += 2) { - TRI_json_t* name = TRI_AtVector(¶meters->_value._objects, i); - TRI_json_t* value = TRI_AtVector(¶meters->_value._objects, i + 1); + TRI_json_t* name + = static_cast(TRI_AtVector(¶meters->_value._objects, i)); + TRI_json_t* value + = static_cast(TRI_AtVector(¶meters->_value._objects, + i + 1)); TRI_aql_bind_parameter_t* parameter; assert(TRI_IsStringJson(name)); diff --git a/arangod/Ahuacatl/ahuacatl-codegen.cpp b/arangod/Ahuacatl/ahuacatl-codegen.cpp index 9a4e1501a9..c6cc11882b 100644 --- a/arangod/Ahuacatl/ahuacatl-codegen.cpp +++ b/arangod/Ahuacatl/ahuacatl-codegen.cpp @@ -232,7 +232,7 @@ static bool EqualVariable (TRI_associative_pointer_t* array, void const* element) { TRI_aql_codegen_variable_t* variable = (TRI_aql_codegen_variable_t*) element; - return TRI_EqualString(key, variable->_name); + return TRI_EqualString(static_cast(key), variable->_name); } //////////////////////////////////////////////////////////////////////////////// @@ -2289,7 +2289,8 @@ static void ProcessFor (TRI_aql_codegen_js_t* const generator, TRI_aql_node_t* nameNode = TRI_AQL_NODE_MEMBER(node, 0); TRI_aql_node_t* expressionNode = TRI_AQL_NODE_MEMBER(node, 1); TRI_aql_codegen_register_t sourceRegister = IncRegister(generator); - TRI_aql_for_hint_t* hint = TRI_AQL_NODE_DATA(node); + TRI_aql_for_hint_t* hint + = static_cast(TRI_AQL_NODE_DATA(node)); TRI_string_buffer_t* buffer; bool isList; @@ -2915,7 +2916,7 @@ static TRI_aql_codegen_register_t CreateCode (TRI_aql_codegen_js_t* generator) { for (i = 0; i < n; ++i) { TRI_aql_node_t* node; - node = TRI_AtVectorPointer(statements, i); + node = static_cast(TRI_AtVectorPointer(statements, i)); ProcessNode(generator, node); } diff --git a/arangod/Ahuacatl/ahuacatl-codegen.h b/arangod/Ahuacatl/ahuacatl-codegen.h index b853f0df0b..eab646b265 100644 --- a/arangod/Ahuacatl/ahuacatl-codegen.h +++ b/arangod/Ahuacatl/ahuacatl-codegen.h @@ -85,7 +85,7 @@ typedef struct TRI_aql_codegen_scope_s { TRI_aql_codegen_register_t _limitRegister; // limit offset, limit TRI_aql_codegen_register_t _subqueryRegister; TRI_associative_pointer_t _variables; // list of variables in scope - char* _prefix; // prefix for variable names, used in FUNCTION scopes only + char const* _prefix; // prefix for variable names, used in FUNCTION scopes only TRI_aql_for_hint_t* _hint; // generic hint } TRI_aql_codegen_scope_t; diff --git a/arangod/Ahuacatl/ahuacatl-collections.cpp b/arangod/Ahuacatl/ahuacatl-collections.cpp index 2157fca054..80e6a23fe1 100644 --- a/arangod/Ahuacatl/ahuacatl-collections.cpp +++ b/arangod/Ahuacatl/ahuacatl-collections.cpp @@ -145,7 +145,7 @@ static bool SetupCollections (TRI_aql_context_t* const context) { n = context->_collectionNames._nrAlloc; for (i = 0; i < n; ++i) { - char* name = context->_collectionNames._table[i]; + char* name = static_cast(context->_collectionNames._table[i]); TRI_aql_collection_t* collection; if (name == NULL) { diff --git a/arangod/Ahuacatl/ahuacatl-error.cpp b/arangod/Ahuacatl/ahuacatl-error.cpp index fb4724824b..39e9b40b2c 100644 --- a/arangod/Ahuacatl/ahuacatl-error.cpp +++ b/arangod/Ahuacatl/ahuacatl-error.cpp @@ -179,7 +179,8 @@ char* TRI_GetContextErrorAql (const char* const query, return TRI_DuplicateString2Z(TRI_UNKNOWN_MEM_ZONE, query + offset, queryLength - offset); } - q = result = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, SNIPPET_LENGTH + strlen(SNIPPET_SUFFIX) + 1, false); + q = result = static_cast(TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, + SNIPPET_LENGTH + strlen(SNIPPET_SUFFIX) + 1, false)); if (result == NULL) { // out of memory diff --git a/arangod/Ahuacatl/ahuacatl-explain.cpp b/arangod/Ahuacatl/ahuacatl-explain.cpp index 71d847bdc4..865774cc8c 100644 --- a/arangod/Ahuacatl/ahuacatl-explain.cpp +++ b/arangod/Ahuacatl/ahuacatl-explain.cpp @@ -128,7 +128,9 @@ static bool AddNodeValue (TRI_json_t* row, TRI_aql_node_t* const node) { } if (node->_type == TRI_AQL_NODE_COLLECTION) { - TRI_json_t* extra = TRI_GetJsonCollectionHintAql(TRI_AQL_NODE_DATA(node)); + TRI_json_t* extra = TRI_GetJsonCollectionHintAql( + static_cast + (TRI_AQL_NODE_DATA(node)) ); if (extra != NULL) { TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, @@ -326,7 +328,7 @@ static TRI_aql_node_t* ProcessStatement (TRI_aql_statement_walker_t* const walke "resultVariable", TRI_CreateStringCopyJson(TRI_UNKNOWN_MEM_ZONE, TRI_AQL_NODE_STRING(variableNode))); - hint = TRI_AQL_NODE_DATA(node); + hint = static_cast(TRI_AQL_NODE_DATA(node)); if (hint != NULL && hint->_limit._status == TRI_AQL_LIMIT_USE) { TRI_Insert3ArrayJson(TRI_UNKNOWN_MEM_ZONE, diff --git a/arangod/Ahuacatl/ahuacatl-functions.cpp b/arangod/Ahuacatl/ahuacatl-functions.cpp index fd7cd12b86..6f61f8c457 100644 --- a/arangod/Ahuacatl/ahuacatl-functions.cpp +++ b/arangod/Ahuacatl/ahuacatl-functions.cpp @@ -352,7 +352,8 @@ static bool EqualName (TRI_associative_pointer_t* array, void const* element) { TRI_aql_function_t* function = (TRI_aql_function_t*) element; - return TRI_EqualString(key, function->_externalName); + return TRI_EqualString(static_cast(key), + function->_externalName); } //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/Ahuacatl/ahuacatl-grammar.cpp b/arangod/Ahuacatl/ahuacatl-grammar.cpp index d86c8a62c0..fcd66b5808 100644 --- a/arangod/Ahuacatl/ahuacatl-grammar.cpp +++ b/arangod/Ahuacatl/ahuacatl-grammar.cpp @@ -1,19 +1,19 @@ -/* A Bison parser, made by GNU Bison 2.7.12-4996. */ +/* A Bison parser, made by GNU Bison 3.0.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. -/* Skeleton implementation for Bison LALR(1) parsers in C++ - - Copyright (C) 2002-2013 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 the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -26,15 +26,49 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -// Take the name prefix into account. -#define yylex Ahuacatllex +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ -/* First part of user declarations. */ +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "3.0.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse Ahuacatlparse +#define yylex Ahuacatllex +#define yyerror Ahuacatlerror +#define yydebug Ahuacatldebug +#define yynerrs Ahuacatlnerrs + + +/* Copy the first part of user declarations. */ +#line 10 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:339 */ #include #include @@ -50,13 +84,136 @@ #include "Ahuacatl/ahuacatl-parser-functions.h" #include "Ahuacatl/ahuacatl-scope.h" +#line 88 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:339 */ + +# ifndef YY_NULLPTR +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* In a future release of Bison, this section will be replaced + by #include "ahuacatl-grammar.h". */ +#ifndef YY_AHUACATL_ARANGOD_AHUACATL_AHUACATL_GRAMMAR_H_INCLUDED +# define YY_AHUACATL_ARANGOD_AHUACATL_AHUACATL_GRAMMAR_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int Ahuacatldebug; +#endif + +/* Token type. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + T_END = 0, + T_FOR = 258, + T_LET = 259, + T_FILTER = 260, + T_RETURN = 261, + T_COLLECT = 262, + T_SORT = 263, + T_LIMIT = 264, + T_ASC = 265, + T_DESC = 266, + T_IN = 267, + T_INTO = 268, + T_NULL = 269, + T_TRUE = 270, + T_FALSE = 271, + T_STRING = 272, + T_QUOTED_STRING = 273, + T_INTEGER = 274, + T_DOUBLE = 275, + T_PARAMETER = 276, + T_ASSIGN = 277, + T_NOT = 278, + T_AND = 279, + T_OR = 280, + T_EQ = 281, + T_NE = 282, + T_LT = 283, + T_GT = 284, + T_LE = 285, + T_GE = 286, + T_PLUS = 287, + T_MINUS = 288, + T_TIMES = 289, + T_DIV = 290, + T_MOD = 291, + T_EXPAND = 292, + T_QUESTION = 293, + T_COLON = 294, + T_SCOPE = 295, + T_RANGE = 296, + T_COMMA = 297, + T_OPEN = 298, + T_CLOSE = 299, + T_DOC_OPEN = 300, + T_DOC_CLOSE = 301, + T_LIST_OPEN = 302, + T_LIST_CLOSE = 303, + UMINUS = 304, + UPLUS = 305, + FUNCCALL = 306, + REFERENCE = 307, + INDEXED = 308 + }; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE YYSTYPE; +union YYSTYPE +{ +#line 26 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:355 */ + + TRI_aql_node_t* node; + char* strval; + bool boolval; + int64_t intval; + +#line 190 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:355 */ +}; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + +/* Location type. */ +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED +typedef struct YYLTYPE YYLTYPE; +struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +}; +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif -#include "ahuacatl-grammar.h" +int Ahuacatlparse (TRI_aql_context_t* const context); -/* User implementation prologue. */ +#endif /* !YY_AHUACATL_ARANGOD_AHUACATL_AHUACATL_GRAMMAR_H_INCLUDED */ +/* Copy the second part of user declarations. */ +#line 33 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:358 */ //////////////////////////////////////////////////////////////////////////////// @@ -84,1959 +241,390 @@ void Ahuacatlerror (YYLTYPE* locp, TRI_aql_context_t* const context, const char* #define scanner context->_parser->_scanner +#line 245 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:358 */ +#ifdef short +# undef short +#endif +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif -# ifndef YY_NULL -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULL nullptr -# else -# define YY_NULL 0 -# endif +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int # endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS -# include /* FIXME: INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ -# define YY_(msgid) msgid +# define YY_(Msgid) Msgid # endif #endif -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -# ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (N) \ - { \ - (Current).begin = YYRHSLOC (Rhs, 1).begin; \ - (Current).end = YYRHSLOC (Rhs, N).end; \ - } \ - else \ - { \ - (Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \ - } \ - while (/*CONSTCOND*/ false) +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ # endif +#endif +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# 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. */ -#define YYUSE(e) ((void) (e)) - -/* Enable debugging if requested. */ -#if YYDEBUG - -/* A pseudo ostream that takes yydebug_ into account. */ -# define YYCDEBUG if (yydebug_) (*yycdebug_) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug_) \ - { \ - *yycdebug_ << Title << ' '; \ - yy_symbol_print_ ((Type), (Value), (Location)); \ - *yycdebug_ << std::endl; \ - } \ -} while (false) - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug_) \ - yy_reduce_print_ (Rule); \ -} while (false) - -# define YY_STACK_PRINT() \ -do { \ - if (yydebug_) \ - yystack_print_ (); \ -} while (false) - -#else /* !YYDEBUG */ - -# define YYCDEBUG if (false) std::cerr -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) YYUSE(Type) -# define YY_REDUCE_PRINT(Rule) static_cast(0) -# define YY_STACK_PRINT() static_cast(0) - -#endif /* !YYDEBUG */ - -#define yyerrok (yyerrstatus_ = 0) -#define yyclearin (yychar = yyempty_) - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab -#define YYRECOVERING() (!!yyerrstatus_) - - -namespace Ahuacatl { - - - /* Return YYSTR after stripping away unnecessary quotes and - backslashes, so that it's suitable for yyerror. The heuristic is - that double-quoting is unnecessary unless the string contains an - apostrophe, a comma, or backslash (other than backslash-backslash). - YYSTR is taken from yytname. */ - std::string - parser::yytnamerr_ (const char *yystr) - { - if (*yystr == '"') - { - std::string yyr = ""; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - yyr += *yyp; - break; - - case '"': - return yyr; - } - do_not_strip_quotes: ; - } - - return yystr; - } - - - /// Build a parser object. - parser::parser (TRI_aql_context_t* const context_yyarg) - : -#if YYDEBUG - yydebug_ (false), - yycdebug_ (&std::cerr), -#endif - context (context_yyarg) - { - } - - parser::~parser () - { - } - -#if YYDEBUG - /*--------------------------------. - | Print this symbol on YYOUTPUT. | - `--------------------------------*/ - - inline void - parser::yy_symbol_value_print_ (int yytype, - const semantic_type* yyvaluep, const location_type* yylocationp) - { - YYUSE (yylocationp); - YYUSE (yyvaluep); - std::ostream& yyo = debug_stream (); - std::ostream& yyoutput = yyo; - YYUSE (yyoutput); - YYUSE (yytype); - } - - - void - parser::yy_symbol_print_ (int yytype, - const semantic_type* yyvaluep, const location_type* yylocationp) - { - *yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm") - << ' ' << yytname_[yytype] << " (" - << *yylocationp << ": "; - yy_symbol_value_print_ (yytype, yyvaluep, yylocationp); - *yycdebug_ << ')'; - } +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ #endif - void - parser::yydestruct_ (const char* yymsg, - int yytype, semantic_type* yyvaluep, location_type* yylocationp) - { - YYUSE (yylocationp); - YYUSE (yymsg); - YYUSE (yyvaluep); - - if (yymsg) - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - YYUSE (yytype); - } - - void - parser::yypop_ (unsigned int n) - { - yystate_stack_.pop (n); - yysemantic_stack_.pop (n); - yylocation_stack_.pop (n); - } - -#if YYDEBUG - std::ostream& - parser::debug_stream () const - { - return *yycdebug_; - } - - void - parser::set_debug_stream (std::ostream& o) - { - yycdebug_ = &o; - } - - - parser::debug_level_type - parser::debug_level () const - { - return yydebug_; - } - - void - parser::set_debug_level (debug_level_type l) - { - yydebug_ = l; - } +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif - inline bool - parser::yy_pact_value_is_default_ (int yyvalue) - { - return yyvalue == yypact_ninf_; - } - - inline bool - parser::yy_table_value_is_error_ (int yyvalue) - { - return yyvalue == yytable_ninf_; - } - - int - parser::parse () - { - /// Lookahead and lookahead in internal form. - int yychar = yyempty_; - int yytoken = 0; - - // State. - int yyn; - int yylen = 0; - int yystate = 0; - - // Error handling. - int yynerrs_ = 0; - int yyerrstatus_ = 0; - - /// Semantic value of the lookahead. - static semantic_type yyval_default; - semantic_type yylval = yyval_default; - /// Location of the lookahead. - location_type yylloc; - /// The locations where the error started and ended. - location_type yyerror_range[3]; - - /// $$. - semantic_type yyval; - /// @$. - location_type yyloc; - - int yyresult; - - // FIXME: This shoud be completely indented. It is not yet to - // avoid gratuitous conflicts when merging into the master branch. - try - { - YYCDEBUG << "Starting parse" << std::endl; - - - /* Initialize the stacks. The initial state will be pushed in - yynewstate, since the latter expects the semantical and the - location values to have been already stored, initialize these - stacks with a primary value. */ - yystate_stack_.clear (); - yysemantic_stack_.clear (); - yylocation_stack_.clear (); - yysemantic_stack_.push (yylval); - yylocation_stack_.push (yylloc); - - /* New state. */ - yynewstate: - yystate_stack_.push (yystate); - YYCDEBUG << "Entering state " << yystate << std::endl; - - /* Accept? */ - if (yystate == yyfinal_) - goto yyacceptlab; - - goto yybackup; - - /* Backup. */ - yybackup: - - /* Try to take a decision without lookahead. */ - yyn = yypact_[yystate]; - if (yy_pact_value_is_default_ (yyn)) - goto yydefault; - - /* Read a lookahead token. */ - if (yychar == yyempty_) - { - YYCDEBUG << "Reading a token: "; - yychar = yylex (&yylval, &yylloc, scanner); - } - - /* Convert token to internal form. */ - if (yychar <= yyeof_) - { - yychar = yytoken = yyeof_; - YYCDEBUG << "Now at end of input." << std::endl; - } - else - { - yytoken = yytranslate_ (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || yylast_ < yyn || yycheck_[yyn] != yytoken) - goto yydefault; - - /* Reduce or error. */ - yyn = yytable_[yyn]; - if (yyn <= 0) - { - if (yy_table_value_is_error_ (yyn)) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the token being shifted. */ - yychar = yyempty_; - - yysemantic_stack_.push (yylval); - yylocation_stack_.push (yylloc); - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus_) - --yyerrstatus_; - - yystate = yyn; - goto yynewstate; - - /*-----------------------------------------------------------. - | yydefault -- do the default action for the current state. | - `-----------------------------------------------------------*/ - yydefault: - yyn = yydefact_[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - /*-----------------------------. - | yyreduce -- Do a reduction. | - `-----------------------------*/ - yyreduce: - yylen = yyr2_[yyn]; - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. Otherwise, use the top of the stack. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. */ - if (yylen) - yyval = yysemantic_stack_[yylen - 1]; - else - yyval = yysemantic_stack_[0]; - - // Compute the default @$. - { - slice slice (yylocation_stack_, yylen); - YYLLOC_DEFAULT (yyloc, slice, yylen); - } - - // Perform the reduction. - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: - - { - } - break; - - case 3: - - { - } - break; - - case 4: - - { - } - break; - - case 5: - - { - } - break; - - case 6: - - { - } - break; - - case 7: - - { - } - break; - - case 8: - - { - } - break; - - case 9: - - { - } - break; - - case 10: - - { - } - break; - - case 11: - - { - TRI_aql_node_t* node; - - if (! TRI_StartScopeAql(context, TRI_AQL_SCOPE_FOR)) { - ABORT_OOM - } - - node = TRI_CreateNodeForAql(context, (yysemantic_stack_[(4) - (2)].strval), (yysemantic_stack_[(4) - (4)].node)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - } - break; - - case 12: - - { - TRI_aql_node_t* node = TRI_CreateNodeFilterAql(context, (yysemantic_stack_[(2) - (2)].node)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - } - break; - - case 13: - - { - } - break; - - case 14: - - { - } - break; - - case 15: - - { - } - break; - - case 16: - - { - TRI_aql_node_t* node = TRI_CreateNodeLetAql(context, (yysemantic_stack_[(3) - (1)].strval), (yysemantic_stack_[(3) - (3)].node)); - - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - } - break; - - case 17: - - { - TRI_aql_node_t* node = TRI_CreateNodeListAql(context); - - if (node == NULL) { - ABORT_OOM - } - - TRI_PushStackParseAql(context, node); - } - break; - - case 18: - - { - TRI_aql_node_t* node = TRI_CreateNodeCollectAql(context, TRI_PopStackParseAql(context), (yysemantic_stack_[(4) - (4)].strval)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - } - break; - - case 19: - - { - } - break; - - case 20: - - { - } - break; - - case 21: - - { - TRI_aql_node_t* node = TRI_CreateNodeAssignAql(context, (yysemantic_stack_[(3) - (1)].strval), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_PushListAql(context, node)) { - ABORT_OOM - } - } - break; - - case 22: - - { - (yyval.strval) = NULL; - } - break; - - case 23: - - { - (yyval.strval) = (yysemantic_stack_[(2) - (2)].strval); - } - break; - - case 24: - - { - TRI_aql_node_t* node = TRI_CreateNodeListAql(context); - - if (node == NULL) { - ABORT_OOM - } - - TRI_PushStackParseAql(context, node); - } - break; - - case 25: - - { - TRI_aql_node_t* list = TRI_PopStackParseAql(context); - TRI_aql_node_t* node = TRI_CreateNodeSortAql(context, list); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - } - break; - - case 26: - - { - if (! TRI_PushListAql(context, (yysemantic_stack_[(1) - (1)].node))) { - ABORT_OOM - } - } - break; - - case 27: - - { - if (! TRI_PushListAql(context, (yysemantic_stack_[(3) - (3)].node))) { - ABORT_OOM - } - } - break; - - case 28: - - { - TRI_aql_node_t* node = TRI_CreateNodeSortElementAql(context, (yysemantic_stack_[(2) - (1)].node), (yysemantic_stack_[(2) - (2)].boolval)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 29: - - { - (yyval.boolval) = true; - } - break; - - case 30: - - { - (yyval.boolval) = true; - } - break; - - case 31: - - { - (yyval.boolval) = false; - } - break; - - case 32: - - { - TRI_aql_node_t* node = TRI_CreateNodeLimitAql(context, TRI_CreateNodeValueIntAql(context, 0), (yysemantic_stack_[(2) - (2)].node)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - - } - break; - - case 33: - - { - TRI_aql_node_t* node = TRI_CreateNodeLimitAql(context, (yysemantic_stack_[(4) - (2)].node), (yysemantic_stack_[(4) - (4)].node)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - } - break; - - case 34: - - { - TRI_aql_node_t* node = TRI_CreateNodeReturnAql(context, (yysemantic_stack_[(2) - (2)].node)); - if (node == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, node)) { - ABORT_OOM - } - - if (! TRI_EndScopeByReturnAql(context)) { - ABORT_OOM - } - - // $$ = node; - } - break; - - case 35: - - { - (yyval.node) = (yysemantic_stack_[(3) - (2)].node); - } - break; - - case 36: - - { - if (! TRI_StartScopeAql(context, TRI_AQL_SCOPE_SUBQUERY)) { - ABORT_OOM - } - } - break; - - case 37: - - { - TRI_aql_node_t* result; - TRI_aql_node_t* subQuery; - TRI_aql_node_t* nameNode; - - if (! TRI_EndScopeAql(context)) { - ABORT_OOM - } - - subQuery = TRI_CreateNodeSubqueryAql(context); - - if (subQuery == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, subQuery)) { - ABORT_OOM - } - - nameNode = TRI_AQL_NODE_MEMBER(subQuery, 0); - if (nameNode == NULL) { - ABORT_OOM - } - - result = TRI_CreateNodeReferenceAql(context, TRI_AQL_NODE_STRING(nameNode)); - if (result == NULL) { - ABORT_OOM - } - - // return the result - (yyval.node) = result; - } - break; - - case 38: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 39: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 40: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 41: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 42: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 43: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 44: - - { - TRI_aql_node_t* node; - TRI_aql_node_t* list; - - if ((yysemantic_stack_[(3) - (1)].node) == NULL || (yysemantic_stack_[(3) - (3)].node) == NULL) { - ABORT_OOM - } - - list = TRI_CreateNodeListAql(context); - if (list == NULL) { - ABORT_OOM - } - - if (TRI_ERROR_NO_ERROR != TRI_PushBackVectorPointer(&list->_members, (void*) (yysemantic_stack_[(3) - (1)].node))) { - ABORT_OOM - } - if (TRI_ERROR_NO_ERROR != TRI_PushBackVectorPointer(&list->_members, (void*) (yysemantic_stack_[(3) - (3)].node))) { - ABORT_OOM - } - - node = TRI_CreateNodeFcallAql(context, "RANGE", list); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 45: - - { - (yyval.strval) = (yysemantic_stack_[(1) - (1)].strval); - - if ((yyval.strval) == NULL) { - ABORT_OOM - } - } - break; - - case 46: - - { - if ((yysemantic_stack_[(3) - (1)].strval) == NULL || (yysemantic_stack_[(3) - (3)].strval) == NULL) { - ABORT_OOM - } - - (yyval.strval) = TRI_RegisterString3Aql(context, (yysemantic_stack_[(3) - (1)].strval), "::", (yysemantic_stack_[(3) - (3)].strval)); - - if ((yyval.strval) == NULL) { - ABORT_OOM - } - } - break; - - case 47: - - { - TRI_aql_node_t* node; - - if (! TRI_PushStackParseAql(context, (yysemantic_stack_[(1) - (1)].strval))) { - ABORT_OOM - } - - node = TRI_CreateNodeListAql(context); - if (node == NULL) { - ABORT_OOM - } - - TRI_PushStackParseAql(context, node); - } - break; - - case 48: - - { - TRI_aql_node_t* list = TRI_PopStackParseAql(context); - TRI_aql_node_t* node = TRI_CreateNodeFcallAql(context, TRI_PopStackParseAql(context), list); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 49: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorUnaryPlusAql(context, (yysemantic_stack_[(2) - (2)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 50: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorUnaryMinusAql(context, (yysemantic_stack_[(2) - (2)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 51: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorUnaryNotAql(context, (yysemantic_stack_[(2) - (2)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 52: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryOrAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 53: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryAndAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 54: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryPlusAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 55: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryMinusAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 56: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryTimesAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 57: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryDivAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 58: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryModAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 59: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryEqAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 60: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryNeAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 61: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryLtAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 62: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryGtAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 63: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryLeAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 64: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryGeAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 65: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryInAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 66: - - { - TRI_aql_node_t* node = TRI_CreateNodeOperatorTernaryAql(context, (yysemantic_stack_[(5) - (1)].node), (yysemantic_stack_[(5) - (3)].node), (yysemantic_stack_[(5) - (5)].node)); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 67: - - { - } - break; - - case 68: - - { - } - break; - - case 69: - - { - if (! TRI_PushListAql(context, (yysemantic_stack_[(1) - (1)].node))) { - ABORT_OOM - } - } - break; - - case 70: - - { - if (! TRI_PushListAql(context, (yysemantic_stack_[(3) - (3)].node))) { - ABORT_OOM - } - } - break; - - case 71: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 72: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 73: - - { - TRI_aql_node_t* node = TRI_CreateNodeListAql(context); - if (node == NULL) { - ABORT_OOM - } - - TRI_PushStackParseAql(context, node); - } - break; - - case 74: - - { - (yyval.node) = TRI_PopStackParseAql(context); - } - break; - - case 75: - - { - } - break; - - case 76: - - { - } - break; - - case 77: - - { - if (! TRI_PushListAql(context, (yysemantic_stack_[(1) - (1)].node))) { - ABORT_OOM - } - } - break; - - case 78: - - { - if (! TRI_PushListAql(context, (yysemantic_stack_[(3) - (3)].node))) { - ABORT_OOM - } - } - break; - - case 79: - - { - TRI_aql_node_t* node = TRI_CreateNodeArrayAql(context); - if (node == NULL) { - ABORT_OOM - } - - TRI_PushStackParseAql(context, node); - } - break; - - case 80: - - { - (yyval.node) = TRI_PopStackParseAql(context); - } - break; - - case 81: - - { - } - break; - - case 82: - - { - } - break; - - case 83: - - { - } - break; - - case 84: - - { - } - break; - - case 85: - - { - if (! TRI_PushArrayAql(context, (yysemantic_stack_[(3) - (1)].strval), (yysemantic_stack_[(3) - (3)].node))) { - ABORT_OOM - } - } - break; - - case 86: - - { - // start of reference (collection or variable name) - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 87: - - { - // expanded variable access, e.g. variable[*] - TRI_aql_node_t* node; - char* varname = TRI_GetNameParseAql(context); - - if (varname == NULL) { - ABORT_OOM - } - - // push the varname onto the stack - TRI_PushStackParseAql(context, varname); - - // push on the stack what's going to be expanded (will be popped when we come back) - TRI_PushStackParseAql(context, (yysemantic_stack_[(1) - (1)].node)); - - // create a temporary variable for the row iterator (will be popped by "expansion" rule") - node = TRI_CreateNodeReferenceAql(context, varname); - - if (node == NULL) { - ABORT_OOM - } - - // push the variable - TRI_PushStackParseAql(context, node); - } - break; - - case 88: - - { - // return from the "expansion" subrule - TRI_aql_node_t* expanded = TRI_PopStackParseAql(context); - TRI_aql_node_t* expand; - TRI_aql_node_t* nameNode; - char* varname = TRI_PopStackParseAql(context); - - // push the actual expand node into the statement list - expand = TRI_CreateNodeExpandAql(context, varname, expanded, (yysemantic_stack_[(4) - (4)].node)); - - if (expand == NULL) { - ABORT_OOM - } - - if (! TRI_AppendStatementListAql(context->_statements, expand)) { - ABORT_OOM - } - - nameNode = TRI_AQL_NODE_MEMBER(expand, 1); - - if (nameNode == NULL) { - ABORT_OOM - } - - // return a reference only - (yyval.node) = TRI_CreateNodeReferenceAql(context, TRI_AQL_NODE_STRING(nameNode)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 89: - - { - // variable or collection - TRI_aql_node_t* node; - - if (TRI_VariableExistsScopeAql(context, (yysemantic_stack_[(1) - (1)].strval))) { - node = TRI_CreateNodeReferenceAql(context, (yysemantic_stack_[(1) - (1)].strval)); - } - else { - node = TRI_CreateNodeCollectionAql(context, (yysemantic_stack_[(1) - (1)].strval)); - } - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 90: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 91: - - { - // named variable access, e.g. variable.reference - (yyval.node) = TRI_CreateNodeAttributeAccessAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].strval)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 92: - - { - // named variable access, e.g. variable.@reference - (yyval.node) = TRI_CreateNodeBoundAttributeAccessAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 93: - - { - // indexed variable access, e.g. variable[index] - (yyval.node) = TRI_CreateNodeIndexedAql(context, (yysemantic_stack_[(4) - (1)].node), (yysemantic_stack_[(4) - (3)].node)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 94: - - { - // named variable access, continuation from * expansion, e.g. [*].variable.reference - TRI_aql_node_t* node = TRI_PopStackParseAql(context); - - (yyval.node) = TRI_CreateNodeAttributeAccessAql(context, node, (yysemantic_stack_[(2) - (2)].strval)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 95: - - { - // named variable access w/ bind parameter, continuation from * expansion, e.g. [*].variable.@reference - TRI_aql_node_t* node = TRI_PopStackParseAql(context); - - (yyval.node) = TRI_CreateNodeBoundAttributeAccessAql(context, node, (yysemantic_stack_[(2) - (2)].node)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 96: - - { - // indexed variable access, continuation from * expansion, e.g. [*].variable[index] - TRI_aql_node_t* node = TRI_PopStackParseAql(context); - - (yyval.node) = TRI_CreateNodeIndexedAql(context, node, (yysemantic_stack_[(3) - (2)].node)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 97: - - { - // named variable access, continuation from * expansion, e.g. [*].variable.xx.reference - (yyval.node) = TRI_CreateNodeAttributeAccessAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].strval)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 98: - - { - // named variable access w/ bind parameter, continuation from * expansion, e.g. [*].variable.xx.@reference - (yyval.node) = TRI_CreateNodeBoundAttributeAccessAql(context, (yysemantic_stack_[(3) - (1)].node), (yysemantic_stack_[(3) - (3)].node)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 99: - - { - // indexed variable access, continuation from * expansion, e.g. [*].variable.xx.[index] - (yyval.node) = TRI_CreateNodeIndexedAql(context, (yysemantic_stack_[(4) - (1)].node), (yysemantic_stack_[(4) - (3)].node)); - - if ((yyval.node) == NULL) { - ABORT_OOM - } - } - break; - - case 100: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 101: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 102: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 103: - - { - TRI_aql_node_t* node; - double value; - - if ((yysemantic_stack_[(1) - (1)].strval) == NULL) { - ABORT_OOM - } - - value = TRI_DoubleString((yysemantic_stack_[(1) - (1)].strval)); - - if (TRI_errno() != TRI_ERROR_NO_ERROR) { - TRI_SetErrorContextAql(__FILE__, __LINE__, context, TRI_ERROR_QUERY_NUMBER_OUT_OF_RANGE, NULL); - YYABORT; - } - - node = TRI_CreateNodeValueDoubleAql(context, value); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 104: - - { - TRI_aql_node_t* node = TRI_CreateNodeValueStringAql(context, (yysemantic_stack_[(1) - (1)].strval)); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 105: - - { - (yyval.node) = (yysemantic_stack_[(1) - (1)].node); - } - break; - - case 106: - - { - TRI_aql_node_t* node = TRI_CreateNodeValueNullAql(context); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 107: - - { - TRI_aql_node_t* node = TRI_CreateNodeValueBoolAql(context, true); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 108: - - { - TRI_aql_node_t* node = TRI_CreateNodeValueBoolAql(context, false); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 109: - - { - TRI_aql_node_t* node = TRI_CreateNodeParameterAql(context, (yysemantic_stack_[(1) - (1)].strval)); - - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - case 110: - - { - if ((yysemantic_stack_[(1) - (1)].strval) == NULL) { - ABORT_OOM - } - - (yyval.strval) = (yysemantic_stack_[(1) - (1)].strval); - } - break; - - case 111: - - { - if ((yysemantic_stack_[(1) - (1)].strval) == NULL) { - ABORT_OOM - } - - (yyval.strval) = (yysemantic_stack_[(1) - (1)].strval); - } - break; - - case 112: - - { - (yyval.strval) = (yysemantic_stack_[(1) - (1)].strval); - } - break; - - case 113: - - { - TRI_aql_node_t* node; - int64_t value; - - if ((yysemantic_stack_[(1) - (1)].strval) == NULL) { - ABORT_OOM - } - - value = TRI_Int64String((yysemantic_stack_[(1) - (1)].strval)); - if (TRI_errno() != TRI_ERROR_NO_ERROR) { - TRI_SetErrorContextAql(__FILE__, __LINE__, context, TRI_ERROR_QUERY_NUMBER_OUT_OF_RANGE, NULL); - YYABORT; - } - - node = TRI_CreateNodeValueIntAql(context, value); - if (node == NULL) { - ABORT_OOM - } - - (yyval.node) = node; - } - break; - - - - default: - break; - } - - /* User semantic actions sometimes alter yychar, and that requires - that yytoken be updated with the new translation. We take the - approach of translating immediately before every use of yytoken. - One alternative is translating here after every semantic action, - but that translation would be missed if the semantic action - invokes YYABORT, YYACCEPT, or YYERROR immediately after altering - yychar. In the case of YYABORT or YYACCEPT, an incorrect - destructor might then be invoked immediately. In the case of - YYERROR, subsequent parser actions might lead to an incorrect - destructor call or verbose syntax error message before the - lookahead is translated. */ - YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc); - - yypop_ (yylen); - yylen = 0; - YY_STACK_PRINT (); - - yysemantic_stack_.push (yyval); - yylocation_stack_.push (yyloc); - - /* Shift the result of the reduction. */ - yyn = yyr1_[yyn]; - yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0]; - if (0 <= yystate && yystate <= yylast_ - && yycheck_[yystate] == yystate_stack_[0]) - yystate = yytable_[yystate]; - else - yystate = yydefgoto_[yyn - yyntokens_]; - goto yynewstate; - - /*------------------------------------. - | yyerrlab -- here on detecting error | - `------------------------------------*/ - yyerrlab: - /* Make sure we have latest lookahead translation. See comments at - user semantic actions for why this is necessary. */ - yytoken = yytranslate_ (yychar); - - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus_) - { - ++yynerrs_; - if (yychar == yyempty_) - yytoken = yyempty_; - error (yylloc, yysyntax_error_ (yystate, yytoken)); - } - - yyerror_range[1] = yylloc; - if (yyerrstatus_ == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - if (yychar <= yyeof_) - { - /* Return failure if at end of input. */ - if (yychar == yyeof_) - YYABORT; - } - else - { - yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc); - yychar = yyempty_; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - - /*---------------------------------------------------. - | yyerrorlab -- error raised explicitly by YYERROR. | - `---------------------------------------------------*/ - yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (false) - goto yyerrorlab; - - yyerror_range[1] = yylocation_stack_[yylen - 1]; - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - yypop_ (yylen); - yylen = 0; - yystate = yystate_stack_[0]; - goto yyerrlab1; - - /*-------------------------------------------------------------. - | yyerrlab1 -- common code for both syntax error and YYERROR. | - `-------------------------------------------------------------*/ - yyerrlab1: - yyerrstatus_ = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact_[yystate]; - if (!yy_pact_value_is_default_ (yyn)) - { - yyn += yyterror_; - if (0 <= yyn && yyn <= yylast_ && yycheck_[yyn] == yyterror_) - { - yyn = yytable_[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yystate_stack_.height () == 1) - YYABORT; - - yyerror_range[1] = yylocation_stack_[0]; - yydestruct_ ("Error: popping", - yystos_[yystate], - &yysemantic_stack_[0], &yylocation_stack_[0]); - yypop_ (); - yystate = yystate_stack_[0]; - YY_STACK_PRINT (); - } - - yyerror_range[2] = yylloc; - // Using YYLLOC is tempting, but would change the location of - // the lookahead. YYLOC is available though. - YYLLOC_DEFAULT (yyloc, yyerror_range, 2); - yysemantic_stack_.push (yylval); - yylocation_stack_.push (yyloc); - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos_[yyn], - &yysemantic_stack_[0], &yylocation_stack_[0]); - - yystate = yyn; - goto yynewstate; - - /* Accept. */ - yyacceptlab: - yyresult = 0; - goto yyreturn; - - /* Abort. */ - yyabortlab: - yyresult = 1; - goto yyreturn; - - yyreturn: - if (yychar != yyempty_) - { - /* Make sure we have latest lookahead translation. See comments - at user semantic actions for why this is necessary. */ - yytoken = yytranslate_ (yychar); - yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, - &yylloc); - } - - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - yypop_ (yylen); - while (1 < yystate_stack_.height ()) - { - yydestruct_ ("Cleanup: popping", - yystos_[yystate_stack_[0]], - &yysemantic_stack_[0], - &yylocation_stack_[0]); - yypop_ (); - } - - return yyresult; - } - catch (...) - { - YYCDEBUG << "Exception caught: cleaning lookahead and stack" - << std::endl; - // Do not try to display the values of the reclaimed symbols, - // as their printer might throw an exception. - if (yychar != yyempty_) - { - /* Make sure we have latest lookahead translation. See - comments at user semantic actions for why this is - necessary. */ - yytoken = yytranslate_ (yychar); - yydestruct_ (YY_NULL, yytoken, &yylval, &yylloc); - } - - while (1 < yystate_stack_.height ()) - { - yydestruct_ (YY_NULL, - yystos_[yystate_stack_[0]], - &yysemantic_stack_[0], - &yylocation_stack_[0]); - yypop_ (); - } - throw; - } - } - - // Generate an error message. - std::string - parser::yysyntax_error_ (int yystate, int yytoken) - { - std::string yyres; - // Number of reported tokens (one for the "unexpected", one per - // "expected"). - size_t yycount = 0; - // Its maximum. - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - // Arguments of yyformat. - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - - /* There are many possibilities here to consider: - - If this state is a consistent state with a default action, then - the only way this function was invoked is if the default action - is an error action. In that case, don't check for expected - tokens because there are none. - - The only way there can be no lookahead present (in yytoken) is - if this state is a consistent state with a default action. - Thus, detecting the absence of a lookahead is sufficient to - determine that there is no unexpected or expected token to - report. In that case, just report a simple "syntax error". - - Don't assume there isn't a lookahead just because this state is - a consistent state with a default action. There might have - been a previous inconsistent state, consistent state with a - non-default action, or user semantic action that manipulated - yychar. - - Of course, the expected token list depends on states to have - correct lookahead information, and it depends on the parser not - to perform extra reductions after fetching a lookahead from the - scanner and before detecting a syntax error. Thus, state - merging (from LALR or IELR) and default reductions corrupt the - expected token list. However, the list is correct for - canonical LR with one exception: it will still contain any - token that will not be accepted due to an error action in a - later state. - */ - if (yytoken != yyempty_) - { - yyarg[yycount++] = yytname_[yytoken]; - int yyn = yypact_[yystate]; - if (!yy_pact_value_is_default_ (yyn)) - { - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. In other words, skip the first -YYN actions for - this state because they are default actions. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = yylast_ - yyn + 1; - int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_; - for (int yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck_[yyx + yyn] == yyx && yyx != yyterror_ - && !yy_table_value_is_error_ (yytable_[yyx + yyn])) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - break; - } - else - yyarg[yycount++] = yytname_[yyx]; - } - } - } - - char const* yyformat = YY_NULL; - switch (yycount) - { -#define YYCASE_(N, S) \ - case N: \ - yyformat = S; \ - break - YYCASE_(0, YY_("syntax error")); - YYCASE_(1, YY_("syntax error, unexpected %s")); - YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); - YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); - YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); - YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); -#undef YYCASE_ - } - - // Argument number. - size_t yyi = 0; - for (char const* yyp = yyformat; *yyp; ++yyp) - if (yyp[0] == '%' && yyp[1] == 's' && yyi < yycount) - { - yyres += yytnamerr_ (yyarg[yyi++]); - ++yyp; - } - else - yyres += *yyp; - return yyres; - } +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ + && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; + YYLTYPE yyls_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 380 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 55 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 52 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 113 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 176 + +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 308 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 54, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53 +}; + +#if YYDEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 184, 184, 189, 191, 196, 198, 200, 202, 204, + 206, 211, 230, 243, 248, 250, 255, 269, 269, 294, + 296, 301, 314, 317, 323, 323, 346, 351, 359, 370, + 373, 376, 382, 393, 406, 426, 429, 429, 465, 468, + 471, 474, 477, 480, 483, 514, 521, 535, 535, 564, + 572, 580, 591, 599, 607, 615, 623, 631, 639, 647, + 655, 663, 671, 679, 687, 695, 706, 718, 720, 725, + 730, 738, 741, 747, 747, 760, 762, 767, 772, 780, + 780, 793, 795, 800, 802, 807, 815, 819, 819, 878, + 895, 902, 910, 918, 929, 940, 951, 962, 970, 978, + 989, 992, 998, 1001, 1026, 1035, 1038, 1047, 1056, 1068, + 1080, 1087, 1096, 1102 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || 1 +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of query string\"", "error", "$undefined", "\"FOR declaration\"", + "\"LET declaration\"", "\"FILTER declaration\"", + "\"RETURN declaration\"", "\"COLLECT declaration\"", + "\"SORT declaration\"", "\"LIMIT declaration\"", "\"ASC keyword\"", + "\"DESC keyword\"", "\"IN keyword\"", "\"INTO keyword\"", "\"null\"", + "\"true\"", "\"false\"", "\"identifier\"", "\"quoted string\"", + "\"integer number\"", "\"number\"", "\"bind parameter\"", + "\"assignment\"", "\"not operator\"", "\"and operator\"", + "\"or operator\"", "\"== operator\"", "\"!= operator\"", + "\"< operator\"", "\"> operator\"", "\"<= operator\"", "\">= operator\"", + "\"+ operator\"", "\"- operator\"", "\"* operator\"", "\"/ operator\"", + "\"% operator\"", "\"[*] operator\"", "\"?\"", "\":\"", "\"::\"", + "\"..\"", "\",\"", "\"(\"", "\")\"", "\"{\"", "\"}\"", "\"[\"", "\"]\"", + "UMINUS", "UPLUS", "FUNCCALL", "REFERENCE", "INDEXED", "'.'", "$accept", + "query", "optional_statement_block_statements", + "statement_block_statement", "for_statement", "filter_statement", + "let_statement", "let_list", "let_element", "collect_statement", "$@1", + "collect_list", "collect_element", "optional_into", "sort_statement", + "$@2", "sort_list", "sort_element", "sort_direction", "limit_statement", + "return_statement", "expression", "$@3", "function_name", + "function_call", "$@4", "operator_unary", "operator_binary", + "operator_ternary", "optional_function_call_arguments", + "function_arguments_list", "compound_type", "list", "$@5", + "optional_list_elements", "list_elements_list", "array", "$@6", + "optional_array_elements", "array_elements_list", "array_element", + "reference", "$@7", "single_reference", "expansion", "atomic_value", + "numeric_value", "value_literal", "bind_parameter", "array_element_name", + "variable_name", "integer_value", YY_NULLPTR +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 46 +}; +# endif + +#define YYPACT_NINF -75 + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-75))) + +#define YYTABLE_NINF -88 + +#define yytable_value_is_error(Yytable_value) \ + 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ - const signed char parser::yypact_ninf_ = -75; - const short int - parser::yypact_[] = - { - -75, 30, 119, -75, 32, 32, 174, 174, -75, -75, +static const yytype_int16 yypact[] = +{ + -75, 30, 119, -75, 32, 32, 174, 174, -75, -75, 71, -75, -75, -75, -75, -75, -75, -75, -75, -75, 35, 9, -75, 58, -75, -75, -75, 39, -75, -75, -75, -75, 174, 174, 174, 174, -75, -75, 283, 43, @@ -2054,15 +642,14 @@ namespace Ahuacatl { 102, 174, 4, -30, -75, -75, -75, 283, -75, -75, 283, 283, 308, -75, 174, 72, -75, -75, 174, 29, 283, -75, 139, -75, -75, -75 - }; +}; - /* YYDEFACT[S] -- default reduction number in state S. Performed when - YYTABLE doesn't specify something else to do. Zero means the - default is an error. */ - const unsigned char - parser::yydefact_[] = - { - 3, 0, 0, 1, 0, 0, 0, 0, 17, 24, + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 3, 0, 0, 1, 0, 0, 0, 0, 17, 24, 0, 4, 5, 7, 6, 8, 9, 10, 2, 112, 0, 13, 14, 0, 106, 107, 108, 89, 104, 113, 103, 109, 0, 0, 0, 36, 79, 73, 12, 47, @@ -2080,40 +667,36 @@ namespace Ahuacatl { 68, 0, 0, 88, 93, 23, 20, 21, 27, 84, 85, 78, 66, 48, 0, 0, 94, 95, 0, 0, 70, 96, 0, 97, 98, 99 - }; +}; /* YYPGOTO[NTERM-NUM]. */ - const signed char - parser::yypgoto_[] = - { - -75, 81, -75, -75, -75, -75, -75, -75, 90, -75, +static const yytype_int8 yypgoto[] = +{ + -75, 81, -75, -75, -75, -75, -75, -75, 90, -75, -75, -75, 6, -75, -75, -75, -75, 11, -75, -75, -75, -6, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, -75, 5, -75, -75, -75, -75, -7, -75, -75, -74, -75, -2, -75 - }; +}; /* YYDEFGOTO[NTERM-NUM]. */ - const short int - parser::yydefgoto_[] = - { - -1, 1, 2, 11, 12, 13, 14, 21, 22, 15, +static const yytype_int16 yydefgoto[] = +{ + -1, 1, 2, 11, 12, 13, 14, 21, 22, 15, 55, 89, 90, 134, 16, 56, 92, 93, 139, 17, 18, 94, 65, 39, 40, 85, 41, 42, 43, 149, 150, 44, 45, 67, 108, 109, 46, 66, 103, 104, 105, 47, 86, 48, 153, 49, 50, 51, 52, 106, 23, 53 - }; +}; - /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If YYTABLE_NINF_, syntax error. */ - const signed char parser::yytable_ninf_ = -88; - const short int - parser::yytable_[] = - { - 38, 54, 20, 57, 73, 74, 75, 76, 77, 78, + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 38, 54, 20, 57, 73, 74, 75, 76, 77, 78, 79, 80, 81, 87, 131, 132, 151, 168, 130, 68, 88, 166, 31, 152, 169, 31, 61, 62, 63, 64, 3, 69, 70, 71, 72, 73, 74, 75, 76, 77, @@ -2152,13 +735,11 @@ namespace Ahuacatl { 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81 - }; +}; - /* YYCHECK. */ - const short int - parser::yycheck_[] = - { - 6, 7, 4, 10, 28, 29, 30, 31, 32, 33, +static const yytype_int16 yycheck[] = +{ + 6, 7, 4, 10, 28, 29, 30, 31, 32, 33, 34, 35, 36, 47, 88, 13, 47, 47, 17, 12, 54, 17, 21, 54, 54, 21, 32, 33, 34, 35, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, @@ -2197,14 +778,13 @@ namespace Ahuacatl { 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36 - }; +}; - /* STOS_[STATE-NUM] -- The (internal number of the) accessing + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ - const unsigned char - parser::yystos_[] = - { - 0, 56, 57, 0, 3, 4, 5, 6, 7, 8, +static const yytype_uint8 yystos[] = +{ + 0, 56, 57, 0, 3, 4, 5, 6, 7, 8, 9, 58, 59, 60, 61, 64, 69, 74, 75, 17, 105, 62, 63, 105, 14, 15, 16, 17, 18, 19, 20, 21, 23, 32, 33, 43, 45, 47, 76, 78, @@ -2222,28 +802,12 @@ namespace Ahuacatl { 85, 47, 54, 99, 48, 105, 67, 76, 72, 95, 76, 76, 76, 44, 42, 76, 17, 103, 47, 54, 76, 48, 76, 17, 103, 48 - }; - -#if YYDEBUG - /* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding - to YYLEX-NUM. */ - const unsigned short int - parser::yytoken_number_[] = - { - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 46 - }; -#endif +}; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ - const unsigned char - parser::yyr1_[] = - { - 0, 55, 56, 57, 57, 58, 58, 58, 58, 58, +static const yytype_uint8 yyr1[] = +{ + 0, 55, 56, 57, 57, 58, 58, 58, 58, 58, 58, 59, 60, 61, 62, 62, 63, 65, 64, 66, 66, 67, 68, 68, 70, 69, 71, 71, 72, 73, 73, 73, 74, 74, 75, 76, 77, 76, 76, 76, @@ -2255,13 +819,12 @@ namespace Ahuacatl { 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 100, 100, 101, 101, 102, 102, 102, 102, 102, 103, 104, 104, 105, 106 - }; +}; - /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ - const unsigned char - parser::yyr2_[] = - { - 0, 2, 2, 0, 2, 1, 1, 1, 1, 1, + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 0, 2, 1, 1, 1, 1, 1, 1, 4, 2, 2, 1, 3, 3, 0, 4, 1, 3, 3, 0, 2, 0, 3, 1, 3, 2, 0, 1, 1, 2, 4, 2, 3, 0, 4, 1, 1, @@ -2273,208 +836,2393 @@ namespace Ahuacatl { 1, 3, 3, 4, 2, 2, 3, 3, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; +}; - /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at \a yyntokens_, nonterminals. */ - const char* - const parser::yytname_[] = - { - "\"end of query string\"", "error", "$undefined", "\"FOR declaration\"", - "\"LET declaration\"", "\"FILTER declaration\"", - "\"RETURN declaration\"", "\"COLLECT declaration\"", - "\"SORT declaration\"", "\"LIMIT declaration\"", "\"ASC keyword\"", - "\"DESC keyword\"", "\"IN keyword\"", "\"INTO keyword\"", "\"null\"", - "\"true\"", "\"false\"", "\"identifier\"", "\"quoted string\"", - "\"integer number\"", "\"number\"", "\"bind parameter\"", - "\"assignment\"", "\"not operator\"", "\"and operator\"", - "\"or operator\"", "\"== operator\"", "\"!= operator\"", - "\"< operator\"", "\"> operator\"", "\"<= operator\"", "\">= operator\"", - "\"+ operator\"", "\"- operator\"", "\"* operator\"", "\"/ operator\"", - "\"% operator\"", "\"[*] operator\"", "\"?\"", "\":\"", "\"::\"", - "\"..\"", "\",\"", "\"(\"", "\")\"", "\"{\"", "\"}\"", "\"[\"", "\"]\"", - "UPLUS", "UMINUS", "FUNCCALL", "REFERENCE", "INDEXED", "'.'", "$accept", - "query", "optional_statement_block_statements", - "statement_block_statement", "for_statement", "filter_statement", - "let_statement", "let_list", "let_element", "collect_statement", "$@1", - "collect_list", "collect_element", "optional_into", "sort_statement", - "$@2", "sort_list", "sort_element", "sort_direction", "limit_statement", - "return_statement", "expression", "$@3", "function_name", - "function_call", "$@4", "operator_unary", "operator_binary", - "operator_ternary", "optional_function_call_arguments", - "function_arguments_list", "compound_type", "list", "$@5", - "optional_list_elements", "list_elements_list", "array", "$@6", - "optional_array_elements", "array_elements_list", "array_element", - "reference", "$@7", "single_reference", "expansion", "atomic_value", - "numeric_value", "value_literal", "bind_parameter", "array_element_name", - "variable_name", "integer_value", YY_NULL - }; +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (&yylloc, context, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + +/* Error token number */ +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) + + +/* Enable debugging if requested. */ #if YYDEBUG - /* YYRHS -- A `-1'-separated list of the rules' RHS. */ - const parser::rhs_number_type - parser::yyrhs_[] = - { - 56, 0, -1, 57, 75, -1, -1, 57, 58, -1, - 59, -1, 61, -1, 60, -1, 64, -1, 69, -1, - 74, -1, 3, 105, 12, 76, -1, 5, 76, -1, - 4, 62, -1, 63, -1, 62, 42, 63, -1, 105, - 22, 76, -1, -1, 7, 65, 66, 68, -1, 67, - -1, 66, 42, 67, -1, 105, 22, 76, -1, -1, - 13, 105, -1, -1, 8, 70, 71, -1, 72, -1, - 71, 42, 72, -1, 76, 73, -1, -1, 10, -1, - 11, -1, 9, 100, -1, 9, 100, 42, 100, -1, - 6, 76, -1, 43, 76, 44, -1, -1, 43, 77, - 56, 44, -1, 81, -1, 82, -1, 83, -1, 86, - -1, 100, -1, 96, -1, 76, 41, 76, -1, 17, - -1, 78, 40, 17, -1, -1, 78, 80, 43, 84, - 44, -1, 32, 76, -1, 33, 76, -1, 23, 76, - -1, 76, 25, 76, -1, 76, 24, 76, -1, 76, - 32, 76, -1, 76, 33, 76, -1, 76, 34, 76, - -1, 76, 35, 76, -1, 76, 36, 76, -1, 76, - 26, 76, -1, 76, 27, 76, -1, 76, 28, 76, - -1, 76, 29, 76, -1, 76, 30, 76, -1, 76, - 31, 76, -1, 76, 12, 76, -1, 76, 38, 76, - 39, 76, -1, -1, 85, -1, 76, -1, 85, 42, - 76, -1, 87, -1, 91, -1, -1, 47, 88, 89, - 48, -1, -1, 90, -1, 76, -1, 90, 42, 76, - -1, -1, 45, 92, 93, 46, -1, -1, 94, -1, - 95, -1, 94, 42, 95, -1, 104, 39, 76, -1, - 98, -1, -1, 96, 97, 37, 99, -1, 17, -1, - 79, -1, 98, 54, 17, -1, 98, 54, 103, -1, - 98, 47, 76, 48, -1, 54, 17, -1, 54, 103, - -1, 47, 76, 48, -1, 99, 54, 17, -1, 99, - 54, 103, -1, 99, 47, 76, 48, -1, 102, -1, - 103, -1, 106, -1, 20, -1, 18, -1, 101, -1, - 14, -1, 15, -1, 16, -1, 21, -1, 17, -1, - 18, -1, 17, -1, 19, -1 - }; - /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ - const unsigned short int - parser::yyprhs_[] = - { - 0, 0, 3, 6, 7, 10, 12, 14, 16, 18, - 20, 22, 27, 30, 33, 35, 39, 43, 44, 49, - 51, 55, 59, 60, 63, 64, 68, 70, 74, 77, - 78, 80, 82, 85, 90, 93, 97, 98, 103, 105, - 107, 109, 111, 113, 115, 119, 121, 125, 126, 132, - 135, 138, 141, 145, 149, 153, 157, 161, 165, 169, - 173, 177, 181, 185, 189, 193, 197, 203, 204, 206, - 208, 212, 214, 216, 217, 222, 223, 225, 227, 231, - 232, 237, 238, 240, 242, 246, 250, 252, 253, 258, - 260, 262, 266, 270, 275, 278, 281, 285, 289, 293, - 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, - 318, 320, 322, 324 - }; +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ - const unsigned short int - parser::yyrline_[] = - { - 0, 184, 184, 189, 191, 196, 198, 200, 202, 204, - 206, 211, 230, 243, 248, 250, 255, 269, 269, 290, - 292, 297, 310, 313, 319, 319, 341, 346, 354, 365, - 368, 371, 377, 388, 401, 421, 424, 424, 460, 463, - 466, 469, 472, 475, 478, 509, 516, 530, 530, 555, - 563, 571, 582, 590, 598, 606, 614, 622, 630, 638, - 646, 654, 662, 670, 678, 686, 697, 709, 711, 716, - 721, 729, 732, 738, 738, 751, 753, 758, 763, 771, - 771, 784, 786, 791, 793, 798, 806, 810, 810, 868, - 885, 892, 900, 908, 919, 929, 939, 949, 957, 965, - 976, 979, 985, 988, 1013, 1022, 1025, 1034, 1043, 1055, - 1067, 1074, 1083, 1089 - }; +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) - // Print the state stack on the debug stream. - void - parser::yystack_print_ () - { - *yycdebug_ << "Stack now"; - for (state_stack_type::const_iterator i = yystate_stack_.begin (); - i != yystate_stack_.end (); ++i) - *yycdebug_ << ' ' << *i; - *yycdebug_ << std::endl; - } - // Report on the debug stream that the rule \a yyrule is going to be reduced. - void - parser::yy_reduce_print_ (int yyrule) - { - unsigned int yylno = yyrline_[yyrule]; - int yynrhs = yyr2_[yyrule]; - /* Print the symbols being reduced, and their result. */ - *yycdebug_ << "Reducing stack by rule " << yyrule - 1 - << " (line " << yylno << "):" << std::endl; - /* The symbols being reduced. */ - for (int yyi = 0; yyi < yynrhs; yyi++) - YY_SYMBOL_PRINT (" $" << yyi + 1 << " =", - yyrhs_[yyprhs_[yyrule] + yyi], - &(yysemantic_stack_[(yynrhs) - (yyi + 1)]), - &(yylocation_stack_[(yynrhs) - (yyi + 1)])); - } -#endif // YYDEBUG +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ - /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ - parser::token_number_type - parser::yytranslate_ (int t) - { - static - const token_number_type - translate_table[] = +#ifndef YY_LOCATION_PRINT +# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL + +/* Print *YYLOCP on YYO. Private, do not rely on its existence. */ + +YY_ATTRIBUTE_UNUSED +static unsigned +yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) +{ + unsigned res = 0; + int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; + if (0 <= yylocp->first_line) { - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 54, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53 - }; - if ((unsigned int) t <= yyuser_token_number_max_) - return translate_table[t]; - else - return yyundef_token_; + res += YYFPRINTF (yyo, "%d", yylocp->first_line); + if (0 <= yylocp->first_column) + res += YYFPRINTF (yyo, ".%d", yylocp->first_column); + } + if (0 <= yylocp->last_line) + { + if (yylocp->first_line < yylocp->last_line) + { + res += YYFPRINTF (yyo, "-%d", yylocp->last_line); + if (0 <= end_col) + res += YYFPRINTF (yyo, ".%d", end_col); + } + else if (0 <= end_col && yylocp->first_column < end_col) + res += YYFPRINTF (yyo, "-%d", end_col); + } + return res; + } + +# define YY_LOCATION_PRINT(File, Loc) \ + yy_location_print_ (File, &(Loc)) + +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, Location, context); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, TRI_aql_context_t* const context) +{ + FILE *yyo = yyoutput; + YYUSE (yyo); + YYUSE (yylocationp); + YYUSE (context); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + YYUSE (yytype); +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, TRI_aql_context_t* const context) +{ + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + + YY_LOCATION_PRINT (yyoutput, *yylocationp); + YYFPRINTF (yyoutput, ": "); + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, context); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, TRI_aql_context_t* const context) +{ + unsigned long int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , &(yylsp[(yyi + 1) - (yynrhs)]) , context); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, yylsp, Rule, context); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +yystrlen (const char *yystr) +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULLPTR; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; } - const int parser::yyeof_ = 0; - const int parser::yylast_ = 380; - const int parser::yynnts_ = 52; - const int parser::yyempty_ = -2; - const int parser::yyfinal_ = 3; - const int parser::yyterror_ = 1; - const int parser::yyerrcode_ = 256; - const int parser::yyntokens_ = 55; + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } - const unsigned int parser::yyuser_token_number_max_ = 308; - const parser::token_number_type parser::yyundef_token_ = 2; + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, TRI_aql_context_t* const context) +{ + YYUSE (yyvaluep); + YYUSE (yylocationp); + YYUSE (context); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yytype); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} -} // Ahuacatl + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (TRI_aql_context_t* const context) +{ +/* The lookahead symbol. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + +/* Location data for the lookahead symbol. */ +static YYLTYPE yyloc_default +# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL + = { 1, 1, 1, 1 } +# endif +; +YYLTYPE yylloc = yyloc_default; + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + 'yyss': related to states. + 'yyvs': related to semantic values. + 'yyls': related to locations. + + Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls; + YYLTYPE *yylsp; + + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[3]; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + YYLTYPE yyloc; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa; + yylsp = yyls = yylsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + yylsp[0] = yylloc; + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + 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; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); + + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); + YYSTACK_RELOCATE (yyls_alloc, yyls); +# 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)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + 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. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = yylex (&yylval, &yylloc, scanner); + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + *++yylsp = yylloc; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 184 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1620 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 3: +#line 189 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1627 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 4: +#line 191 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1634 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 5: +#line 196 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1641 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 6: +#line 198 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1648 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 7: +#line 200 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1655 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 8: +#line 202 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1662 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 9: +#line 204 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1669 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 10: +#line 206 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1676 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 11: +#line 211 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node; + + if (! TRI_StartScopeAql(context, TRI_AQL_SCOPE_FOR)) { + ABORT_OOM + } + + node = TRI_CreateNodeForAql(context, (yyvsp[-2].strval), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + } +#line 1697 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 12: +#line 230 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeFilterAql(context, (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + } +#line 1712 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 13: +#line 243 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1719 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 14: +#line 248 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1726 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 15: +#line 250 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1733 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 16: +#line 255 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeLetAql(context, (yyvsp[-2].strval), (yyvsp[0].node)); + + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + } +#line 1749 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 17: +#line 269 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeListAql(context); + + if (node == NULL) { + ABORT_OOM + } + + TRI_PushStackParseAql(context, node); + } +#line 1763 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 18: +#line 277 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeCollectAql( + context, + static_cast + (TRI_PopStackParseAql(context)), + (yyvsp[0].strval)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + } +#line 1782 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 19: +#line 294 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1789 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 20: +#line 296 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 1796 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 21: +#line 301 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeAssignAql(context, (yyvsp[-2].strval), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_PushListAql(context, node)) { + ABORT_OOM + } + } +#line 1811 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 22: +#line 314 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.strval) = NULL; + } +#line 1819 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 23: +#line 317 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.strval) = (yyvsp[0].strval); + } +#line 1827 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 24: +#line 323 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeListAql(context); + + if (node == NULL) { + ABORT_OOM + } + + TRI_PushStackParseAql(context, node); + } +#line 1841 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 25: +#line 331 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* list + = static_cast(TRI_PopStackParseAql(context)); + TRI_aql_node_t* node = TRI_CreateNodeSortAql(context, list); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + } +#line 1858 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 26: +#line 346 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushListAql(context, (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 1868 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 27: +#line 351 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushListAql(context, (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 1878 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 28: +#line 359 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeSortElementAql(context, (yyvsp[-1].node), (yyvsp[0].boolval)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 1891 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 29: +#line 370 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.boolval) = true; + } +#line 1899 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 30: +#line 373 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.boolval) = true; + } +#line 1907 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 31: +#line 376 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.boolval) = false; + } +#line 1915 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 32: +#line 382 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeLimitAql(context, TRI_CreateNodeValueIntAql(context, 0), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + + } +#line 1931 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 33: +#line 393 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeLimitAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + } +#line 1946 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 34: +#line 406 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeReturnAql(context, (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, node)) { + ABORT_OOM + } + + if (! TRI_EndScopeByReturnAql(context)) { + ABORT_OOM + } + + // $$ = node; + } +#line 1967 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 35: +#line 426 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[-1].node); + } +#line 1975 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 36: +#line 429 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_StartScopeAql(context, TRI_AQL_SCOPE_SUBQUERY)) { + ABORT_OOM + } + } +#line 1985 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 37: +#line 433 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* result; + TRI_aql_node_t* subQuery; + TRI_aql_node_t* nameNode; + + if (! TRI_EndScopeAql(context)) { + ABORT_OOM + } + + subQuery = TRI_CreateNodeSubqueryAql(context); + + if (subQuery == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, subQuery)) { + ABORT_OOM + } + + nameNode = TRI_AQL_NODE_MEMBER(subQuery, 0); + if (nameNode == NULL) { + ABORT_OOM + } + + result = TRI_CreateNodeReferenceAql(context, TRI_AQL_NODE_STRING(nameNode)); + if (result == NULL) { + ABORT_OOM + } + + // return the result + (yyval.node) = result; + } +#line 2022 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 38: +#line 465 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2030 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 39: +#line 468 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2038 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 40: +#line 471 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2046 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 41: +#line 474 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2054 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 42: +#line 477 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2062 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 43: +#line 480 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2070 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 44: +#line 483 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node; + TRI_aql_node_t* list; + + if ((yyvsp[-2].node) == NULL || (yyvsp[0].node) == NULL) { + ABORT_OOM + } + + list = TRI_CreateNodeListAql(context); + if (list == NULL) { + ABORT_OOM + } + + if (TRI_ERROR_NO_ERROR != TRI_PushBackVectorPointer(&list->_members, (void*) (yyvsp[-2].node))) { + ABORT_OOM + } + if (TRI_ERROR_NO_ERROR != TRI_PushBackVectorPointer(&list->_members, (void*) (yyvsp[0].node))) { + ABORT_OOM + } + + node = TRI_CreateNodeFcallAql(context, "RANGE", list); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2103 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 45: +#line 514 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.strval) = (yyvsp[0].strval); + + if ((yyval.strval) == NULL) { + ABORT_OOM + } + } +#line 2115 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 46: +#line 521 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if ((yyvsp[-2].strval) == NULL || (yyvsp[0].strval) == NULL) { + ABORT_OOM + } + + (yyval.strval) = TRI_RegisterString3Aql(context, (yyvsp[-2].strval), "::", (yyvsp[0].strval)); + + if ((yyval.strval) == NULL) { + ABORT_OOM + } + } +#line 2131 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 47: +#line 535 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node; + + if (! TRI_PushStackParseAql(context, (yyvsp[0].strval))) { + ABORT_OOM + } + + node = TRI_CreateNodeListAql(context); + if (node == NULL) { + ABORT_OOM + } + + TRI_PushStackParseAql(context, node); + } +#line 2150 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 48: +#line 548 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* list + = static_cast(TRI_PopStackParseAql(context)); + TRI_aql_node_t* node = TRI_CreateNodeFcallAql(context, + static_cast + (TRI_PopStackParseAql(context)), + list); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2168 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 49: +#line 564 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorUnaryPlusAql(context, (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2181 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 50: +#line 572 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorUnaryMinusAql(context, (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2194 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 51: +#line 580 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorUnaryNotAql(context, (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2207 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 52: +#line 591 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryOrAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2220 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 53: +#line 599 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryAndAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2233 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 54: +#line 607 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryPlusAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2246 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 55: +#line 615 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryMinusAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2259 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 56: +#line 623 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryTimesAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2272 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 57: +#line 631 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryDivAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2285 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 58: +#line 639 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryModAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2298 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 59: +#line 647 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryEqAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2311 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 60: +#line 655 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryNeAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2324 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 61: +#line 663 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryLtAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2337 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 62: +#line 671 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryGtAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2350 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 63: +#line 679 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryLeAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2363 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 64: +#line 687 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryGeAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2376 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 65: +#line 695 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorBinaryInAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2389 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 66: +#line 706 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeOperatorTernaryAql(context, (yyvsp[-4].node), (yyvsp[-2].node), (yyvsp[0].node)); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2403 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 67: +#line 718 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2410 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 68: +#line 720 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2417 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 69: +#line 725 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushListAql(context, (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 2427 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 70: +#line 730 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushListAql(context, (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 2437 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 71: +#line 738 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2445 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 72: +#line 741 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2453 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 73: +#line 747 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeListAql(context); + if (node == NULL) { + ABORT_OOM + } + + TRI_PushStackParseAql(context, node); + } +#line 2466 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 74: +#line 754 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = static_cast(TRI_PopStackParseAql(context)); + } +#line 2474 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 75: +#line 760 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2481 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 76: +#line 762 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2488 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 77: +#line 767 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushListAql(context, (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 2498 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 78: +#line 772 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushListAql(context, (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 2508 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 79: +#line 780 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeArrayAql(context); + if (node == NULL) { + ABORT_OOM + } + + TRI_PushStackParseAql(context, node); + } +#line 2521 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 80: +#line 787 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = static_cast(TRI_PopStackParseAql(context)); + } +#line 2529 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 81: +#line 793 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2536 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 82: +#line 795 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2543 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 83: +#line 800 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2550 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 84: +#line 802 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + } +#line 2557 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 85: +#line 807 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if (! TRI_PushArrayAql(context, (yyvsp[-2].strval), (yyvsp[0].node))) { + ABORT_OOM + } + } +#line 2567 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 86: +#line 815 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // start of reference (collection or variable name) + (yyval.node) = (yyvsp[0].node); + } +#line 2576 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 87: +#line 819 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // expanded variable access, e.g. variable[*] + TRI_aql_node_t* node; + char* varname = TRI_GetNameParseAql(context); + + if (varname == NULL) { + ABORT_OOM + } + + // push the varname onto the stack + TRI_PushStackParseAql(context, varname); + + // push on the stack what's going to be expanded (will be popped when we come back) + TRI_PushStackParseAql(context, (yyvsp[0].node)); + + // create a temporary variable for the row iterator (will be popped by "expansion" rule") + node = TRI_CreateNodeReferenceAql(context, varname); + + if (node == NULL) { + ABORT_OOM + } + + // push the variable + TRI_PushStackParseAql(context, node); + } +#line 2606 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 88: +#line 843 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // return from the "expansion" subrule + TRI_aql_node_t* expanded + = static_cast(TRI_PopStackParseAql(context)); + TRI_aql_node_t* expand; + TRI_aql_node_t* nameNode; + char* varname = static_cast(TRI_PopStackParseAql(context)); + + // push the actual expand node into the statement list + expand = TRI_CreateNodeExpandAql(context, varname, expanded, (yyvsp[0].node)); + + if (expand == NULL) { + ABORT_OOM + } + + if (! TRI_AppendStatementListAql(context->_statements, expand)) { + ABORT_OOM + } + + nameNode = TRI_AQL_NODE_MEMBER(expand, 1); + + if (nameNode == NULL) { + ABORT_OOM + } + + // return a reference only + (yyval.node) = TRI_CreateNodeReferenceAql(context, TRI_AQL_NODE_STRING(nameNode)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2643 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 89: +#line 878 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // variable or collection + TRI_aql_node_t* node; + + if (TRI_VariableExistsScopeAql(context, (yyvsp[0].strval))) { + node = TRI_CreateNodeReferenceAql(context, (yyvsp[0].strval)); + } + else { + node = TRI_CreateNodeCollectionAql(context, (yyvsp[0].strval)); + } + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2665 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 90: +#line 895 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2677 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 91: +#line 902 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // named variable access, e.g. variable.reference + (yyval.node) = TRI_CreateNodeAttributeAccessAql(context, (yyvsp[-2].node), (yyvsp[0].strval)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2690 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 92: +#line 910 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // named variable access, e.g. variable.@reference + (yyval.node) = TRI_CreateNodeBoundAttributeAccessAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2703 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 93: +#line 918 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // indexed variable access, e.g. variable[index] + (yyval.node) = TRI_CreateNodeIndexedAql(context, (yyvsp[-3].node), (yyvsp[-1].node)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2716 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 94: +#line 929 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // named variable access, continuation from * expansion, e.g. [*].variable.reference + TRI_aql_node_t* node + = static_cast(TRI_PopStackParseAql(context)); + + (yyval.node) = TRI_CreateNodeAttributeAccessAql(context, node, (yyvsp[0].strval)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2732 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 95: +#line 940 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // named variable access w/ bind parameter, continuation from * expansion, e.g. [*].variable.@reference + TRI_aql_node_t* node + = static_cast(TRI_PopStackParseAql(context)); + + (yyval.node) = TRI_CreateNodeBoundAttributeAccessAql(context, node, (yyvsp[0].node)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2748 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 96: +#line 951 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // indexed variable access, continuation from * expansion, e.g. [*].variable[index] + TRI_aql_node_t* node + = static_cast(TRI_PopStackParseAql(context)); + + (yyval.node) = TRI_CreateNodeIndexedAql(context, node, (yyvsp[-1].node)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2764 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 97: +#line 962 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // named variable access, continuation from * expansion, e.g. [*].variable.xx.reference + (yyval.node) = TRI_CreateNodeAttributeAccessAql(context, (yyvsp[-2].node), (yyvsp[0].strval)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2777 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 98: +#line 970 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // named variable access w/ bind parameter, continuation from * expansion, e.g. [*].variable.xx.@reference + (yyval.node) = TRI_CreateNodeBoundAttributeAccessAql(context, (yyvsp[-2].node), (yyvsp[0].node)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2790 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 99: +#line 978 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + // indexed variable access, continuation from * expansion, e.g. [*].variable.xx.[index] + (yyval.node) = TRI_CreateNodeIndexedAql(context, (yyvsp[-3].node), (yyvsp[-1].node)); + + if ((yyval.node) == NULL) { + ABORT_OOM + } + } +#line 2803 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 100: +#line 989 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2811 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 101: +#line 992 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2819 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 102: +#line 998 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2827 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 103: +#line 1001 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node; + double value; + + if ((yyvsp[0].strval) == NULL) { + ABORT_OOM + } + + value = TRI_DoubleString((yyvsp[0].strval)); + + if (TRI_errno() != TRI_ERROR_NO_ERROR) { + TRI_SetErrorContextAql(__FILE__, __LINE__, context, TRI_ERROR_QUERY_NUMBER_OUT_OF_RANGE, NULL); + YYABORT; + } + + node = TRI_CreateNodeValueDoubleAql(context, value); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2855 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 104: +#line 1026 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeValueStringAql(context, (yyvsp[0].strval)); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2869 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 105: +#line 1035 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.node) = (yyvsp[0].node); + } +#line 2877 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 106: +#line 1038 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeValueNullAql(context); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2891 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 107: +#line 1047 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeValueBoolAql(context, true); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2905 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 108: +#line 1056 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeValueBoolAql(context, false); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2919 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 109: +#line 1068 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node = TRI_CreateNodeParameterAql(context, (yyvsp[0].strval)); + + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2933 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 110: +#line 1080 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if ((yyvsp[0].strval) == NULL) { + ABORT_OOM + } + + (yyval.strval) = (yyvsp[0].strval); + } +#line 2945 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 111: +#line 1087 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + if ((yyvsp[0].strval) == NULL) { + ABORT_OOM + } + + (yyval.strval) = (yyvsp[0].strval); + } +#line 2957 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 112: +#line 1096 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + (yyval.strval) = (yyvsp[0].strval); + } +#line 2965 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + case 113: +#line 1102 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1646 */ + { + TRI_aql_node_t* node; + int64_t value; + + if ((yyvsp[0].strval) == NULL) { + ABORT_OOM + } + + value = TRI_Int64String((yyvsp[0].strval)); + if (TRI_errno() != TRI_ERROR_NO_ERROR) { + TRI_SetErrorContextAql(__FILE__, __LINE__, context, TRI_ERROR_QUERY_NUMBER_OUT_OF_RANGE, NULL); + YYABORT; + } + + node = TRI_CreateNodeValueIntAql(context, value); + if (node == NULL) { + ABORT_OOM + } + + (yyval.node) = node; + } +#line 2991 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + break; + + +#line 2995 "arangod/Ahuacatl/ahuacatl-grammar.c" /* yacc.c:1646 */ + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + *++yylsp = yyloc; + + /* 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]; + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (&yylloc, context, YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (&yylloc, context, yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + yyerror_range[1] = yylloc; + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, &yylloc, context); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* 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); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + yyerror_range[1] = *yylsp; + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yylsp, context); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + yyerror_range[2] = yylloc; + /* Using YYLLOC is tempting, but would change the location of + the lookahead. YYLOC is available though. */ + YYLLOC_DEFAULT (yyloc, yyerror_range, 2); + *++yylsp = yyloc; + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined yyoverflow || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (&yylloc, context, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, &yylloc, context); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yylsp, context); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + return yyresult; +} diff --git a/arangod/Ahuacatl/ahuacatl-grammar.h b/arangod/Ahuacatl/ahuacatl-grammar.h index 5cad6630e9..87b158b31e 100644 --- a/arangod/Ahuacatl/ahuacatl-grammar.h +++ b/arangod/Ahuacatl/ahuacatl-grammar.h @@ -105,14 +105,14 @@ extern int Ahuacatldebug; typedef union YYSTYPE YYSTYPE; union YYSTYPE { -#line 26 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1915 */ +#line 26 "arangod/Ahuacatl/ahuacatl-grammar.y" /* yacc.c:1909 */ TRI_aql_node_t* node; char* strval; bool boolval; int64_t intval; -#line 116 "arangod/Ahuacatl/ahuacatl-grammar.h" /* yacc.c:1915 */ +#line 116 "arangod/Ahuacatl/ahuacatl-grammar.h" /* yacc.c:1909 */ }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 diff --git a/arangod/Ahuacatl/ahuacatl-grammar.yy b/arangod/Ahuacatl/ahuacatl-grammar.yy index 9ea69dcb23..dd2e16186f 100644 --- a/arangod/Ahuacatl/ahuacatl-grammar.yy +++ b/arangod/Ahuacatl/ahuacatl-grammar.yy @@ -1,6 +1,6 @@ %define api.pure -%name-prefix="Ahuacatl" +%name-prefix "Ahuacatl" %locations %defines %parse-param { TRI_aql_context_t* const context } diff --git a/arangod/Ahuacatl/ahuacatl-index.cpp b/arangod/Ahuacatl/ahuacatl-index.cpp index 530aca1a5f..d9510529ab 100644 --- a/arangod/Ahuacatl/ahuacatl-index.cpp +++ b/arangod/Ahuacatl/ahuacatl-index.cpp @@ -113,7 +113,8 @@ static TRI_aql_index_t* PickIndex (TRI_aql_context_t* const context, assert(fieldAccesses); if (pickedIndex == NULL) { - pickedIndex = TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_aql_index_t), false); + pickedIndex = static_cast + (TRI_Allocate(TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_aql_index_t), false)); if (pickedIndex == NULL) { // OOM diff --git a/arangod/Ahuacatl/ahuacatl-optimiser.cpp b/arangod/Ahuacatl/ahuacatl-optimiser.cpp index 5a36b092d8..e15f2e0c82 100644 --- a/arangod/Ahuacatl/ahuacatl-optimiser.cpp +++ b/arangod/Ahuacatl/ahuacatl-optimiser.cpp @@ -533,7 +533,9 @@ static TRI_aql_node_t* AnnotateLoop (TRI_aql_statement_walker_t* const walker, assert(scope != NULL); while (scope->_sorts._length > 0) { - char* criterion = TRI_RemoveVectorPointer(&scope->_sorts, (size_t) (scope->_sorts._length - 1)); + char* criterion = static_cast + (TRI_RemoveVectorPointer(&scope->_sorts, + (size_t) (scope->_sorts._length - 1))); if (criterion != NULL) { TRI_Free(TRI_UNKNOWN_MEM_ZONE, criterion); @@ -704,7 +706,7 @@ static TRI_aql_node_t* OptimiseFcall (TRI_aql_context_t* const context, return node; } - res = TRI_GetErrorExecutionContext(execContext); + res = execContext->_error; if (res != TRI_ERROR_NO_ERROR) { TRI_FreeExecutionContext(execContext); @@ -714,7 +716,7 @@ static TRI_aql_node_t* OptimiseFcall (TRI_aql_context_t* const context, json = TRI_ExecuteResultContext(execContext); - res = TRI_GetErrorExecutionContext(execContext); + res = execContext->_error; TRI_FreeExecutionContext(execContext); if (res == TRI_ERROR_REQUEST_CANCELED) { @@ -1171,7 +1173,7 @@ static TRI_aql_node_t* OptimiseBinaryRelationalOperation (TRI_aql_context_t* con TRI_js_exec_context_t* execContext; TRI_string_buffer_t* code; TRI_json_t* json; - char* func; + char const* func; int res; if (! lhs || ! TRI_IsConstantValueNodeAql(lhs) || ! rhs || ! TRI_IsConstantValueNodeAql(rhs)) { @@ -1227,7 +1229,7 @@ static TRI_aql_node_t* OptimiseBinaryRelationalOperation (TRI_aql_context_t* con } // check if an error occurred during context creation - res = TRI_GetErrorExecutionContext(execContext); + res = execContext->_error; if (res != TRI_ERROR_NO_ERROR) { TRI_FreeExecutionContext(execContext); @@ -1240,7 +1242,7 @@ static TRI_aql_node_t* OptimiseBinaryRelationalOperation (TRI_aql_context_t* con } json = TRI_ExecuteResultContext(execContext); - res = TRI_GetErrorExecutionContext(execContext); + res = execContext->_error; TRI_FreeExecutionContext(execContext); @@ -1564,7 +1566,9 @@ static void PatchVariables (TRI_aql_statement_walker_t* const walker) { if (expressionNode->_type == TRI_AQL_NODE_FCALL) { // the defining node is a function call // get the function name - TRI_aql_function_t* function = TRI_AQL_NODE_DATA(expressionNode); + TRI_aql_function_t* function + = static_cast + (TRI_AQL_NODE_DATA(expressionNode)); if (function->optimise != NULL) { // call the function's optimise callback @@ -1604,7 +1608,7 @@ static void NoteLimit (TRI_aql_statement_walker_t* const walker, TRI_aql_scope_t* scope; aql_optimiser_t* optimiser; - optimiser = walker->_data; + optimiser = static_cast(walker->_data); if (offset->_type != TRI_AQL_NODE_VALUE || limit->_type != TRI_AQL_NODE_VALUE) { TRI_SetErrorContextAql(__FILE__, __LINE__, optimiser->_context, TRI_ERROR_QUERY_NUMBER_OUT_OF_RANGE, NULL); diff --git a/arangod/Ahuacatl/ahuacatl-scope.cpp b/arangod/Ahuacatl/ahuacatl-scope.cpp index 40f3cebefb..5473ac1e77 100644 --- a/arangod/Ahuacatl/ahuacatl-scope.cpp +++ b/arangod/Ahuacatl/ahuacatl-scope.cpp @@ -157,7 +157,8 @@ static void FreeScope (TRI_aql_scope_t* const scope) { // free variables lookup hash n = scope->_variables._nrAlloc; for (i = 0; i < n; ++i) { - TRI_aql_variable_t* variable = scope->_variables._table[i]; + TRI_aql_variable_t* variable + = static_cast(scope->_variables._table[i]); if (variable) { TRI_FreeVariableAql(variable); @@ -340,7 +341,8 @@ bool TRI_EndScopeAql (TRI_aql_context_t* const context) { n = context->_currentScopes._length; assert(n > 0); - scope = TRI_RemoveVectorPointer(&context->_currentScopes, --n); + scope = static_cast + (TRI_RemoveVectorPointer(&context->_currentScopes, --n)); LOG_TRACE("closing scope of type %s", TRI_TypeNameScopeAql(scope->_type)); node = TRI_CreateNodeScopeEndAql(context, scope); diff --git a/arangod/Ahuacatl/ahuacatl-statement-walker.cpp b/arangod/Ahuacatl/ahuacatl-statement-walker.cpp index c8e8d31acf..bf853d2bec 100644 --- a/arangod/Ahuacatl/ahuacatl-statement-walker.cpp +++ b/arangod/Ahuacatl/ahuacatl-statement-walker.cpp @@ -134,7 +134,8 @@ static void RunWalk (TRI_aql_statement_walker_t* const walker) { if (walker->preVisitStatement != NULL) { // this might change the node ptr VisitStatement(walker, i, walker->preVisitStatement); - node = walker->_statements->_statements._buffer[i]; + node = static_cast + (walker->_statements->_statements._buffer[i]); } @@ -330,7 +331,9 @@ TRI_aql_variable_t* TRI_GetVariableStatementWalkerAql (TRI_aql_statement_walker_ scope = (TRI_aql_scope_t*) TRI_AtVectorPointer(&walker->_currentScopes, --n); assert(scope); - variable = TRI_LookupByKeyAssociativePointer(&scope->_variables, (void*) name); + variable = static_cast + (TRI_LookupByKeyAssociativePointer(&scope->_variables, + (void*) name)); if (variable != NULL) { return variable; } diff --git a/arangod/Ahuacatl/ahuacatl-variable.cpp b/arangod/Ahuacatl/ahuacatl-variable.cpp index 500b139f57..bfeb5cfadb 100644 --- a/arangod/Ahuacatl/ahuacatl-variable.cpp +++ b/arangod/Ahuacatl/ahuacatl-variable.cpp @@ -111,7 +111,7 @@ bool TRI_EqualVariableAql (TRI_associative_pointer_t* array, void const* element) { TRI_aql_variable_t* variable = (TRI_aql_variable_t*) element; - return TRI_EqualString(key, variable->_name); + return TRI_EqualString(static_cast(key), variable->_name); } diff --git a/arangod/Makefile.files b/arangod/Makefile.files index 681372fb92..f893ae208e 100644 --- a/arangod/Makefile.files +++ b/arangod/Makefile.files @@ -163,16 +163,20 @@ FLEXXX_FILES += \ ### @brief bison ################################################################################ -BISONXX_FILES += \ - arangod/Ahuacatl/ahuacatl-grammar.cpp +BISON_FILES += \ + arangod/Ahuacatl/ahuacatl-grammar.c if ENABLE_MAINTAINER_MODE CLEANUP += \ arangod/Ahuacatl/ahuacatl-grammar.h \ + arangod/Ahuacatl/ahuacatl-grammar.c \ arangod/Ahuacatl/ahuacatl-grammar.cpp endif +arangod/Ahuacatl/ahuacatl-grammar.cpp: arangod/Ahuacatl/ahuacatl-grammar.c + cp arangod/Ahuacatl/ahuacatl-grammar.c arangod/Ahuacatl/ahuacatl-grammar.cpp + ################################################################################ ## --SECTION-- END-OF-FILE ################################################################################ diff --git a/arangod/VocBase/document-collection.h b/arangod/VocBase/document-collection.h index 950e6c5982..4386bdac59 100644 --- a/arangod/VocBase/document-collection.h +++ b/arangod/VocBase/document-collection.h @@ -34,7 +34,6 @@ #include "VocBase/headers.h" #include "VocBase/index.h" #include "VocBase/voc-types.h" -#include "Wal/Marker.h" #include @@ -146,39 +145,6 @@ struct TRI_json_s; } \ } while (0) -//////////////////////////////////////////////////////////////////////////////// -/// @brief extracts the shaped JSON pointer from a marker -//////////////////////////////////////////////////////////////////////////////// - -static inline void TRI_EXTRACT_SHAPED_JSON_MARKER (TRI_shaped_json_t& dst, - void const* src) { - if (((TRI_df_marker_t const*) (src))->_type == TRI_DOC_MARKER_KEY_DOCUMENT) { - (dst)._sid = ((TRI_doc_document_key_marker_t*) (src))->_shape; - (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((TRI_doc_document_key_marker_t*) (src))->_offsetJson; - (dst)._data.data = (((char*) (src)) + ((TRI_doc_document_key_marker_t*) (src))->_offsetJson); - } - else if (((TRI_df_marker_t const*) (src))->_type == TRI_DOC_MARKER_KEY_EDGE) { - (dst)._sid = ((TRI_doc_document_key_marker_t*) (src))->_shape; - (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((TRI_doc_document_key_marker_t*) (src))->_offsetJson; - (dst)._data.data = (((char*) (src)) + ((TRI_doc_document_key_marker_t*) (src))->_offsetJson); - } - else if (((TRI_df_marker_t const*) (src))->_type == TRI_WAL_MARKER_DOCUMENT) { - (dst)._sid = ((triagens::wal::document_marker_t*) (src))->_shape; - (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((triagens::wal::document_marker_t*) (src))->_offsetJson; - (dst)._data.data = (((char*) (src)) + ((triagens::wal::document_marker_t*) (src))->_offsetJson); - } - else if (((TRI_df_marker_t const*) (src))->_type == TRI_WAL_MARKER_EDGE) { - (dst)._sid = ((triagens::wal::edge_marker_t*) (src))->base._shape; - (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((triagens::wal::edge_marker_t*) (src))->base._offsetJson; - (dst)._data.data = (((char*) (src)) + ((triagens::wal::edge_marker_t*) (src))->base._offsetJson); - } - else { - (dst)._sid = 0; - (dst)._data.length = 0; - (dst)._data.data = NULL; - } -} - //////////////////////////////////////////////////////////////////////////////// /// @} //////////////////////////////////////////////////////////////////////////////// diff --git a/arangod/VocBase/replication-dump.cpp b/arangod/VocBase/replication-dump.cpp index 390a5fe603..ae94040ecc 100644 --- a/arangod/VocBase/replication-dump.cpp +++ b/arangod/VocBase/replication-dump.cpp @@ -39,6 +39,7 @@ #include "VocBase/document-collection.h" #include "VocBase/transaction.h" #include "VocBase/vocbase.h" +#include "VocBase/voc-shaper.h" // ----------------------------------------------------------------------------- // --SECTION-- REPLICATION diff --git a/arangod/VocBase/replication-logger.cpp b/arangod/VocBase/replication-logger.cpp index 84927ca035..2327d85d27 100644 --- a/arangod/VocBase/replication-logger.cpp +++ b/arangod/VocBase/replication-logger.cpp @@ -40,6 +40,7 @@ #include "VocBase/server.h" #include "VocBase/transaction.h" #include "VocBase/vocbase.h" +#include "VocBase/voc-shaper.h" // ----------------------------------------------------------------------------- // --SECTION-- REPLICATION LOGGER diff --git a/arangod/VocBase/voc-shaper.h b/arangod/VocBase/voc-shaper.h index 98d8a550ac..980159fe3c 100644 --- a/arangod/VocBase/voc-shaper.h +++ b/arangod/VocBase/voc-shaper.h @@ -36,6 +36,7 @@ #include "ShapedJson/shaped-json.h" #include "VocBase/datafile.h" #include "VocBase/document-collection.h" +#include "Wal/Marker.h" #ifdef __cplusplus extern "C" { @@ -159,6 +160,39 @@ int TRI_CompareShapeTypes (TRI_doc_mptr_t* leftDocument, TRI_shaper_t* leftShaper, TRI_shaper_t* rightShaper); +//////////////////////////////////////////////////////////////////////////////// +/// @brief extracts the shaped JSON pointer from a marker +//////////////////////////////////////////////////////////////////////////////// + +static inline void TRI_EXTRACT_SHAPED_JSON_MARKER (TRI_shaped_json_t& dst, + void const* src) { + if (((TRI_df_marker_t const*) (src))->_type == TRI_DOC_MARKER_KEY_DOCUMENT) { + (dst)._sid = ((TRI_doc_document_key_marker_t*) (src))->_shape; + (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((TRI_doc_document_key_marker_t*) (src))->_offsetJson; + (dst)._data.data = (((char*) (src)) + ((TRI_doc_document_key_marker_t*) (src))->_offsetJson); + } + else if (((TRI_df_marker_t const*) (src))->_type == TRI_DOC_MARKER_KEY_EDGE) { + (dst)._sid = ((TRI_doc_document_key_marker_t*) (src))->_shape; + (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((TRI_doc_document_key_marker_t*) (src))->_offsetJson; + (dst)._data.data = (((char*) (src)) + ((TRI_doc_document_key_marker_t*) (src))->_offsetJson); + } + else if (((TRI_df_marker_t const*) (src))->_type == TRI_WAL_MARKER_DOCUMENT) { + (dst)._sid = ((triagens::wal::document_marker_t*) (src))->_shape; + (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((triagens::wal::document_marker_t*) (src))->_offsetJson; + (dst)._data.data = (((char*) (src)) + ((triagens::wal::document_marker_t*) (src))->_offsetJson); + } + else if (((TRI_df_marker_t const*) (src))->_type == TRI_WAL_MARKER_EDGE) { + (dst)._sid = ((triagens::wal::edge_marker_t*) (src))->base._shape; + (dst)._data.length = ((TRI_df_marker_t*) (src))->_size - ((triagens::wal::edge_marker_t*) (src))->base._offsetJson; + (dst)._data.data = (((char*) (src)) + ((triagens::wal::edge_marker_t*) (src))->base._offsetJson); + } + else { + (dst)._sid = 0; + (dst)._data.length = 0; + (dst)._data.data = NULL; + } +} + #ifdef __cplusplus } #endif diff --git a/lib/V8/v8-execution.cpp b/lib/V8/v8-execution.cpp index afa9e87018..f494db8fa2 100644 --- a/lib/V8/v8-execution.cpp +++ b/lib/V8/v8-execution.cpp @@ -27,11 +27,6 @@ #include "v8-execution.h" -#include -#include - -#include - #include "V8/v8-conv.h" using namespace std; @@ -44,38 +39,18 @@ using namespace std; // --SECTION-- public types // ----------------------------------------------------------------------------- -//////////////////////////////////////////////////////////////////////////////// -/// @brief execution context -//////////////////////////////////////////////////////////////////////////////// - -typedef struct js_exec_context_s { - v8::Isolate* _isolate; - v8::Persistent _func; - v8::Persistent _arguments; - int _error; -} -js_exec_context_t; - // ----------------------------------------------------------------------------- // --SECTION-- constructors and destructors // ----------------------------------------------------------------------------- -//////////////////////////////////////////////////////////////////////////////// -/// @brief fetch the error code from an execution context -//////////////////////////////////////////////////////////////////////////////// - -int TRI_GetErrorExecutionContext (TRI_js_exec_context_t const context) { - return ((js_exec_context_t const*) context)->_error; -} - //////////////////////////////////////////////////////////////////////////////// /// @brief creates a new execution context //////////////////////////////////////////////////////////////////////////////// -TRI_js_exec_context_t TRI_CreateExecutionContext (char const* script, +TRI_js_exec_context_t* TRI_CreateExecutionContext (char const* script, size_t length) { v8::Isolate* isolate = v8::Isolate::GetCurrent(); - js_exec_context_t* ctx = new js_exec_context_t; + TRI_js_exec_context_t* ctx = new TRI_js_exec_context_t; ctx->_error = TRI_ERROR_NO_ERROR; // execute script inside the context @@ -85,7 +60,7 @@ TRI_js_exec_context_t TRI_CreateExecutionContext (char const* script, // compilation failed, return if (compiled.IsEmpty()) { ctx->_error = TRI_ERROR_INTERNAL; - return (TRI_js_exec_context_t) ctx; + return ctx; } // compute the function @@ -99,12 +74,12 @@ TRI_js_exec_context_t TRI_CreateExecutionContext (char const* script, else { ctx->_error = TRI_ERROR_REQUEST_CANCELED; } - return (TRI_js_exec_context_t) ctx; + return ctx; } if (val.IsEmpty()) { ctx->_error = TRI_ERROR_INTERNAL; - return (TRI_js_exec_context_t) ctx; + return ctx; } ctx->_func = v8::Persistent::New(isolate, v8::Handle::Cast(val)); @@ -113,18 +88,14 @@ TRI_js_exec_context_t TRI_CreateExecutionContext (char const* script, ctx->_error = TRI_ERROR_NO_ERROR; // return the handle - return (TRI_js_exec_context_t) ctx; + return ctx; } //////////////////////////////////////////////////////////////////////////////// /// @brief frees an new execution context //////////////////////////////////////////////////////////////////////////////// -void TRI_FreeExecutionContext (TRI_js_exec_context_t context) { - js_exec_context_t* ctx; - - ctx = (js_exec_context_t*) context; - +void TRI_FreeExecutionContext (TRI_js_exec_context_t* ctx) { if (ctx->_error == TRI_ERROR_NO_ERROR) { ctx->_func.Dispose(ctx->_isolate); ctx->_func.Clear(); @@ -144,11 +115,7 @@ void TRI_FreeExecutionContext (TRI_js_exec_context_t context) { /// @brief executes a result context //////////////////////////////////////////////////////////////////////////////// -TRI_json_t* TRI_ExecuteResultContext (TRI_js_exec_context_t context) { - js_exec_context_t* ctx; - - ctx = (js_exec_context_t*) context; - +TRI_json_t* TRI_ExecuteResultContext (TRI_js_exec_context_t* ctx) { assert(ctx->_error == TRI_ERROR_NO_ERROR); // convert back into a handle diff --git a/lib/V8/v8-execution.h b/lib/V8/v8-execution.h index 997905f3f7..621a4b0295 100644 --- a/lib/V8/v8-execution.h +++ b/lib/V8/v8-execution.h @@ -29,6 +29,9 @@ #define TRIAGENS_V8_V8_EXECUTION_H 1 #include "BasicsC/common.h" +#include "Basics/Common.h" + +#include #ifdef __cplusplus extern "C" { @@ -48,29 +51,29 @@ struct TRI_json_s; /// @brief execution context //////////////////////////////////////////////////////////////////////////////// -typedef void* TRI_js_exec_context_t; +typedef struct TRI_js_exec_context_s { + v8::Isolate* _isolate; + v8::Persistent _func; + v8::Persistent _arguments; + int _error; +} +TRI_js_exec_context_t; // ----------------------------------------------------------------------------- // --SECTION-- constructors and destructors // ----------------------------------------------------------------------------- -//////////////////////////////////////////////////////////////////////////////// -/// @brief fetch the error code from an execution context -//////////////////////////////////////////////////////////////////////////////// - -int TRI_GetErrorExecutionContext (TRI_js_exec_context_t const); - //////////////////////////////////////////////////////////////////////////////// /// @brief creates a new execution context //////////////////////////////////////////////////////////////////////////////// -TRI_js_exec_context_t TRI_CreateExecutionContext (const char*, size_t); +TRI_js_exec_context_t* TRI_CreateExecutionContext (const char*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief frees an new execution context //////////////////////////////////////////////////////////////////////////////// -void TRI_FreeExecutionContext (TRI_js_exec_context_t); +void TRI_FreeExecutionContext (TRI_js_exec_context_t*); // ----------------------------------------------------------------------------- // --SECTION-- public functions @@ -80,7 +83,7 @@ void TRI_FreeExecutionContext (TRI_js_exec_context_t); /// @brief executes a result context //////////////////////////////////////////////////////////////////////////////// -struct TRI_json_s* TRI_ExecuteResultContext (TRI_js_exec_context_t context); +struct TRI_json_s* TRI_ExecuteResultContext (TRI_js_exec_context_t* context); #ifdef __cplusplus }