Skip to content

Commit

Permalink
better parsing of data types in casts
Browse files Browse the repository at this point in the history
  • Loading branch information
pgulutzan committed Jan 3, 2019
1 parent 305bed9 commit 60bc602
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 7 deletions.
53 changes: 52 additions & 1 deletion hparse.h
Original file line number Diff line number Diff line change
Expand Up @@ -3693,10 +3693,61 @@ void MainWindow::hparse_f_enum_or_set()
for example in CAST "UNSIGNED INT" is okay but "INT UNSIGNED" is illegal,
while in CREATE "UNSIGNED INT" is illegal but "UNSIGNED INT" is okay.
We allow any combination.
Todo: also, in CAST, only DOUBLE is okay, not DOUBLE PRECISION.
Todo: we no longer need to allow "UNSIGNED INT" for non-CAST.
Todo: notice how CAST checks are clean and ordered? Do the same for non-CAST.
Todo: with MariaDB DATE and DATETIME can be followed by (n), both for CAST and for non-CAST.
*/
int MainWindow::hparse_f_data_type(int context)
{
if ((context == TOKEN_KEYWORD_CAST) && ((hparse_dbms_mask & FLAG_VERSION_MYSQL_OR_MARIADB_ALL) != 0))
{
if ((hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_BINARY, "BINARY") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_CHAR, "CHAR") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_CHAR, "CHARACTER") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_DATE, "DATE") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_DATETIME, "DATETIME") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_DECIMAL, "DEC") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_DECIMAL, "DECIMAL") == 1)
|| (hparse_f_accept(FLAG_VERSION_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_DOUBLE, "DOUBLE") == 1)
|| (hparse_f_accept(FLAG_VERSION_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_INTEGER, "INT") == 1)
|| (hparse_f_accept(FLAG_VERSION_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_INTEGER, "INTEGER") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_JSON, "JSON") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_NCHAR, "NCHAR") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_SIGNED, "SIGNED") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_TIME, "TIME") == 1)
|| (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_UNSIGNED, "UNSIGNED") == 1))
{
int k= main_token_types[hparse_i_of_last_accepted];
main_token_flags[hparse_i_of_last_accepted] &= (~TOKEN_FLAG_IS_FUNCTION);
if ((k == TOKEN_KEYWORD_SIGNED) || (k == TOKEN_KEYWORD_UNSIGNED))
{
if (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_INTEGER, "INT") == 0)
hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_KEYWORD_INTEGER, "INTEGER");
}
if ((k == TOKEN_KEYWORD_BINARY) || (k == TOKEN_KEYWORD_CHAR) || (k == TOKEN_KEYWORD_NCHAR)
|| ((k == TOKEN_KEYWORD_DATETIME) && ((hparse_dbms_mask & FLAG_VERSION_MARIADB_ALL) != 0))
|| ((k == TOKEN_KEYWORD_TIME) && ((hparse_dbms_mask & FLAG_VERSION_MARIADB_ALL) != 0)))
{
hparse_f_length(false, false, false);
if (hparse_errno > 0) return 0;
if (k == TOKEN_KEYWORD_CHAR)
{
if (hparse_f_character_set() == 1)
{
hparse_f_character_set_name();
}
if (hparse_errno > 0) return 0;
}
}
if (k == TOKEN_KEYWORD_DECIMAL)
{
hparse_f_length(true, true, false);
}
if (hparse_errno > 0) return 0;
return k;
}
return -1;
}
if (hparse_f_accept(FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_REFTYPE_ANY,TOKEN_TYPE_KEYWORD, "BIT") == 1)
{
main_token_flags[hparse_i_of_last_accepted] |= TOKEN_FLAG_IS_DATA_TYPE;
Expand Down
16 changes: 10 additions & 6 deletions ocelotgui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11632,6 +11632,7 @@ const keywords strvalues[]=
{"LAST_DAY", FLAG_VERSION_MARIADB_10_0, FLAG_VERSION_MARIADB_10_0, TOKEN_KEYWORD_LAST_DAY},
{"LAST_INSERT_ID", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_LAST_INSERT_ID},
{"LAST_VALUE", FLAG_VERSION_MYSQL_8_0, 0, TOKEN_KEYWORD_LAST_VALUE}, /* MariaDB 10.2 nonreserved */
{"LATERAL", 0, 0, TOKEN_KEYWORD_LATERAL}, /* MySQL 8.0.2 manual says reserved but it isn't */
{"LCASE", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_LCASE},
{"LEAD", FLAG_VERSION_MYSQL_8_0|FLAG_VERSION_MARIADB_10_3, FLAG_VERSION_MYSQL_8_0|FLAG_VERSION_MARIADB_10_3, TOKEN_KEYWORD_LEAD}, /* MariaDB 10.2 nonreserved -- or, maybe not in MariaDB 10.2 */
{"LEADING", FLAG_VERSION_MYSQL_OR_MARIADB_ALL, 0, TOKEN_KEYWORD_LEADING},
Expand Down Expand Up @@ -11726,6 +11727,7 @@ const keywords strvalues[]=
{"NAMES", 0, 0, TOKEN_KEYWORD_NAMES},
{"NAME_CONST", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_NAME_CONST},
{"NATURAL", FLAG_VERSION_ALL, 0, TOKEN_KEYWORD_NATURAL},
{"NCHAR", 0, 0, TOKEN_KEYWORD_NCHAR},
{"NEXTVAL", 0, FLAG_VERSION_MARIADB_10_3, TOKEN_KEYWORD_NEXTVAL},
{"NIL", FLAG_VERSION_LUA, 0, TOKEN_KEYWORD_NIL},
{"NO", 0, 0, TOKEN_KEYWORD_NO},
Expand Down Expand Up @@ -11863,6 +11865,7 @@ const keywords strvalues[]=
{"ROUND", 0, FLAG_VERSION_ALL, TOKEN_KEYWORD_ROUND},
{"ROW", FLAG_VERSION_MYSQL_8_0|FLAG_VERSION_TARANTOOL, 0, TOKEN_KEYWORD_ROW},
{"ROWS", FLAG_VERSION_MYSQL_8_0|FLAG_VERSION_TARANTOOL, 0, TOKEN_KEYWORD_ROWS},
{"ROWTYPE", FLAG_VERSION_PLSQL, 0, TOKEN_KEYWORD_ROWTYPE},
{"ROW_COUNT", 0, FLAG_VERSION_ALL, TOKEN_KEYWORD_ROW_COUNT},
{"ROW_NUMBER", FLAG_VERSION_MYSQL_8_0|FLAG_VERSION_TARANTOOL, FLAG_VERSION_MYSQL_8_0|FLAG_VERSION_MARIADB_10_2_2, TOKEN_KEYWORD_ROW_NUMBER},
{"RPAD", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_RPAD},
Expand Down Expand Up @@ -11893,6 +11896,7 @@ const keywords strvalues[]=
{"SHUTDOWN", 0, 0, TOKEN_KEYWORD_SHUTDOWN},
{"SIGN", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_SIGN},
{"SIGNAL", FLAG_VERSION_ALL, 0, TOKEN_KEYWORD_SIGNAL},
{"SIGNED", 0, 0, TOKEN_KEYWORD_SIGNED},
{"SIMPLE", 0, 0, TOKEN_KEYWORD_SIMPLE},
{"SIN", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_SIN},
{"SLEEP", 0, FLAG_VERSION_MYSQL_OR_MARIADB_ALL, TOKEN_KEYWORD_SLEEP},
Expand Down Expand Up @@ -12198,24 +12202,24 @@ const keywords strvalues[]=
/* Uppercase it. I don't necessarily have strupr(). */
for (i= 0; (*(key + i) != '\0') && (i < MAX_KEYWORD_LENGTH); ++i) key2[i]= toupper(*(key + i));
key2[i]= '\0';
/* If the following assert happens, you inserted/removed something without changing "925" */
/* If the following assert happens, you inserted/removed something without changing "929" */

assert(TOKEN_KEYWORD__UTF8MB4 == TOKEN_KEYWORD_QUESTIONMARK + (925 - 1));
assert(TOKEN_KEYWORD__UTF8MB4 == TOKEN_KEYWORD_QUESTIONMARK + (929 - 1));

///* Test strvalues is ordered by bsearching for every item. */
//for (int ii= 0; ii < 925; ++ii)
//for (int ii= 0; ii < 929; ++ii)
//{
// char *k= (char*) &strvalues[ii].chars;
// p_item= (char*) bsearch(k, strvalues, 925, sizeof(struct keywords), (int(*)(const void*, const void*)) strcmp);
// p_item= (char*) bsearch(k, strvalues, 929, sizeof(struct keywords), (int(*)(const void*, const void*)) strcmp);
// assert(p_item != NULL);
// index= ((((unsigned long)p_item - (unsigned long)strvalues)) / sizeof(struct keywords));
// index+= TOKEN_KEYWORDS_START;
// printf("ii=%d, index=%ld, k=%s.\n", ii, index, k);
// assert(index == strvalues[ii].token_keyword);
//}
/* TODO: you don't need to calculate index, it's strvalues[...].token_keyword. */
/* Search it with library binary-search. Assume 925 items and everything MAX_KEYWORD_LENGTH bytes long. */
p_item= (char*) bsearch(key2, strvalues, 925, sizeof(struct keywords), (int(*)(const void*, const void*)) strcmp);
/* Search it with library binary-search. Assume 929 items and everything MAX_KEYWORD_LENGTH bytes long. */
p_item= (char*) bsearch(key2, strvalues, 929, sizeof(struct keywords), (int(*)(const void*, const void*)) strcmp);
if (p_item != NULL)
{
/* It's in the list, so instead of TOKEN_TYPE_OTHER, make it TOKEN_KEYWORD_something. */
Expand Down
4 changes: 4 additions & 0 deletions ocelotgui.h
Original file line number Diff line number Diff line change
Expand Up @@ -1676,6 +1676,7 @@ public slots:
TOKEN_KEYWORD_LAST_DAY,
TOKEN_KEYWORD_LAST_INSERT_ID,
TOKEN_KEYWORD_LAST_VALUE,
TOKEN_KEYWORD_LATERAL,
TOKEN_KEYWORD_LCASE,
TOKEN_KEYWORD_LEAD,
TOKEN_KEYWORD_LEADING,
Expand Down Expand Up @@ -1770,6 +1771,7 @@ public slots:
TOKEN_KEYWORD_NAMES,
TOKEN_KEYWORD_NAME_CONST,
TOKEN_KEYWORD_NATURAL,
TOKEN_KEYWORD_NCHAR,
TOKEN_KEYWORD_NEXTVAL,
TOKEN_KEYWORD_NIL,
TOKEN_KEYWORD_NO,
Expand Down Expand Up @@ -1907,6 +1909,7 @@ public slots:
TOKEN_KEYWORD_ROUND,
TOKEN_KEYWORD_ROW,
TOKEN_KEYWORD_ROWS,
TOKEN_KEYWORD_ROWTYPE,
TOKEN_KEYWORD_ROW_COUNT,
TOKEN_KEYWORD_ROW_NUMBER,
TOKEN_KEYWORD_RPAD,
Expand Down Expand Up @@ -1937,6 +1940,7 @@ public slots:
TOKEN_KEYWORD_SHUTDOWN,
TOKEN_KEYWORD_SIGN,
TOKEN_KEYWORD_SIGNAL,
TOKEN_KEYWORD_SIGNED,
TOKEN_KEYWORD_SIMPLE,
TOKEN_KEYWORD_SIN,
TOKEN_KEYWORD_SLEEP,
Expand Down

0 comments on commit 60bc602

Please sign in to comment.