mirror of https://gitee.com/bigwinds/arangodb
215 lines
9.1 KiB
C
215 lines
9.1 KiB
C
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief query parsing
|
|
///
|
|
/// @file
|
|
///
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2012, triagens GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef TRIAGENS_DURHAM_VOC_BASE_QUERY_PARSE_H
|
|
#define TRIAGENS_DURHAM_VOC_BASE_QUERY_PARSE_H 1
|
|
|
|
#include <BasicsC/voc-errors.h>
|
|
|
|
#include "VocBase/query-base.h"
|
|
#include "VocBase/query-memory.h"
|
|
#include "QL/optimize.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @addtogroup VocBase
|
|
/// @{
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Maximum length of an identifier in a query
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#define TRI_QUERY_ALIAS_MAX_LENGTH 64
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// --SECTION-- forwards
|
|
// -----------------------------------------------------------------------------
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Forward declaration for parse function as generated by flex/bison
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
int QLparse (TRI_query_template_t* const);
|
|
int QLlex_destroy (void *);
|
|
void QLset_extra (TRI_query_template_t* const, void*);
|
|
int QLlex_init (void**);
|
|
int QLget_lineno (void*);
|
|
int QLget_column (void*);
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// --SECTION-- parser
|
|
// -----------------------------------------------------------------------------
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Parse the query contained in a query template
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool TRI_ParseQueryTemplate (TRI_query_template_t* const);
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// --SECTION-- parser helper functions
|
|
// -----------------------------------------------------------------------------
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief copies a string and keeps track of its memory location in a vector
|
|
///
|
|
/// This mimics TRI_DuplicateString (@ref TRI_DuplicateString) but also keeps
|
|
/// track of the strings memory location for later garbage collection.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
char* TRI_ParseQueryAllocString (TRI_query_template_t* const, const char*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief copies a string part and keeps track of its memory location in a vector
|
|
///
|
|
/// This mimics TRI_DuplicateString2 (@ref TRI_DuplicateString2) but also keeps
|
|
/// track of the strings memory location for later garbage collection.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
char* TRI_ParseQueryAllocString2 (TRI_query_template_t* const,
|
|
const char*,
|
|
const size_t);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief keep track of an allocated string
|
|
///
|
|
/// Register a strings memory location for later garbage collection
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
char* TRI_ParseQueryRegisterString (TRI_query_template_t* const, const char*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief free a string
|
|
///
|
|
/// Free memory that was allocated for a string
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void TRI_ParseQueryFreeString (char*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief create a new node for the ast
|
|
///
|
|
/// Create a new AST node of the given type (@ref TRI_query_node_type_e)
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
TRI_query_node_t* TRI_ParseQueryCreateNode (TRI_query_template_t* const,
|
|
const TRI_query_node_type_e);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief open a new context layer for the parser
|
|
///
|
|
/// Layers are currently necessary to keep track of non-hierarchical lists
|
|
/// (arrays, objects) in the parser.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void TRI_ParseQueryContextPush (TRI_query_template_t* const, TRI_query_node_t*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief close the current context layer of the parser and return it
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
TRI_query_node_t* TRI_ParseQueryContextPop (TRI_query_template_t* const);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief add an element to the current parsing context
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void TRI_ParseQueryContextAddElement (TRI_query_template_t* const, TRI_query_node_t*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief pop the current parse context from the stack into the rhs element
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void TRI_ParseQueryPopIntoRhs (TRI_query_node_t*, TRI_query_template_t* const);
|
|
|
|
// -----------------------------------------------------------------------------
|
|
// --SECTION-- validation
|
|
// -----------------------------------------------------------------------------
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Validation function typedef to validate collection names
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef bool(*QL_parser_validate_func) (QL_ast_query_t*, const char*, const size_t);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Validate a collection name
|
|
///
|
|
/// Currently, a collection name must consist of the letters A-Z or a-z only
|
|
/// Its length must not exceed QL_QUERY_NAME_LEN chars.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool TRI_ParseQueryValidateCollectionName (const char*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Validate a collection alias
|
|
///
|
|
/// Currently, a collection name must consist of the letters A-Z or a-z only
|
|
/// Its length must not exceed QL_QUERY_NAME_LEN chars.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool TRI_ParseQueryValidateCollectionAlias (const char*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Validate the function names used in a query part
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool TRI_ParseQueryValidateFunctionCalls (TRI_query_template_t* const,
|
|
const TRI_query_node_t* const);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Validate the collections used in a query part
|
|
///
|
|
/// Currently validates if all used collection names in the query part are
|
|
/// actually declared in the query's from clause.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
bool TRI_ParseQueryValidateCollections (TRI_query_template_t* const,
|
|
const TRI_query_node_t* const,
|
|
QL_parser_validate_func,
|
|
size_t*);
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @}
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|
|
// Local Variables:
|
|
// mode: outline-minor
|
|
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
|
|
// End:
|
|
|