changes for join table and parser for aggregates
[csql.git] / src / sql / dmllex.lxx
blobb8ddaa2aaebbab6b74fb3227a57f6cd9e60d6080
1 /***************************************************************************
2  *   Copyright (C) 2007 by Prabakaran Thirumalai   *
3  *   praba_tuty@yahoo.com   *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15   ***************************************************************************/
16 %array yytext
18 #include "dmlyacc.h"
19 #include <stdlib.h>
20 #include <string.h>
22 int echo_on=0;
23 int lexEof=0;
24 extern char *lexInput;
26 #undef ECHO
27 #define ECHO { if(echo_on) printf("%s",yytext); }
30 /*    Macro definitions  */
34 letter          [a-zA-Z_.]
35 digit           [0-9]
36 hex             [0-9A-Fa-f]
37 letter_or_digit [a-zA-Z_0-9.]
38 sign            [\+\-]
39 string_char     [\]\[\\\+\"=\)\(\{\}\*&\^\%\$#@!:;,\|\~\`\.\<\>\?\/a-zA-Z_0-9 \t\n\-]
40 white_space     [ \t\n]
41 blank           [ \t]
42 quota           \'\'
43 non_double_quota [^\"\n]
44 other           .
45 operator        "<"|">"|">="|"<="|"="|"\!="|"<>"
49 {operator}  { 
50                 yylval.stringval = strdup((const char*)yytext);
51                 return(OPERATOR);
52             }
54 \'({quota}|{string_char})*\'{blank}*$   {
55                 int len; ECHO;
56                 if(*yytext != '\'') 
57                     printf("ERROR: wanted a string, got: %s\n",yytext);
58                 len = yyleng - 1;
59                 while (yytext[len] == ' ' || yytext[len] == '\t') 
60                 { 
61                     yytext[len] = '\0';
62                     len--;
63                 }
64                 yylval.stringval = strdup((const char*)yytext + 1);
65                 //printf("rule1: %s.\n", yylval.stringval );
66                 return (STRING);
67             }
69 \'({quota}|{string_char})*\'    {  ECHO;
70                 if(*yytext != '\'')
71                     printf("ERROR: wanted a string, got: %s\n",yytext);
72                 yytext[yyleng-1]='\0';
73                 yylval.stringval = strdup((const char*)yytext + 1);
74                 //printf("rule2: %s.\n", yylval.stringval );
75                 return (STRING);
76             }
78 \"{non_double_quota}*\"    {  ECHO;
79                 yytext[yyleng-1] = '\0'; /*remove the beginning and ending quota*/
80                     yytext[0]=' ';
81                 yylval.stringval = strdup((const char*)yytext + 1);
82                 return (STRING);
83             }
85 {letter}{letter_or_digit}*   {
86                     int token; 
87                 char *fieldname;
88                 token = FIELD;
89                 ECHO;
91                 if(strcasecmp(yytext,"SELECT") == 0) token = SELECT;
92                 if(strcasecmp(yytext,"FROM") == 0) token = FROM;
93                 if(strcasecmp(yytext,"WHERE") == 0) token = WHERE;
94                 if(strcasecmp(yytext,"BETWEEN") == 0) token = BETWEEN;
95                 if(strcasecmp(yytext,"IN") == 0) token = IN;
96                 if(strcasecmp(yytext,"AND") == 0) token = AND;
97                 if(strcasecmp(yytext,"OR") == 0) token = OR;
98                 if(strcasecmp(yytext,"NOT") == 0) token = NOT;
99                 if(strcasecmp(yytext,"INSERT") == 0) token = INSERT;
100                 if(strcasecmp(yytext,"INTO") == 0) token = INTO;
101                 if(strcasecmp(yytext,"VALUES") == 0) token = VALUES;
102                 if(strcasecmp(yytext,"DELETE") == 0) token = DELETE;
103                 if(strcasecmp(yytext,"UPDATE") == 0) token = UPDATE;
104                 if(strcasecmp(yytext,"SET") == 0) token = SET;
105                 if(strcasecmp(yytext,"NULL") == 0) token = NULL_VALUE;
106                 if(strcasecmp(yytext,"UNIQUE") == 0) token = UNIQUE;
107                 if(strcasecmp(yytext,"CREATE") == 0) token = CREATE;
108                 if(strcasecmp(yytext,"DROP") == 0) token = DROP;
109                 if(strcasecmp(yytext,"TABLE") == 0) token = TABLE;
110                 if(strcasecmp(yytext,"PRIMARY") == 0) token = PRIMARY;
111                 if(strcasecmp(yytext,"INDEX") == 0) token = INDEX;
112                 if(strcasecmp(yytext,"ON") == 0) token = ON;
113                 if(strcasecmp(yytext,"HASH") == 0) token = HASH;
114                 if(strcasecmp(yytext,"TREE") == 0) token = TREE;
115                 if(strcasecmp(yytext,"UNIQUE") == 0) token = UNIQUE;
117                 if(strcasecmp(yytext,"KEY") == 0) token = KEY;
118                 if(strcasecmp(yytext,"DEFAULT") == 0) token = DEFAULT;
119                 if(strcasecmp(yytext,"INT") ==0) token = INT_TYPE;
120                 if(strcasecmp(yytext,"INTEGER") ==0) token = INT_TYPE;
121                 if(strcasecmp(yytext,"LONG") ==0) token = LONG_TYPE;
122                 if(strcasecmp(yytext,"DOUBLE") ==0) token = DOUBLE_TYPE;
123                 if(strcasecmp(yytext,"SHORT") ==0) token = SHORT_TYPE;
124                 if(strcasecmp(yytext,"SMALLINT") ==0) token = SHORT_TYPE;
125                 if(strcasecmp(yytext,"DATE") ==0) token = DATE_TYPE;
126                 if(strcasecmp(yytext,"TIME") ==0) token = TIME_TYPE;
127                 if(strcasecmp(yytext,"TIMESTAMP") ==0) token = TIMESTAMP_TYPE;
128                 if(strcasecmp(yytext,"CHAR") ==0) token = CHAR_TYPE;
129                 if(strcasecmp(yytext,"BIGINT") ==0) token = BIGINT_TYPE;
130                 if(strcasecmp(yytext,"TINYINT") ==0) token = TINYINT_TYPE;
131                 if(strcasecmp(yytext,"FLOAT") ==0) token = FLOAT_TYPE;
132                 if(strcasecmp(yytext,"MIN") ==0) token = MIN;
133                 if(strcasecmp(yytext,"MAX") ==0) token = MAX;
134                 if(strcasecmp(yytext,"SUM") ==0) token = SUM;
135                 if(strcasecmp(yytext,"AVG") ==0) token = AVG;
136                 if(strcasecmp(yytext,"COUNT") ==0) token = COUNT;
137                 if(strcasecmp(yytext,"GROUP") ==0) token = GROUP;
138                 if(strcasecmp(yytext,"BY") ==0) token = BY;
140                 if( token == FIELD )
141                     yylval.stringval = strdup((const char*)yytext);
142                 else
143                     yylval.stringval = 0;
145                 return(token);
146             }
148 {sign}?{digit}+      { ECHO;
149                 yylval.stringval = strdup((const char*)yytext);
150                 return (NUMBER_STRING);
151             }
153 {sign}?(({digit}*\.{digit}+)|({digit}+(\.{digit}*)?))([eE]{sign}?{digit}+)?   {   ECHO;
154                 yylval.stringval = strdup((const char*)yytext);
155                 return (DOUBLE);
156             }
158 {hex}+      {   ECHO;
159                 yylval.stringval = strdup((const char*)yytext);
160                 return (BINARY_STRING);
161             }
162 \*          {
163                 yylval.stringval = strdup((const char*)yytext);
164                 return(STAR);
165             }
166 \?          {
167                 yylval.stringval = strdup((const char*)yytext);
168                 return(PARAMETER);
169             }
170 {white_space}+  { ECHO; }
171 "#"{other}*     { ECHO; }
172 "//"{other}*    { ECHO; }
173 "--"{other}*    { ECHO; }
176 /*    Watch this C comment folks */
178 "/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/" { ECHO; }
180 {other} { ECHO; return yytext[0]; }
185 int yywrap()
187     lexEof = 1;
188     return 1;