You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-30 19:23:07 +03:00
MCOL-1384 Parser accepts quotes with qualified dbobject identifiers.
This commit is contained in:
@ -18,6 +18,7 @@
|
||||
|
||||
/* $Id: ddl.l 9341 2013-03-27 14:10:35Z chao $ */
|
||||
%{
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <stdio.h>
|
||||
@ -31,10 +32,11 @@
|
||||
#endif
|
||||
|
||||
using namespace ddlpackage;
|
||||
typedef enum { NOOP, STRIP_QUOTES, STRIP_QUOTES_FQ } copy_action_t;
|
||||
int lineno = 1;
|
||||
void ddlerror(struct pass_to_bison* x, char const *s);
|
||||
|
||||
static char* scanner_copy(char *str, yyscan_t yyscanner);
|
||||
static char* scanner_copy(char *str, yyscan_t yyscanner, copy_action_t action = NOOP );
|
||||
|
||||
%}
|
||||
|
||||
@ -54,6 +56,10 @@ horiz_space [ \t\f]
|
||||
newline [\n\r]
|
||||
non_newline [^\n\r]
|
||||
|
||||
quote '
|
||||
double_quote \"
|
||||
grave_accent `
|
||||
|
||||
comment ("--"{non_newline}*)
|
||||
self [,()\[\].;\:\+\-\*\/\%\^\<\>\=]
|
||||
whitespace ({space}+|{comment})
|
||||
@ -62,6 +68,12 @@ digit [0-9]
|
||||
ident_start [A-Za-z\200-\377_]
|
||||
ident_cont [A-Za-z\200-\377_0-9\$]
|
||||
identifier {ident_start}{ident_cont}*
|
||||
/* fully qualified names regexes */
|
||||
fq_identifier {identifier}\.{identifier}
|
||||
identifier_quoted {grave_accent}{identifier}{grave_accent}
|
||||
identifier_double_quoted {double_quote}{identifier}{double_quote}
|
||||
fq_quoted ({identifier_quoted}|{identifier})\.({identifier_quoted}|{identifier})
|
||||
fq_double_quoted ({identifier_double_quoted}|{identifier})\.({identifier_double_quoted}|{identifier})
|
||||
|
||||
integer [-+]?{digit}+
|
||||
decimal ([-+]?({digit}*\.{digit}+)|({digit}+\.{digit}*))
|
||||
@ -69,11 +81,16 @@ real ({integer}|{decimal})[Ee][-+]?{digit}+
|
||||
realfail1 ({integer}|{decimal})[Ee]
|
||||
realfail2 ({integer}|{decimal})[Ee][-+]
|
||||
|
||||
quote '
|
||||
grave_accent `
|
||||
|
||||
%%
|
||||
|
||||
|
||||
{identifier_quoted} { ddlget_lval(yyscanner)->str = scanner_copy( ddlget_text(yyscanner), yyscanner, STRIP_QUOTES ); return IDENT; }
|
||||
{identifier_double_quoted} { ddlget_lval(yyscanner)->str = scanner_copy( ddlget_text(yyscanner), yyscanner, STRIP_QUOTES ); return IDENT; }
|
||||
{fq_identifier} { ddlget_lval(yyscanner)->str = scanner_copy(ddlget_text(yyscanner), yyscanner); return FQ_IDENT; }
|
||||
{fq_quoted} { ddlget_lval(yyscanner)->str = scanner_copy(ddlget_text(yyscanner), yyscanner, STRIP_QUOTES_FQ); return FQ_IDENT; }
|
||||
{fq_double_quoted} { ddlget_lval(yyscanner)->str = scanner_copy(ddlget_text(yyscanner), yyscanner, STRIP_QUOTES_FQ); return FQ_IDENT; }
|
||||
|
||||
ACTION {return ACTION;}
|
||||
ADD {return ADD;}
|
||||
ALTER {return ALTER;}
|
||||
@ -198,6 +215,11 @@ using namespace ddlpackage;
|
||||
*/
|
||||
void scanner_init(const char* str, yyscan_t yyscanner)
|
||||
{
|
||||
#ifdef YYDEBUG
|
||||
extern int ddldebug;
|
||||
ddldebug = 1;
|
||||
#endif
|
||||
|
||||
size_t slen = strlen(str);
|
||||
scan_data* pScanData = (scan_data*)ddlget_extra(yyscanner);
|
||||
|
||||
@ -246,10 +268,72 @@ void scanner_finish(yyscan_t yyscanner)
|
||||
pScanData->valbuf.clear();
|
||||
}
|
||||
|
||||
char* scanner_copy (char *str, yyscan_t yyscanner)
|
||||
char* scanner_copy (char *str, yyscan_t yyscanner, copy_action_t action)
|
||||
{
|
||||
char* nv = strdup(str);
|
||||
if(nv)
|
||||
((scan_data*)ddlget_extra(yyscanner))->valbuf.push_back(nv);
|
||||
return nv;
|
||||
char* result;
|
||||
char* nv = strdup(str);
|
||||
result = nv;
|
||||
|
||||
// free strduped memory later to prevent possible memory leak
|
||||
if(nv)
|
||||
((scan_data*)ddlget_extra(yyscanner))->valbuf.push_back(nv);
|
||||
|
||||
if(action == STRIP_QUOTES)
|
||||
{
|
||||
nv[strlen(str) - 1] = '\0';
|
||||
result = nv + 1;
|
||||
}
|
||||
else if (action == STRIP_QUOTES_FQ)
|
||||
{
|
||||
bool move_left = false;
|
||||
bool move_right = false;
|
||||
char* left = nv;
|
||||
char* tmp_first = nv;
|
||||
// MCOL-1384 Loop through all comas in this quoted fq id
|
||||
// looking for $quote_sign.$quote_sign sequence.
|
||||
char* fq_delimiter;
|
||||
int tmp_pos = 0;
|
||||
while((fq_delimiter = strchr(tmp_first, '.')) != NULL)
|
||||
{
|
||||
if( (*(fq_delimiter -1) == '`' && *(fq_delimiter + 1) == '`') ||
|
||||
(*(fq_delimiter -1) == '"' && *(fq_delimiter + 1) == '"') )
|
||||
{
|
||||
tmp_pos += fq_delimiter - tmp_first;
|
||||
break;
|
||||
}
|
||||
tmp_first = fq_delimiter;
|
||||
}
|
||||
|
||||
char* fq_delimiter_orig = str + tmp_pos;
|
||||
char* right = fq_delimiter + 1;
|
||||
char* right_orig = fq_delimiter_orig + 1;
|
||||
// MCOL-1384 Strip quotes from the left part.
|
||||
if(*left == '"' || *left == '`')
|
||||
{
|
||||
result = left + 1;
|
||||
*(fq_delimiter - 1) = '.';
|
||||
move_left = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
fq_delimiter += 1;
|
||||
}
|
||||
|
||||
int right_length = strlen(right);
|
||||
// MCOL-1384 Strip quotes from the right part.
|
||||
if(*right == '`' || *right == '"')
|
||||
{
|
||||
right += 1; right_orig += 1;
|
||||
right_length -= 2;
|
||||
move_right = true;
|
||||
*(fq_delimiter + right_length) = '\0';
|
||||
}
|
||||
|
||||
if(move_left || move_right)
|
||||
{
|
||||
strncpy(fq_delimiter, right_orig, right_length);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Reference in New Issue
Block a user