mirror of
https://github.com/MariaDB/server.git
synced 2025-12-09 08:01:34 +03:00
Add support for bound ids in InnoDB's SQL parser.
This commit is contained in:
@@ -531,6 +531,16 @@ pars_info_add_function(
|
||||
pars_user_func_cb_t func, /* in: function address */
|
||||
void* arg); /* in: user-supplied argument */
|
||||
|
||||
/********************************************************************
|
||||
Add bound id. */
|
||||
|
||||
void
|
||||
pars_info_add_id(
|
||||
/*=============*/
|
||||
pars_info_t* info, /* in: info struct */
|
||||
const char* name, /* in: name */
|
||||
const char* id); /* in: id */
|
||||
|
||||
/********************************************************************
|
||||
Get user function with the given name.*/
|
||||
|
||||
@@ -553,6 +563,17 @@ pars_info_get_bound_lit(
|
||||
pars_info_t* info, /* in: info struct */
|
||||
const char* name); /* in: bound literal name to find */
|
||||
|
||||
/********************************************************************
|
||||
Get bound id with the given name.*/
|
||||
|
||||
pars_bound_id_t*
|
||||
pars_info_get_bound_id(
|
||||
/*===================*/
|
||||
/* out: bound id, or NULL if not
|
||||
found */
|
||||
pars_info_t* info, /* in: info struct */
|
||||
const char* name); /* in: bound id name to find */
|
||||
|
||||
|
||||
/* Extra information supplied for pars_sql(). */
|
||||
struct pars_info_struct {
|
||||
@@ -562,6 +583,8 @@ struct pars_info_struct {
|
||||
(pars_user_func_t*) */
|
||||
ib_vector_t* bound_lits; /* bound literals, or NULL
|
||||
(pars_bound_lit_t*) */
|
||||
ib_vector_t* bound_ids; /* bound ids, or NULL
|
||||
(pars_bound_id_t*) */
|
||||
|
||||
ibool graph_owns_us; /* if TRUE (which is the default),
|
||||
que_graph_free() will free us */
|
||||
@@ -583,6 +606,12 @@ struct pars_bound_lit_struct {
|
||||
ulint prtype; /* precise type, e.g. DATA_UNSIGNED */
|
||||
};
|
||||
|
||||
/* Bound id. */
|
||||
struct pars_bound_id_struct {
|
||||
const char* name; /* name */
|
||||
const char* id; /* id */
|
||||
};
|
||||
|
||||
/* Struct used to denote a reserved word in a parsing tree */
|
||||
struct pars_res_word_struct{
|
||||
int code; /* the token code for the reserved word from
|
||||
|
||||
@@ -82,6 +82,16 @@ sym_tab_add_id(
|
||||
byte* name, /* in: identifier name */
|
||||
ulint len); /* in: identifier length */
|
||||
|
||||
/**********************************************************************
|
||||
Add a bound identifier to a symbol table. */
|
||||
|
||||
sym_node_t*
|
||||
sym_tab_add_bound_id(
|
||||
/*===========*/
|
||||
/* out: symbol table node */
|
||||
sym_tab_t* sym_tab, /* in: symbol table */
|
||||
const char* name); /* in: name of bound id */
|
||||
|
||||
#define SYM_CLUST_FIELD_NO 0
|
||||
#define SYM_SEC_FIELD_NO 1
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ Created 1/11/1998 Heikki Tuuri
|
||||
typedef struct pars_info_struct pars_info_t;
|
||||
typedef struct pars_user_func_struct pars_user_func_t;
|
||||
typedef struct pars_bound_lit_struct pars_bound_lit_t;
|
||||
typedef struct pars_bound_id_struct pars_bound_id_t;
|
||||
typedef struct sym_node_struct sym_node_t;
|
||||
typedef struct sym_tab_struct sym_tab_t;
|
||||
typedef struct pars_res_word_struct pars_res_word_t;
|
||||
|
||||
952
pars/lexyy.c
952
pars/lexyy.c
File diff suppressed because it is too large
Load Diff
@@ -84,6 +84,7 @@ string_append(
|
||||
DIGIT [0-9]
|
||||
ID [a-z_A-Z][a-z_A-Z0-9]*
|
||||
BOUND_LIT \:[a-z_A-Z0-9]+
|
||||
BOUND_ID \$[a-z_A-Z0-9]+
|
||||
|
||||
%x comment
|
||||
%x quoted
|
||||
@@ -111,6 +112,13 @@ BOUND_LIT \:[a-z_A-Z0-9]+
|
||||
return(type);
|
||||
}
|
||||
|
||||
{BOUND_ID} {
|
||||
yylval = sym_tab_add_bound_id(pars_sym_tab_global,
|
||||
yytext + 1);
|
||||
|
||||
return(PARS_ID_TOKEN);
|
||||
}
|
||||
|
||||
"'" {
|
||||
/* Quoted character string literals are handled in an explicit
|
||||
start state 'quoted'. This state is entered and the buffer for
|
||||
|
||||
@@ -1931,6 +1931,7 @@ pars_info_create(void)
|
||||
info->heap = heap;
|
||||
info->funcs = NULL;
|
||||
info->bound_lits = NULL;
|
||||
info->bound_ids = NULL;
|
||||
info->graph_owns_us = TRUE;
|
||||
|
||||
return(info);
|
||||
@@ -2070,6 +2071,32 @@ pars_info_add_function(
|
||||
ib_vector_push(info->funcs, puf);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Add bound id. */
|
||||
|
||||
void
|
||||
pars_info_add_id(
|
||||
/*=============*/
|
||||
pars_info_t* info, /* in: info struct */
|
||||
const char* name, /* in: name */
|
||||
const char* id) /* in: id */
|
||||
{
|
||||
pars_bound_id_t* bid;
|
||||
|
||||
ut_ad(!pars_info_get_bound_id(info, name));
|
||||
|
||||
bid = mem_heap_alloc(info->heap, sizeof(*bid));
|
||||
|
||||
bid->name = name;
|
||||
bid->id = id;
|
||||
|
||||
if (!info->bound_ids) {
|
||||
info->bound_ids = ib_vector_create(info->heap, 8);
|
||||
}
|
||||
|
||||
ib_vector_push(info->bound_ids, bid);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Get user function with the given name.*/
|
||||
|
||||
@@ -2131,3 +2158,34 @@ pars_info_get_bound_lit(
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
Get bound id with the given name.*/
|
||||
|
||||
pars_bound_id_t*
|
||||
pars_info_get_bound_id(
|
||||
/*===================*/
|
||||
/* out: bound id, or NULL if not
|
||||
found */
|
||||
pars_info_t* info, /* in: info struct */
|
||||
const char* name) /* in: bound id name to find */
|
||||
{
|
||||
ulint i;
|
||||
ib_vector_t* vec;
|
||||
|
||||
if (!info || !info->bound_ids) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
vec = info->bound_ids;
|
||||
|
||||
for (i = 0; i < ib_vector_size(vec); i++) {
|
||||
pars_bound_id_t* bid = ib_vector_get(vec, i);
|
||||
|
||||
if (strcmp(bid->name, name) == 0) {
|
||||
return(bid);
|
||||
}
|
||||
}
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
@@ -304,3 +304,42 @@ sym_tab_add_id(
|
||||
|
||||
return(node);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
Add a bound identifier to a symbol table. */
|
||||
|
||||
sym_node_t*
|
||||
sym_tab_add_bound_id(
|
||||
/*===========*/
|
||||
/* out: symbol table node */
|
||||
sym_tab_t* sym_tab, /* in: symbol table */
|
||||
const char* name) /* in: name of bound id */
|
||||
{
|
||||
sym_node_t* node;
|
||||
pars_bound_id_t* bid;
|
||||
|
||||
bid = pars_info_get_bound_id(sym_tab->info, name);
|
||||
ut_a(bid);
|
||||
|
||||
node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
|
||||
|
||||
node->common.type = QUE_NODE_SYMBOL;
|
||||
|
||||
node->resolved = FALSE;
|
||||
node->indirection = NULL;
|
||||
|
||||
node->name = mem_heap_strdup(sym_tab->heap, bid->id);
|
||||
node->name_len = strlen(node->name);
|
||||
|
||||
UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);
|
||||
|
||||
dfield_set_data(&(node->common.val), NULL, UNIV_SQL_NULL);
|
||||
|
||||
node->common.val_buf_size = 0;
|
||||
node->prefetch_buf = NULL;
|
||||
node->cursor_def = NULL;
|
||||
|
||||
node->sym_table = sym_tab;
|
||||
|
||||
return(node);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user