⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaccer.y

📁 uClinux下用的数据库
💻 Y
📖 第 1 页 / 共 2 页
字号:
/*** 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 + -