54
52
get_collation_number_internal(const char *name)
56
for (CHARSET_INFO **cs= all_charsets;
57
cs < all_charsets+array_elements(all_charsets)-1;
55
for (cs= all_charsets;
56
cs < all_charsets+array_elements(all_charsets)-1 ;
60
if ( cs[0] && cs[0]->name && !my_strcasecmp(&my_charset_utf8_general_ci, cs[0]->name, name))
59
if ( cs[0] && cs[0]->name &&
60
!my_strcasecmp(&my_charset_utf8_general_ci, cs[0]->name, name))
62
61
return cs[0]->number;
68
static unsigned char *cs_alloc(size_t size)
70
memory_vector.push_back(new unsigned char[size]);
71
return memory_vector.back();
74
67
static bool init_state_maps(CHARSET_INFO *cs)
76
if (!(cs->state_map= cs_alloc(256)))
70
unsigned char *state_map;
71
unsigned char *ident_map;
73
if (!(cs->state_map= (unsigned char*) cs_alloc(256)))
79
if (!(cs->ident_map= cs_alloc(256)))
76
if (!(cs->ident_map= (unsigned char*) cs_alloc(256)))
82
unsigned char *state_map= cs->state_map;
83
unsigned char *ident_map= cs->ident_map;
79
state_map= cs->state_map;
80
ident_map= cs->ident_map;
85
82
/* Fill state_map with states to get a faster parser */
86
for (int i= 0; i < 256; i++)
83
for (i=0; i < 256 ; i++)
88
85
if (my_isalpha(cs,i))
89
state_map[i]= MY_LEX_IDENT;
86
state_map[i]=(unsigned char) MY_LEX_IDENT;
90
87
else if (my_isdigit(cs,i))
91
state_map[i]= MY_LEX_NUMBER_IDENT;
88
state_map[i]=(unsigned char) MY_LEX_NUMBER_IDENT;
92
89
else if (my_mbcharlen(cs, i)>1)
93
state_map[i]= MY_LEX_IDENT;
90
state_map[i]=(unsigned char) MY_LEX_IDENT;
94
91
else if (my_isspace(cs,i))
95
state_map[i]= MY_LEX_SKIP;
92
state_map[i]=(unsigned char) MY_LEX_SKIP;
97
state_map[i]= MY_LEX_CHAR;
94
state_map[i]=(unsigned char) MY_LEX_CHAR;
99
state_map['_']=state_map['$']= MY_LEX_IDENT;
100
state_map['\'']= MY_LEX_STRING;
101
state_map['.']= MY_LEX_REAL_OR_POINT;
102
state_map['>']=state_map['=']=state_map['!']= MY_LEX_CMP_OP;
103
state_map['<']= MY_LEX_LONG_CMP_OP;
104
state_map['&']=state_map['|']= MY_LEX_BOOL;
105
state_map['#']= MY_LEX_COMMENT;
106
state_map[';']= MY_LEX_SEMICOLON;
107
state_map[':']= MY_LEX_SET_VAR;
108
state_map[0]= MY_LEX_EOL;
109
state_map['\\']= MY_LEX_ESCAPE;
110
state_map['/']= MY_LEX_LONG_COMMENT;
111
state_map['*']= MY_LEX_END_LONG_COMMENT;
112
state_map['@']= MY_LEX_USER_END;
113
state_map['`']= MY_LEX_USER_VARIABLE_DELIMITER;
114
state_map['"']= MY_LEX_STRING_OR_DELIMITER;
96
state_map[(unsigned char)'_']=state_map[(unsigned char)'$']=(unsigned char) MY_LEX_IDENT;
97
state_map[(unsigned char)'\'']=(unsigned char) MY_LEX_STRING;
98
state_map[(unsigned char)'.']=(unsigned char) MY_LEX_REAL_OR_POINT;
99
state_map[(unsigned char)'>']=state_map[(unsigned char)'=']=state_map[(unsigned char)'!']= (unsigned char) MY_LEX_CMP_OP;
100
state_map[(unsigned char)'<']= (unsigned char) MY_LEX_LONG_CMP_OP;
101
state_map[(unsigned char)'&']=state_map[(unsigned char)'|']=(unsigned char) MY_LEX_BOOL;
102
state_map[(unsigned char)'#']=(unsigned char) MY_LEX_COMMENT;
103
state_map[(unsigned char)';']=(unsigned char) MY_LEX_SEMICOLON;
104
state_map[(unsigned char)':']=(unsigned char) MY_LEX_SET_VAR;
105
state_map[0]=(unsigned char) MY_LEX_EOL;
106
state_map[(unsigned char)'\\']= (unsigned char) MY_LEX_ESCAPE;
107
state_map[(unsigned char)'/']= (unsigned char) MY_LEX_LONG_COMMENT;
108
state_map[(unsigned char)'*']= (unsigned char) MY_LEX_END_LONG_COMMENT;
109
state_map[(unsigned char)'@']= (unsigned char) MY_LEX_USER_END;
110
state_map[(unsigned char) '`']= (unsigned char) MY_LEX_USER_VARIABLE_DELIMITER;
111
state_map[(unsigned char)'"']= (unsigned char) MY_LEX_STRING_OR_DELIMITER;
117
114
Create a second map to make it faster to find identifiers
119
for (int i= 0; i < 256; i++)
116
for (i=0; i < 256 ; i++)
121
ident_map[i]= state_map[i] == MY_LEX_IDENT || state_map[i] == MY_LEX_NUMBER_IDENT;
118
ident_map[i]= (unsigned char) (state_map[i] == MY_LEX_IDENT ||
119
state_map[i] == MY_LEX_NUMBER_IDENT);
124
122
/* Special handling of hex and binary strings */
125
state_map['x']= state_map['X']= MY_LEX_IDENT_OR_HEX;
126
state_map['b']= state_map['B']= MY_LEX_IDENT_OR_BIN;
123
state_map[(unsigned char)'x']= state_map[(unsigned char)'X']= (unsigned char) MY_LEX_IDENT_OR_HEX;
124
state_map[(unsigned char)'b']= state_map[(unsigned char)'B']= (unsigned char) MY_LEX_IDENT_OR_BIN;
130
129
static bool charset_initialized= false;
132
DRIZZLED_API CHARSET_INFO *all_charsets[256];
133
const DRIZZLED_API CHARSET_INFO *default_charset_info = &my_charset_utf8_general_ci;
131
CHARSET_INFO *all_charsets[256];
132
const CHARSET_INFO *default_charset_info = &my_charset_utf8_general_ci;
135
134
void add_compiled_collation(CHARSET_INFO * cs)