Fix SQL tokenization in avrorouter

There were minor bugs in the token processing which caused ALTER TABLE
statements to be skipped.
This commit is contained in:
Markus Mäkelä
2017-06-05 19:59:25 +03:00
parent e21bec2e14
commit d93edf02e2

View File

@ -555,14 +555,12 @@ int extract_type_length(const char* ptr, char *dest)
} }
/** Store type */ /** Store type */
int typelen = ptr - start;
for (const char* c = start; c < ptr; c++) for (const char* c = start; c < ptr; c++)
{ {
*dest = tolower(*c); *dest++ = tolower(*c);
} }
dest[typelen] = '\0'; *dest++ = '\0';
/** Skip whitespace */ /** Skip whitespace */
while (*ptr && isspace(*ptr)) while (*ptr && isspace(*ptr))
@ -858,7 +856,7 @@ void read_alter_identifier(const char *sql, const char *end, char *dest, int siz
void make_avro_token(char* dest, const char* src, int length) void make_avro_token(char* dest, const char* src, int length)
{ {
while (*src == '(' || *src == ')' || *src == '`' || isspace(*src)) while (length > 0 && (*src == '(' || *src == ')' || *src == '`' || isspace(*src)))
{ {
src++; src++;
length--; length--;
@ -880,16 +878,17 @@ void make_avro_token(char* dest, const char* src, int length)
fix_reserved_word(dest); fix_reserved_word(dest);
} }
int get_column_index(TABLE_CREATE *create, const char *tok) int get_column_index(TABLE_CREATE *create, const char *tok, int len)
{ {
int idx = -1; int idx = -1;
char safe_tok[strlen(tok) + 2]; char safe_tok[len + 2];
strcpy(safe_tok, tok); memcpy(safe_tok, tok, len);
safe_tok[len] = '\0';
fix_reserved_word(safe_tok); fix_reserved_word(safe_tok);
for (int x = 0; x < create->columns; x++) for (int x = 0; x < create->columns; x++)
{ {
if (strcasecmp(create->column_names[x], tok) == 0) if (strcasecmp(create->column_names[x], safe_tok) == 0)
{ {
idx = x; idx = x;
break; break;
@ -948,7 +947,7 @@ bool table_create_alter(TABLE_CREATE *create, const char *sql, const char *end)
{ {
tok = get_tok(tok + len, &len, end); tok = get_tok(tok + len, &len, end);
int idx = get_column_index(create, tok); int idx = get_column_index(create, tok, len);
if (idx != -1) if (idx != -1)
{ {
@ -975,9 +974,9 @@ bool table_create_alter(TABLE_CREATE *create, const char *sql, const char *end)
{ {
tok = get_tok(tok + len, &len, end); tok = get_tok(tok + len, &len, end);
int idx = get_column_index(create, tok); int idx = get_column_index(create, tok, len);
if (idx != -1) if (idx != -1 && (tok = get_tok(tok + len, &len, end)))
{ {
free(create->column_names[idx]); free(create->column_names[idx]);
free(create->column_types[idx]); free(create->column_types[idx]);