~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_lex.cc

  • Committer: Monty Taylor
  • Date: 2009-01-30 04:45:55 UTC
  • mfrom: (779.4.10 devel)
  • mto: (779.7.3 devel)
  • mto: This revision was merged to the branch mainline in revision 823.
  • Revision ID: mordred@inaugust.com-20090130044555-ntb3509c8o6e3sb5
MergedĀ fromĀ me.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
#include <drizzled/error.h>
23
23
#include <drizzled/session.h>
24
24
#include <drizzled/sql_base.h>
 
25
#include <drizzled/hash_symbol.h>
 
26
 
 
27
 
25
28
 
26
29
static int lex_one_token(void *arg, void *yysession);
27
30
 
 
31
 
28
32
/*
29
33
  We are using pointer to this variable for distinguishing between assignment
30
34
  to NEW row field (when parsing trigger definition) and structured variable.
39
43
 
40
44
 
41
45
/*
42
 
  The following data is based on the latin1 character set, and is only
43
 
  used when comparing keywords
44
 
*/
45
 
 
46
 
static unsigned char to_upper_lex[]=
47
 
{
48
 
    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
49
 
   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
50
 
   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
51
 
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
52
 
   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
53
 
   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
54
 
   96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
55
 
   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
56
 
  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
57
 
  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
58
 
  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
59
 
  176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
60
 
  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
61
 
  208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
62
 
  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
63
 
  208,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255
64
 
};
65
 
 
66
 
/*
67
46
  Names of the index hints (for error messages). Keep in sync with
68
47
  index_hint_type
69
48
*/
75
54
  "FORCE INDEX"
76
55
};
77
56
 
78
 
int lex_casecmp(const char *s, const char *t, uint32_t len)
79
 
{
80
 
  while (len-- != 0 &&
81
 
         to_upper_lex[(unsigned char) *s++] == to_upper_lex[(unsigned char) *t++]) ;
82
 
  return (int) len+1;
83
 
}
84
 
 
85
 
/* EVIL EVIL - this is included here so that it will have to_upper_lex */
86
 
#include <drizzled/lex_hash.h>
87
 
 
88
 
 
89
 
void lex_init(void)
90
 
{
91
 
  uint32_t i;
92
 
  for (i=0 ; i < array_elements(symbols) ; i++)
93
 
    symbols[i].length=(unsigned char) strlen(symbols[i].name);
94
 
  for (i=0 ; i < array_elements(sql_functions) ; i++)
95
 
    sql_functions[i].length=(unsigned char) strlen(sql_functions[i].name);
96
 
 
97
 
  return;
98
 
}
99
 
 
100
 
 
101
 
void lex_free(void)
102
 
{                                       // Call this when daemon ends
103
 
  return;
104
 
}
105
57
 
106
58
 
107
59
void
357
309
 
358
310
static int find_keyword(Lex_input_stream *lip, uint32_t len, bool function)
359
311
{
 
312
  /* Plenty of memory for the largest lex symbol we have */
 
313
  char tok_upper[64];
360
314
  const char *tok= lip->get_tok_start();
 
315
  uint32_t tok_pos= 0;
 
316
  for (;tok_pos<len && tok_pos<63;tok_pos++)
 
317
    tok_upper[tok_pos]=my_toupper(system_charset_info, tok[tok_pos]);
 
318
  tok_upper[tok_pos]=0;
361
319
 
362
 
  SYMBOL *symbol= get_hash_symbol(tok, len, function);
 
320
  const SYMBOL *symbol= get_hash_symbol(tok_upper, len, function);
363
321
  if (symbol)
364
322
  {
365
323
    lip->yylval->symbol.symbol=symbol;