344
* get all keywords and try if we get all the ids
346
void test_tokenizer_keywords() {
349
for (i = 0; sql_token_get_name(i, NULL); i++) {
353
/** only tokens with TK_SQL_* are keyworks */
354
if (0 != strncmp(sql_token_get_name(i, NULL), "TK_SQL_", sizeof("TK_SQL_") - 1)) continue;
356
keyword = sql_token_get_name(i, &keyword_len);
357
/* strip the TK_SQL_ prefix to get the keyword itself */
358
keyword += sizeof("TK_SQL_") - 1;
359
keyword_len -= sizeof("TK_SQL_") - 1;
361
g_assert_cmpint(sql_token_get_id_len(keyword, keyword_len), ==, i);
364
/* check that some SQL commands are not keywords */
365
g_assert_cmpint(sql_token_get_id_len(C("COMMIT")), ==, TK_LITERAL);
366
g_assert_cmpint(sql_token_get_id_len(C("TRUNCATE")), ==, TK_LITERAL);
370
* @test literals can start with a digit, bug#49716
372
* - e1 is a literal ("e1")
373
* - 1e is a literal ("1e")
374
* - 1e + 1 is a literal ("1e"), a plus ("+") and a int ("1")
375
* - 1e+1 is a float ("1e+1")
376
* - 1e+1e is a float ("1e+1") and literal ("e")
377
* - 1e1 is a float ("1e1")
379
void test_literal_digit() {
380
GPtrArray *tokens = NULL;
383
#define T(t_id, t_text) \
384
g_assert_cmpstr(sql_token_get_name(token->token_id, NULL), ==, sql_token_get_name(t_id, NULL)); \
385
g_assert_cmpstr(token->text->str, ==, t_text);
387
/* e1 is a literal ("e1") */
388
tokens = sql_tokens_new();
390
sql_tokenizer(tokens, C("e1"));
392
for (i = 0; i < tokens->len; i++) {
393
sql_token *token = tokens->pdata[i];
396
case 0: T(TK_LITERAL, "e1"); break;
399
* a self-writing test-case
401
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
402
g_assert_not_reached();
405
sql_tokens_free(tokens);
407
/* 1e is a literal ("1e") */
408
tokens = sql_tokens_new();
410
sql_tokenizer(tokens, C("1e"));
412
for (i = 0; i < tokens->len; i++) {
413
sql_token *token = tokens->pdata[i];
416
case 0: T(TK_LITERAL, "1e"); break;
419
* a self-writing test-case
421
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
422
g_assert_not_reached();
425
sql_tokens_free(tokens);
427
/* 1e + 1 is a literal ("1e"), a plus ("+") and a integer ("1") */
428
tokens = sql_tokens_new();
430
sql_tokenizer(tokens, C("1e + 1"));
432
for (i = 0; i < tokens->len; i++) {
433
sql_token *token = tokens->pdata[i];
436
case 0: T(TK_LITERAL, "1e"); break;
437
case 1: T(TK_PLUS, "+"); break;
438
case 2: T(TK_INTEGER, "1"); break;
441
* a self-writing test-case
443
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
444
g_assert_not_reached();
447
sql_tokens_free(tokens);
449
/* 1e+1 is a float ("1e+1") */
450
tokens = sql_tokens_new();
452
sql_tokenizer(tokens, C("1e+1"));
454
for (i = 0; i < tokens->len; i++) {
455
sql_token *token = tokens->pdata[i];
458
case 0: T(TK_FLOAT, "1e+1"); break;
461
* a self-writing test-case
463
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
464
g_assert_not_reached();
467
sql_tokens_free(tokens);
469
/* 1e1 is a float ("1e1") */
470
tokens = sql_tokens_new();
472
sql_tokenizer(tokens, C("1e1"));
474
for (i = 0; i < tokens->len; i++) {
475
sql_token *token = tokens->pdata[i];
478
case 0: T(TK_FLOAT, "1e1"); break;
481
* a self-writing test-case
483
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
484
g_assert_not_reached();
487
sql_tokens_free(tokens);
489
/* 1e+1e is a float ("1e+1") and a literal ("e") */
490
tokens = sql_tokens_new();
492
sql_tokenizer(tokens, C("1e+1e"));
494
for (i = 0; i < tokens->len; i++) {
495
sql_token *token = tokens->pdata[i];
498
case 0: T(TK_FLOAT, "1e+1"); break;
499
case 1: T(TK_LITERAL, "e"); break;
502
* a self-writing test-case
504
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
505
g_assert_not_reached();
508
sql_tokens_free(tokens);
510
/* 1.1 is a float ("1.1") */
511
tokens = sql_tokens_new();
513
sql_tokenizer(tokens, C("1.1"));
515
for (i = 0; i < tokens->len; i++) {
516
sql_token *token = tokens->pdata[i];
519
case 0: T(TK_FLOAT, "1.1"); break;
522
* a self-writing test-case
524
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
525
g_assert_not_reached();
528
sql_tokens_free(tokens);
530
/* 1.1e+1 is a float ("1.1e+1") */
531
tokens = sql_tokens_new();
533
sql_tokenizer(tokens, C("1.1e+1"));
535
for (i = 0; i < tokens->len; i++) {
536
sql_token *token = tokens->pdata[i];
539
case 0: T(TK_FLOAT, "1.1e+1"); break;
542
* a self-writing test-case
544
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
545
g_assert_not_reached();
548
sql_tokens_free(tokens);
550
/* .1t is a float (".1") and a literal ("t")
552
* the same thing with 'e' is a parse-error in the server side
554
tokens = sql_tokens_new();
556
sql_tokenizer(tokens, C(".1t"));
558
for (i = 0; i < tokens->len; i++) {
559
sql_token *token = tokens->pdata[i];
562
case 0: T(TK_FLOAT, ".1"); break;
563
case 1: T(TK_LITERAL, "t"); break;
566
* a self-writing test-case
568
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
569
g_assert_not_reached();
572
sql_tokens_free(tokens);
574
/* t1.1t is a literal ("t1"), a dot and a literal ("1t") */
575
tokens = sql_tokens_new();
577
sql_tokenizer(tokens, C("t1.1t"));
579
for (i = 0; i < tokens->len; i++) {
580
sql_token *token = tokens->pdata[i];
583
case 0: T(TK_LITERAL, "t1"); break;
584
case 1: T(TK_DOT, "."); break;
585
case 2: T(TK_LITERAL, "1t"); break;
588
* a self-writing test-case
590
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
591
g_assert_not_reached();
594
sql_tokens_free(tokens);
596
/* e1.1e is a literal ("e1"), a dot and a literal ("1e") ... as 'e' is special */
597
tokens = sql_tokens_new();
599
sql_tokenizer(tokens, C("e1.1e"));
601
for (i = 0; i < tokens->len; i++) {
602
sql_token *token = tokens->pdata[i];
605
case 0: T(TK_LITERAL, "e1"); break;
606
case 1: T(TK_DOT, "."); break;
607
case 2: T(TK_LITERAL, "1e"); break;
610
* a self-writing test-case
612
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
613
g_assert_not_reached();
616
sql_tokens_free(tokens);
618
/* e1.1e + 1 is a literal ("e1"), a dot, a literal ("1e"), a plus ("+") and a integer ("1")*/
619
tokens = sql_tokens_new();
621
sql_tokenizer(tokens, C("e1.1e + 1"));
623
for (i = 0; i < tokens->len; i++) {
624
sql_token *token = tokens->pdata[i];
627
case 0: T(TK_LITERAL, "e1"); break;
628
case 1: T(TK_DOT, "."); break;
629
case 2: T(TK_LITERAL, "1e"); break;
630
case 3: T(TK_PLUS, "+"); break;
631
case 4: T(TK_INTEGER, "1"); break;
634
* a self-writing test-case
636
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
637
g_assert_not_reached();
640
sql_tokens_free(tokens);
642
/* e1 . 1e + 1 is a literal ("e1"), a dot, a literal ("1e"), a plus ("+") and a integer ("1")*/
643
tokens = sql_tokens_new();
645
sql_tokenizer(tokens, C("e1 . 1e + 1"));
647
for (i = 0; i < tokens->len; i++) {
648
sql_token *token = tokens->pdata[i];
651
case 0: T(TK_LITERAL, "e1"); break;
652
case 1: T(TK_DOT, "."); break;
653
case 2: T(TK_LITERAL, "1e"); break;
654
case 3: T(TK_PLUS, "+"); break;
655
case 4: T(TK_INTEGER, "1"); break;
658
* a self-writing test-case
660
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
661
g_assert_not_reached();
664
sql_tokens_free(tokens);
666
/* e1 . 1e+1 is a literal ("e1"), a dot, a float ("1e+1")
667
* ... which is a invalid syntax as fieldnames can't be floats */
668
tokens = sql_tokens_new();
670
sql_tokenizer(tokens, C("e1 . 1e+1"));
672
for (i = 0; i < tokens->len; i++) {
673
sql_token *token = tokens->pdata[i];
676
case 0: T(TK_LITERAL, "e1"); break;
677
case 1: T(TK_DOT, "."); break;
678
case 2: T(TK_FLOAT, "1e+1"); break;
681
* a self-writing test-case
683
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
684
g_assert_not_reached();
687
sql_tokens_free(tokens);
689
/* e1.1e+1 is a literal ("e1"), a dot, a literal ("1e"), a plus ("+") and a integer ("1") */
690
tokens = sql_tokens_new();
692
sql_tokenizer(tokens, C("e1.1e+1"));
694
for (i = 0; i < tokens->len; i++) {
695
sql_token *token = tokens->pdata[i];
698
case 0: T(TK_LITERAL, "e1"); break;
699
case 1: T(TK_DOT, "."); break;
700
case 2: T(TK_LITERAL, "1e"); break;
701
case 3: T(TK_PLUS, "+"); break;
702
case 4: T(TK_INTEGER, "1"); break;
705
* a self-writing test-case
707
printf("case %"G_GSIZE_FORMAT": T(%s, \"%s\"); break;\n", i, sql_token_get_name(token->token_id, NULL), token->text->str);
708
g_assert_not_reached();
711
sql_tokens_free(tokens);
368
void test_g_istr_hash() {
369
g_assert_cmpint(g_istr_hash("foo"), ==, g_istr_hash("foo"));
370
g_assert_cmpint(g_istr_hash("foo"), !=, g_istr_hash("boo"));
718
373
int main(int argc, char **argv) {
719
374
g_test_init(&argc, &argv, NULL);
720
375
g_test_bug_base("http://bugs.mysql.com/");
722
g_test_add_func("/core/tokenizer_keywords", test_tokenizer_keywords);
377
g_test_add_func("/core/hash_str_i", test_g_istr_hash);
724
379
g_test_add_func("/core/tokenizer", test_tokenizer);
725
380
g_test_add_func("/core/tokenizer_token2name", test_token2name);
381
g_test_add_func("/core/tokenizer_keywork2token", test_keyword2token);
726
382
g_test_add_func("/core/tokenizer_table_name_underscore", test_table_name_underscore);
727
383
g_test_add_func("/core/tokenizer_simple_dashdashcomment", test_simple_dashdashcomment);
728
384
g_test_add_func("/core/tokenizer_dashdashcomment", test_dashdashcomment);