📄 yaccer.y
字号:
/*** Copyright (c) 1995-2001 Hughes Technologies Pty Ltd. All rights** reserved. **** Terms under which this software may be used or copied are** provided in the specific license associated with this product.**** Hughes Technologies disclaims all warranties with regard to this ** software, including all implied warranties of merchantability and ** fitness, in no event shall Hughes Technologies be liable for any ** special, indirect or consequential damages or any damages whatsoever ** resulting from loss of use, data or profits, whether in an action of ** contract, negligence or other tortious action, arising out of or in ** connection with the use or performance of this software.****** $Id: yaccer.y,v 1.23 2004/05/19 03:17:21 bambi Exp $***//*** Module : main : msqld_yacc** Purpose : YACC grammer for parsing our SQL subset** Exports : ** Depends Upon : */%{/**************************************************************************** STANDARD INCLUDES**************************************************************************/#include <common/config.h>#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#ifdef HAVE_UNISTD_H# include <unistd.h>#endif#ifdef HAVE_STRING_H# include <string.h>#endif#include <common/portability.h>/**************************************************************************** MODULE SPECIFIC INCLUDES**************************************************************************/#include <common/msql_defs.h>#include <libmsql/msql.h>#include <msqld/index/index.h>#include <msqld/includes/msqld.h>#include <msqld/main/main.h>#include <msqld/main/util.h>#include <msqld/main/parse.h>#include <msqld/main/lexer.h>#include <msqld/main/funct.h>#include <msqld/main/memory.h>/**************************************************************************** GLOBAL VARIABLES**************************************************************************/mQuery_t *curQuery; /* Set by parseQuery */extern int yytoklen; /* from msqld_lex.c */extern u_char *yytext;extern msqld *globalServer; /* from main.c */static char *charArrayLength;static int notNullFlag = 0, keyFlag = 0;#ifdef YYSTYPE# undef YYSTYPE#endiftypedef char * C_PTR;#define YYSTYPE C_PTRint yylex();void yyerror();/**************************************************************************** PRIVATE ROUTINES**************************************************************************//**************************************************************************** PUBLIC ROUTINES**************************************************************************/%}%token END_OF_INPUT%token GE%token LE%token NE%token EQ%token GT%token LT%token BETWEEN%token MSQL_CREATE%token MSQL_DROP%token MSQL_INSERT%token MSQL_DELETE%token MSQL_SELECT%token MSQL_UPDATE%token ALL%token DISTINCT%token AS%token WHERE%token ORDER%token FROM%token INTO%token TABLE%token BY%token ASC%token DESC%token LIKE%token RLIKE%token CLIKE%token SLIKE%token AND%token OR%token VALUES%token SET%token NOT%token NULLSYM%token PRIMARY%token KEY%token INDEX%token UNIQUE%token ON%token IDENT%token SET_FUNCT%token SYS_VAR%token NUM%token REAL_NUM%token MSQL_INT%token MSQL_INT8%token MSQL_INT16%token MSQL_INT32%token MSQL_INT64%token MSQL_UINT%token MSQL_UINT8%token MSQL_UINT16%token MSQL_UINT32%token MSQL_UINT64%token MSQL_BOOL%token MSQL_CHAR%token MSQL_TEXT%token MSQL_REAL%token MSQL_DATE%token MSQL_MONEY%token MSQL_TIME%token MSQL_IPV4%token MSQL_CIDR4%token MSQL_CIDR6%token LIMIT%token OFFSET%token CREATE_TABLE%token CREATE_INDEX%token CREATE_SEQUENCE%token DROP_TABLE%token DROP_INDEX%token DROP_SEQUENCE%token SEQUENCE%token VALUE%token STEP%token AVL_INDEX%token CPI_INDEX%%/*** High level definitions**** Note : The lex input routines return a flag character of \001 to** indicate the end of input. This allows me to force a query** to be terminated at a know point (ie. the end of the query-buf)** Without this something like "select * from foo ;" is found by** yacc to be a legit query followed by a second query containing** only a ';' character. The flag is generated by msqlInput() and** msqlFlexInput() in msql_io.c*/query : /* NULL */ | verb_clause END_OF_INPUT ;verb_clause : create | select | drop | insert | update | delete ;/*** Create : create database tables*/create : MSQL_CREATE create_types ;create_types : TABLE ident '(' { curQuery->command = CREATE_TABLE; if (parseAddTable($2,NULL,curQuery) < 0) { memFreeToken($2); parseCleanQuery(curQuery); return(-1); } memFreeToken($2); } field_list ')' | opt_unique opt_index_type INDEX ident ON ident { curQuery->command = CREATE_INDEX; if (parseAddIndex($4,$6,(long)$1,(long)$2,curQuery) < 0) { memFreeToken($4); memFreeToken($6); parseCleanQuery(curQuery); return(-1); } memFreeToken($4); memFreeToken($6); } '(' index_list ')' | SEQUENCE ON ident opt_seq_step opt_seq_val { curQuery->command = CREATE_SEQUENCE; parseAddSequence($3, (long)$4, (long)$5, curQuery); memFreeToken($3); } ;index_list : ident { if (parseAddField( parseCreateIdent(NULL, $1,curQuery), 0,NULL, 0,0,curQuery)<0) { parseCleanQuery(curQuery); memFreeToken($1); return(-1); } memFreeToken($1); } | index_list ',' ident { if (parseAddField( parseCreateIdent(NULL, $3, curQuery), 0,NULL, 0,0,curQuery)<0) { parseCleanQuery(curQuery); memFreeToken($3); return(-1); } memFreeToken($3); } ;opt_unique : UNIQUE { $$ = (YYSTYPE) 1; } | /* NULL */ { $$ = 0; } ;opt_index_type : /* NULL */ { $$ = (YYSTYPE) IDX_AVL; } | AVL_INDEX { $$ = (YYSTYPE) IDX_AVL; } | CPI_INDEX { $$ = (YYSTYPE) IDX_CPI; } ;opt_seq_step : /* NULL */ { $$ = (YYSTYPE) 1; } | STEP NUM { $$ = (YYSTYPE) (long)atoi((char *)$2); memFreeToken($2); } ;opt_seq_val : /* NULL */ { $$ = (YYSTYPE) 1; } | VALUE NUM { $$ = (YYSTYPE) (long)atoi((char *)$2); memFreeToken($2); } ;field_list : field_list_item | field_list ',' field_list_item ;field_list_item : qual_ident type opt_nullspec opt_keyspec { if(parseAddField((mIdent_t *)$1,(long)$2, charArrayLength, notNullFlag, keyFlag, curQuery)<0) { parseCleanQuery(curQuery); return(-1); } if (charArrayLength) { free(charArrayLength); } charArrayLength = NULL; } ;type : MSQL_INT { $$ = (YYSTYPE) INT_TYPE; } | MSQL_INT8 { $$ = (YYSTYPE) INT8_TYPE; } | MSQL_INT16 { $$ = (YYSTYPE) INT16_TYPE; } | MSQL_INT32 { $$ = (YYSTYPE) INT_TYPE; } | MSQL_INT64 { $$ = (YYSTYPE) INT64_TYPE; } | MSQL_UINT { $$ = (YYSTYPE) UINT_TYPE; } | MSQL_UINT8 { $$ = (YYSTYPE) UINT8_TYPE; } | MSQL_UINT16 { $$ = (YYSTYPE) UINT16_TYPE; } | MSQL_UINT32 { $$ = (YYSTYPE) UINT_TYPE; } | MSQL_UINT64 { $$ = (YYSTYPE) UINT64_TYPE; } | MSQL_DATE { $$ = (YYSTYPE) DATE_TYPE; } | MSQL_IPV4 { $$ = (YYSTYPE) IPV4_TYPE; } | MSQL_CIDR4 { $$ = (YYSTYPE) CIDR4_TYPE; } | MSQL_CIDR6 { $$ = (YYSTYPE) CIDR6_TYPE; } | MSQL_MONEY { $$ = (YYSTYPE) MONEY_TYPE; } | MSQL_TIME { $$ = (YYSTYPE) TIME_TYPE; } | MSQL_REAL { $$ = (YYSTYPE) REAL_TYPE; } | MSQL_CHAR '(' NUM ')' { charArrayLength = $3; $$ = (YYSTYPE) CHAR_TYPE; } | MSQL_TEXT '(' opt_text_field_len ')' { charArrayLength = $3; $$ = (YYSTYPE) TEXT_TYPE; } ;opt_text_field_len : NUM { $$ = $1; } | /* NULL */ { $$ = strdup("100"); } ;opt_nullspec : /* NULL */ { notNullFlag = 0; } | NOT NULLSYM { notNullFlag = 1; } ;opt_keyspec : /* NULL */ { keyFlag = 0; } | PRIMARY KEY { keyFlag = 1; } ;/*** Select : retrieve data from table*/select : MSQL_SELECT opt_distinct select_data into_clause FROM table_list where_clause order_clause limit_clause offset_clause { curQuery->command = MSQL_SELECT; } ;opt_distinct : /* NULL */ { curQuery->selectDistinct = 0; } | ALL { curQuery->selectDistinct = 0; } | DISTINCT { curQuery->selectDistinct = 1; } ;select_data : select_data ',' select_item | select_item | '*' { mIdent_t *tmp; tmp = parseCreateIdent(NULL,"*", curQuery); parseAddField((mIdent_t *)tmp,0,0,0,0, curQuery); curQuery->selectWildcard = 1; } ;select_item : qual_ident { parseAddField((mIdent_t *)$1,0,0,0,0, curQuery); } | qual_sysvar { parseAddField((mIdent_t *)$1,0,0,0,0, curQuery); } | function ;function : ident { if (parseAddFunction($1, curQuery) < 0) { memFreeToken($1); parseCleanQuery(curQuery); return(-1); } memFreeToken($1); } '(' funct_param_list ')' opt_output_name { if (functFindFunction(curQuery) < 0) { parseCleanQuery(curQuery); return(-1); } } ;funct_param_list : funct_param_list ',' funct_param | funct_param ;funct_param : qual_ident { parseAddFunctParam((mIdent_t *)$1, curQuery); } | qual_sysvar { parseAddFunctParam((mIdent_t *)$1, curQuery); } | literal { parseAddFunctLiteral((mVal_t *)$1, curQuery); } ;opt_output_name : /* NULL */ | MSQL_TEXT { parseSetFunctOutputName($1, curQuery); memFreeToken($1); } ;table_list : ident { if (parseAddTable($1,NULL,curQuery) < 0) { memFreeToken($1); parseCleanQuery(curQuery); return(-1); } memFreeToken($1); } | ident table_alias ident { if (parseAddTable($1, $3, curQuery) < 0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -