SQL Reserved words

The following table contains reserved words for the KCML SQL parser. They cannot be used as column names, table names or aliases unless they are protected by being quoted e.g. "DATE".

50 8 393
ABSCHARACTER_LENGTHDEGREESGROUPMAXPARTITIONSETTRANSLATE
ABSOLUTECHAR_LENGTHDELETEHAVINGMAX_DUMP_FILE_SIZEPASCALSIGNTRANSLATION
ACOSCHECKDESCHEXMINPATHSIGNEDTREE
ACTIONCJKWIDTHDESCRIBEHOURMINUTEPCTFREESINTRIM
ADACLOBDESCRIPTIONIBMPACKEDMODPERMISSIONSSIZETRUE
ADCCLOSEDESCRIPTORICUMODIFYPISMALLINTTRUNCATE
ADDCOALESCEDIAGNOSTICSIDENTIFIEDMODULEPLISOMETYPE
ALIASCOBOLDIFFERENCEIDENTITYMONTHPOSITIONSORTMERGETYPESTAMP
ALLCOLLATEDISABLEIDEOGRAMMONTHNAMEPOSTVALSOUNDEXUCASE
ALLOCATECOLLATIONDISCONNECTIFMOVEPOWERSOURCE_IMAGEUNION
ALTERCOLUMNDISPLAYIFNULLMUMPSPRECISIONSPACEUNIQUE
ANDCOMMITDISTINCTIMMEDIATENAMEPREPARESPECIALUNKNOWN
ANYCOMPRESSDOMAININNAMESPRESERVESQLUNLIMITED
ARECONCATDOUBLEINCLUDENATIONALPREVALSQLCAUNSIGNED
ASCONNECTDROPINDEXNATURALPRIMARYSQLCODEUNUSED
ASCCONNECTIONDTDINDICATORNCHARPRIORSQLERRORUPDATE
ASCIICONSTRAINTELSEINITIALLYNEXTPRIORITYSQLSTATEUPPER
ASINCONSTRAINTSENABLEINNERNOPRIVILEGESSQLWARNINGUSAGE
ASSERTIONCONTINUEENDINPUTNOCOMPACTPROCEDURESQL_TSI_DAYUSER
ATCONVERTEND-EXECINSENSITIVENOEDITPUBLICSQL_TSI_FRAC_SECONDUSERSTAMP
ATANCORRESPONDINGESCAPEINSERTNOISEQUARTERSQL_TSI_HOURUSE_KRCN
ATAN2COSEVENTSINTEGERNOLOGGINGRADIANSSQL_TSI_MINUTEUSING
AUTHORIZATIONCOTEXCEPTINTERNAL_NUMBERNONALPHARANDSQL_TSI_MONTHUUIDSTAMP
AUTOCOUNTEXCEPTIONINTERSECTNONERANGESQL_TSI_QUARTERVALIDATE
AUTOEXTENDCREATEEXCLUDEINTERVALNORMALIZERAWSQL_TSI_SECONDVALUE
AVGCROSSEXECINTONOROWDEPENDENCIESREADSQL_TSI_WEEKVALUES
BCDDATECURDATEEXECUTEIPREFIXNOTRECLENSQL_TSI_YEARVARCHAR
BCDDATE3CURRENTEXISTSISNOWREFERENCESSQRTVARCHAR2
BEGINCURRENT_DATEEXPISOLATIONNULLRELATIVESTARTBYTEVARYING
BETWEENCURRENT_TIMEEXPLICITJOINNULLIFRENAMESUBSTRVIEW
BITCURRENT_TIMESTAMPEXTENTKDBNUMERICREPEATSUBSTRINGVIRTUAL
BITMAPCURRENT_USEREXTERNALKEYOBJECT_IMAGEREPLACESUMWEEK
BIT_LENGTHCURSOREXTRACTLANGUAGEOCCURSRESIZESYSTEM_USERWHEN
BLOBCURTIMEFALSELASTOCTET_LENGTHRESTRICTTABLEWHENEVER
BLOBDATADATABASEFETCHLCASEOFREVOKETABLESPACEWHERE
BLOCKLENDATEFIRSTLEADINGOFFSETRIGHTTANWITH
BOOLDATESTAMPFLATLEFTOLD_DATEROLLBACKTEMPORARYWORD
BOTHDAYFLOATLENGTHONROUNDTHENWORK
BREAKDAYNAMEFLOORLEVELONLYROWDEPENDENCIESTIMEWRITE
BYDAYOFMONTHFORLIKEOPENROWSTIMESTAMPXML
CASCADEDAYOFWEEKFOREIGNLOCALOPTIONRTRIMTIMESTAMPADDXMLDATA
CASCADEDDAYOFYEARFORTRANLOCATEORSCHEMATIMESTAMPDIFFYEAR
CASEDBIDSTAMPFOUNDLOGORACLESCROLLTIMEZONE_HOURYES
CASTDEALLOCATEFROMLOG10ORDERSECONDTIMEZONE_MINUTE
CATALOGDECFULLLOGGINGOUTERSECTIONTO
CATALOGUEDECIMALGETLOGOGRAMOUTPUTSELECTTOP
CBLOBDECLAREGLOBALLONGUSERNAMESOVERLAPSSEQUENCETOTALLED
CEILINGDEFAULTGOLOWERPACKINGSERIALTRACEFILE_IDENTIFIER
CHARDEFERRABLEGOTOLTRIMPADSESSIONTRAILING
CHARACTERDEFERREDGRANTMATCHPARTIALSESSION_USERTRANSACTION
statement : /* nothing */				
	| select_statement				
	| create_table_statement			
	| create_index_statement			
	| drop_table_statement				
	| drop_index_statement				
	| alter_table_statement				
	| alter_tablespace_statement			
	| alter_session_statement			
	| delete_statement				
	| insert_statement				
	| update_statement				
	| index_delete_statement			
	| create_database_statement			
	| create_ws_index_statement			
	| drop_ws_index_statement			
	| alter_ws_index_statement			
	| create_tablespace_statement			
	| drop_tablespace_statement			
	| drop_database_statement			
	| rename_statement				
	| add_catalog_statement				
	| RT_KCML_SQL_WHERE hash_where			
	;
column_values : '(' insert_name_list ')'
		'(' insert_value_list ')'		
	;
hash_where : search_condition
	|	column_values
	;
delete_statement : RW_DELETE RW_FROM			
		table_name				
		opt_where_clause
		optional_semicolon
	;
insert_statement : RW_INSERT RW_INTO			
		table_name				
		opt_insert_name_list
		insert_source
	;
opt_insert_name_list : /* nothing */
	| '(' insert_name_list ')'			
	;
insert_name_list : column_identifier			
	| column_identifier ',' insert_name_list	
	;
insert_source : sub_query				
	| RW_VALUES '(' insert_value_list		
		')' optional_semicolon
	;
insert_value_list : insert_value			
	| insert_value ',' insert_value_list		
	;
insert_value : literal					
	| dynamic_parameter				
	| RW_NULL					
	| userfn					
	;
update_statement : RW_UPDATE				
		table_name				
		RW_SET update_expr_list			
		opt_where_clause
		optional_semicolon
	;
update_expr_list : update_expr				
	| update_expr_list ',' update_expr		
	;
update_expr : column_identifier '='
		expression_or_null			
	;
expression_or_null : expression				
	| RW_NULL					
	;
drop_table_statement : RW_DROP RW_TABLE			
		opt_if_exists
		table_identifier
		opt_cascade_or_restrict
		opt_from_catalogue			
		optional_semicolon
	;
opt_if_exists: /* missing */				
	| RW_IF RW_EXISTS				
	;
opt_cascade_or_restrict : /* null */			
	| RW_CASCADE					
	| RW_RESTRICT					
	;
catalog:  RW_CATALOG
	| RW_CATALOGUE
	;
opt_from_catalogue :					
	| RW_FROM catalog				
	;
alter_table_statement : RW_ALTER RW_TABLE		
	table_name					
	alter_table_type optional_semicolon		
	;
alter_table_type : RW_MOVE				
	| RW_MOVE RW_PARTITION user_name		
	| RW_MOVE RW_TABLESPACE user_name		
	| RW_LOGGING RW_TO user_name			
	| RW_NOLOGGING					
	| RW_ADD optschema '('				
		alter_column_list
		')'					
	| RW_SET RW_UNUSED '(' insert_name_list ')'
							
	| RW_DROP RW_UNUSED				
	| RW_DROP optschema '(' insert_name_list ')'
							
	| RW_DROP optschema RW_COLUMN column_identifier
							
	| RW_MODIFY optschema				
		modify_cols				
	| RW_RENAME RW_COLUMN column_identifier RW_TO user_name
							
	| RW_SCHEMA					
		schemaopts				
	;
optschema: /* optional */				
	| RW_SCHEMA RW_ONLY				
	;
schemaopts:	RW_UPDATE				
	| schemaparms					
	;
modify_cols:
	  alter_column_definition			/* single column */
	| '(' alter_column_list ')'			/* list of columns in () */
	;
alter_column_list:
	  alter_column_definition
	| alter_column_list ','			
		alter_column_definition
	;
alter_column_definition:
	  user_name					
	  opt_data_type
	  options_list					
	;
opt_data_type:	/* optional */
	| data_type					
	;
alter_tablespace_statement : RW_ALTER RW_TABLESPACE
		user_name RW_LOGGING optional_semicolon	
	| RW_ALTER RW_TABLESPACE user_name RW_NOLOGGING
		optional_semicolon			
	| RW_ALTER RW_TABLESPACE user_name RW_RESIZE
		literal_integer size_unit
		optional_semicolon			
	;
size_unit : RT_USER_DEFINED_NAME			
	;
alter_session_statement : RW_ALTER RW_SESSION RW_SET
		alter_session_variant optional_semicolon 
	;
alter_session_variant : RW_EVENTS literal_string	
	| RW_TRACEFILE_IDENTIFIER '=' literal_string	
	| RW_MAX_DUMP_FILE_SIZE '=' RW_UNLIMITED	
	;
rename_statement : RW_RENAME				
			table_name RW_TO		
			user_name optional_semicolon	
	;
add_catalog_statement: RW_ALTER catalog RW_ADD RW_TABLE
			lit_name opt_update		
			optional_semicolon
	;
opt_update: RW_FOR RW_UPDATE				
	| /* optional */				
	;
create_database_statement : RW_CREATE RW_DATABASE user_name_mixed_case
		RW_TYPE database_type			
		databaseparms
		optional_semicolon
	;
database_type : RW_VIRTUAL				
	|	RW_KDB					
	|	RW_SQL					
	;
drop_database_statement : RW_DROP RW_DATABASE opt_if_exists user_name_mixed_case	
	;
create_tablespace_statement : RW_CREATE opt_local_or_global RW_TABLESPACE
		user_name literal_string		 
		tablespaceparms
		optional_semicolon
	;
tablespaceparms: /* none */
	| tablespace_element	/* only one */
	| tablespace_element tablespaceparms /* a list */
	;
tablespace_element: RW_TYPE tablespace_type		
	|	RW_FOR RW_USER user_name_mixed_case	
	|	RW_SIZE literal_integer			
	|	RW_AUTOEXTEND literal_integer		
	|	RW_OBJECT_IMAGE literal_string		
	|	RW_SOURCE_IMAGE literal_string		
	;
tablespace_type:RW_FLAT					
	|	RW_TREE					
	|	RW_TEMPORARY				
	;
opt_local_or_global : /* optional */			
	|	RW_GLOBAL				
	|	RW_LOCAL				
	;
drop_tablespace_statement: RW_DROP RW_TABLESPACE user_name_mixed_case		
	;
opt_temp_param:	/* Nothing */				
	|	RW_ON RW_COMMIT RW_PRESERVE RW_ROWS	
	|	RW_ON RW_COMMIT RW_DELETE RW_ROWS	
	;
create_table_statement:
	  RW_CREATE RW_TABLE user_name '('			
		create_column_list
		')' tableparms					
		optional_semicolon
	| RW_CREATE RW_TEMPORARY RW_TABLE user_name '('		
		create_column_list
		')' opt_temp_param tableparms			
		optional_semicolon
	| RW_CREATE RW_TABLE user_name opt_tablespace opt_partition
		RW_AS RW_SELECT '*' RW_FROM			
		table_name					
		optional_semicolon
	/*| RW_CREATE RW_TEMPORARY RW_TABLE user_name opt_temp_param opt_tablespace opt_partition
		RW_AS RW_SELECT '*' RW_FROM			
		table_name					
		optional_semicolon*/
	;
opt_tablespace : /* Nothing */				
	| RW_TABLESPACE user_name			
	;
create_column_list:
	  create_column_definition
	| create_column_list ','			
		create_column_definition
	;
create_column_definition:
	  user_name					
	  data_type options_list			
	;
options_list : /* could be blank */			
	| options_list options_element
	;
options_element : RW_ALIAS user_defined_name		
	| RW_STARTBYTE literal_integer			
	| RW_DISPLAY literal_string			
	| RW_SIGNED					
	| RW_UNSIGNED					
	| RW_OCCURS literal_integer			
	| RW_RANGE '(' range_type ')'			
	| RW_TOTALLED					
	| RW_NOT RW_TOTALLED				
	| RW_PRIORITY '(' priority_string ',' priority_string
		',' priority_string ')'			
	| RW_NAME literal_string			
	| RW_SPECIAL literal_string			
	| RW_PREVAL literal_integer			
	| RW_POSTVAL literal_integer			
	| RW_VALIDATE user_defined_name_mixed_case
				literal_string		
	| RW_NOT RW_VALIDATE				
	| RW_SEQUENCE literal_integer			
	| RW_OVERLAPS user_defined_name			
	| RW_OVERLAPS user_defined_name RW_OFFSET
		literal_integer				
	| RW_NULL					
	| RW_NOT RW_NULL				
	| RW_NO RW_UPDATE			
	| RW_SQLDEFAULT RW_NULL				
	| RW_SQLDEFAULT RW_USER				
	| RW_SQLDEFAULT RT_EXACT_NUMERIC_REAL_LITERAL	
	| RW_SQLDEFAULT RT_APPROXIMATE_NUMERIC_LITERAL	
	| RW_SQLDEFAULT RT_INT_LITERAL			
	| RW_SQLDEFAULT RT_CHARACTER_STRING_LITERAL	
	| RW_SQLDEFAULT hexlit				
	| RW_SQLDEFAULT RT_DATE_LITERAL			
	| RW_SQLDEFAULT RT_TIME_LITERAL			
	| RW_SQLDEFAULT RT_TIMESTAMP_LITERAL		
	| RW_LANGUAGE					
	;
hexlit: RW_HEX '(' lit_name ')'				
	;
range_type : opt_plus_or_minus range_number ','
		opt_plus_or_minus range_number		
	| RW_ALL					
	;
range_number : literal_integer				
	| literal_real					
	;
priority_string : /* blank */				
	| user_defined_name				
	| literal_integer				
	;
data_prec: '(' literal_integer ')'			
	;
data_type: RW_VARCHAR data_prec				
	| RW_VARCHAR2 data_prec				
	| RW_CHAR data_prec				
	| RW_HEX data_prec				
	| RW_NUMERIC '(' literal_integer rpar		
	| RW_NUMERIC '(' literal_integer ','
		literal_integer rpar			
	| RW_KSEPACKED data_prec			
	| RW_KSEPACKED '(' literal_integer ','
		literal_integer ')'			
	| RW_INTEGER data_prec				
	| RW_DECIMAL data_prec				
	| RW_DECIMAL '(' literal_integer ','
		literal_integer ')'			
	| RW_INTERNAL_NUMBER				
	| RW_INTERNAL_NUMBER data_prec			
	| RW_INTERNAL_NUMBER '(' literal_integer
		',' literal_integer ')'			
	| RW_BLOB					
	| RW_CLOB					
	| RW_CBLOB					
	| RW_TIME					
	| RW_TIMESTAMP					
	| RW_KSEDATE					
	| RW_KSEDATE3					
	| RW_OLD_DATE					
	| RW_BIT					
	| RW_BOOL					
	| RW_DATE					
	;
rpar : ')'						
	| RT_RPARB					
	| RT_RPARF					
	;
literal_real : RT_EXACT_NUMERIC_REAL_LITERAL		
	| RT_APPROXIMATE_NUMERIC_LITERAL		
	;
literal_integer : RT_INT_LITERAL			
	;
lit_name : RT_CHARACTER_STRING_LITERAL			
	;
literal_string : lit_name				
	| RT_INTS litstrlist RT_INTE			
	;
int_lit_name : lit_name					
	| /* nothing */					
	;
litstrlist : int_lit_name				
	| int_lit_name ',' litstrlist			
	;
user_name_mixed_case : RT_USER_DEFINED_NAME		
	;
int_user_name_mixed_case : RT_USER_DEFINED_NAME		
	| /* nothing */					
	;
user_defined_name_mixed_case : user_name_mixed_case	
	| RT_INTS userstrlist_mixed_case RT_INTE	
	;
userstrlist_mixed_case : int_user_name			
	| int_user_name_mixed_case ','
			userstrlist_mixed_case		
	;
user_name : RT_USER_DEFINED_NAME			
	;
int_user_name : RT_USER_DEFINED_NAME			
	| /* nothing */					
	;
user_defined_name : user_name				
	| RT_INTS userstrlist RT_INTE			
	;
userstrlist : int_user_name				
	| int_user_name ',' userstrlist			
	;
databaseparms : /* could be nothing */			
	| databaseparms_element
	| databaseparms_element databaseparms
	;
databaseparms_element : RW_DESCRIPTION literal_string	
	| RW_WITH RW_PERMISSIONS			
	| RW_USER user_name_mixed_case RW_IDENTIFIED RW_BY literal_string
							
	| RW_SQLDEFAULT RW_TABLESPACE user_name		
	;
stamp_col_name: RW_NULL					
	| user_name
	;
tableparms : /* could be blank */			
	| tableparms_element
	| tableparms_element ',' tableparms
	;
tableparms_element : RW_ROWS literal_integer				
	| RW_RECLEN literal_integer					
	| RW_EXTENT literal_integer					
	| RW_TYPE literal_integer					
	| RW_PACKING literal_integer					
	| RW_BLOCKLEN literal_integer					
	| RW_NAME literal_string					
	| RW_SERIAL user_name /* no name */				
	| RW_SERIAL user_name user_defined_name				
	| RW_NOEDIT lit_name						
	| RW_PATH lit_name						
	| RW_TIMESTAMP stamp_col_name					
	| RW_DATESTAMP stamp_col_name					
	| RW_USERSTAMP stamp_col_name					
	| RW_TYPESTAMP stamp_col_name					
	| RW_UUIDSTAMP stamp_col_name					
	| RW_DBIDSTAMP stamp_col_name					
	| RW_IPREFIX lit_name						
	| RW_EXCLUDE RW_COLUMN user_defined_name lit_name		
	| RW_TABLESPACE user_name					
	| RW_CASE lit_name						
	| RW_UPDATE lit_name						
	| RW_PCTFREE literal_integer					
	| RW_REVOKE '(' revoke_list ')'					
	| partition							
	| RW_ROWDEPENDENCIES						
	| RW_NOROWDEPENDENCIES						
	| RW_USE_KRCN							
	| RW_ADC enable_or_disable_as_bool		
	;
schemaparms: schemaparms_element
	| schemaparms_element ',' schemaparms
	;
schemaparms_element:
	  RW_IPREFIX lit_name						
	| RW_SERIAL user_name						
	| RW_SERIAL user_name user_defined_name optserdef		
	| RW_TIMESTAMP stamp_col_name					
	| RW_USERSTAMP stamp_col_name					
	| RW_TYPESTAMP stamp_col_name					
	| RW_UUIDSTAMP stamp_col_name					
	| RW_DBIDSTAMP stamp_col_name					
	| RW_NAME literal_string					
	| RW_REVOKE '(' revoke_list ')'					
	| RW_EXCLUDE RW_COLUMN user_defined_name lit_name		
	| RW_EXCLUDE RW_COLUMN RW_NULL					
	| RW_CASE lit_name						
	| RW_UPDATE lit_name						
	| RW_NOEDIT lit_name						
	| RW_USE_KRCN yes_or_no_as_bool					
	| RW_ADC enable_or_disable_as_bool				
	;
yes_or_no_as_bool: RW_YES						
	| RW_NO								
	;
enable_or_disable_as_bool: RW_ENABLE			
	| RW_DISABLE								
	;
optserdef: /* missing */						
	| RW_SQLDEFAULT							
	;
revoke_element : RW_ALTER						
	| RW_DELETE							
	| RW_INSERT							
	| RW_READ							
	| RW_SELECT							
	| RW_UPDATE							
	| RW_WRITE							
	;
revoke_list: /* could be blank */					
	| revoke_element						
	| revoke_element ',' revoke_list				
	;
partition: RW_PARTITION RW_BY user_defined_name
		RW_VALUES '(' literal_integer ')'			
	;
opt_partition: partition						
	| /* nothing */							
	;
optional_xml_clause : RW_FOR RW_XML RW_RAW optional_xml_schema		
	| RW_FOR RW_XML RW_AUTO optional_xml_schema			
	| RW_FOR RW_XML RW_EXPLICIT optional_xml_schema			
	| RW_FOR RW_CHAR						
	| RW_FOR RW_INSERT						
	| /* nothing */
	;
optional_xml_schema : ',' RW_DTD					
	| ',' RW_XMLDATA						
	| /* nothing */							
	;
optional_semicolon : ';'
	| /* nothing */
	;
drop_index_statement : RW_DROP RW_INDEX
		user_defined_name			
		optional_semicolon
	;
drop_ws_index_statement : RW_DROP RW_WORD RW_INDEX
		user_defined_name			
		optional_semicolon
	;
index_delete_statement : RW_INDEX user_defined_name
		RW_DELETE				
		optional_semicolon
	;
optint:   /* missing */					
	| RT_INT_LITERAL				
	;
compress: /* missing */					
	| RW_COMPRESS optint				
	;
create_index_statement : RW_CREATE opt_unique RW_INDEX user_defined_name
		RW_ON user_defined_name '('		
		collist ')' compress opt_tablespace	
		optional_semicolon
	;
opt_unique : /* missing, default */			
	| RW_UNIQUE					
	| RW_VIRTUAL					
	| RW_BITMAP					
	;
collist : colident					
	| collist ','					
		colident				
	;
substr:   RW_SUBSTRING					
	| RW_SUBSTR					
	;
colident: user_defined_name optocc OptAscDesc		
	| substr '(' user_defined_name optocc ',' numlit substrlen ')' OptAscDesc
							
	;
optocc: /* none */					
	| '(' numlit ')'				
	;
substrlen: /* none */					
	| ',' numlit					
	;
numlit: RT_INT_LITERAL					
	;
create_ws_index_statement : RW_CREATE RW_WORD RW_INDEX user_defined_name
		RW_ON user_defined_name '('		
		wscollist ')'
		wsorderbyclause
		wsparms optional_semicolon		
	;
alter_ws_index_statement: RW_ALTER RW_WORD RW_INDEX user_defined_name
							
		alter_ws_index_mode
		optional_ws_reorder
		optional_ws_reindex
		optional_semicolon
	;
alter_ws_index_mode: /* optional */
	| RW_ADD alter_ws_collist			
	| RW_DROP alter_ws_collist			
	;
alter_ws_collist: '(' wscollist ')'
	;
optional_ws_reorder:	/* optional */
	| wsorderbyclause				
	;
optional_ws_reindex:	/* optional */
	| RW_UPDATE RW_INDEX				
	;
wscollist: wscolident					
	| wscollist ','					
		wscolident				
	;
wscolident: user_defined_name optocc			
	;
wsparms : /* could be blank */				
	| wsparms_element
	| wsparms_element ',' wsparms
	;
wsparms_element : RW_MAX literal_integer		
	| RW_MIN literal_integer			
	| RW_NONALPHA literal_string			
	| RW_NOISE literal_string			
	| RW_ICU literal_integer			
	| RW_BREAK RW_IDEOGRAM				
	| RW_BREAK RW_LOGOGRAM				
	| RW_NORMALIZE RW_CJKWIDTH			
	;
wsorderbyclause : /* might be optional */		
	| RW_ORDER RW_BY wsorderby			
	;
wsorderby : user_defined_name				
	| '('						
		wsorderlist ')'				
	;
wsorderlist : wsorderent				
	| wsorderlist ','				
		wsorderent				
	;
wsorderent : user_defined_name optocc			
	;
select_statement : RW_SELECT opt_hint
			opt_top opt_all_or_distinct
			select_list RW_FROM		
			table_reference_list		
			opt_where_clause
			opt_group_clause
			opt_having_clause
			opt_union_clause
			opt_order_by_clause
			optional_xml_clause
			optional_semicolon
	;
opt_union_clause : /* null */
	| RW_UNION RW_ALL sub_query			
			opt_union_clause
	| RW_UNION sub_query				
			opt_union_clause
	;
opt_hint : /* null */
	| RT_HINT					
	;
opt_top : /* null */
	| RW_TOP RT_INT_LITERAL				
	;
opt_all_or_distinct : /* null */
	| RW_ALL					
	| RW_DISTINCT					
	;
select_list : '*'					
	| select_sublist				
	;
select_sublist : select_sublist_item			
	| select_sublist ',' select_sublist_item	
	;
select_sublist_as : column_alias			
	| RT_CHARACTER_STRING_LITERAL			
	;
select_sublist_item : expression			
	| expression column_identifier			
	| expression RT_CHARACTER_STRING_LITERAL	
	| expression RW_AS				
		select_sublist_as			
	| table_name '.' '*'				
	| correlation_name '.' '*'			
	;
expression : term					
	| expression plus_or_minus term			
	;
opt_plus_or_minus : /* NULL */				
	| '+'						
	| '-'						
	;
plus_or_minus : '+'					
	| '-'						
	;
term : factor						
	| term star_or_slash factor			
	;
star_or_slash : '*'					
	| '/'						
	;
factor : primary					
	| plus_or_minus primary				
								if ($1 == '+') 
								else 
								$$ = $2;
							}
							else 
							}
	;
primary : column_name					
	| dynamic_parameter				
	| literal					
	| set_function_reference			
	| ODBC_scalar_function_extension		
	| scalar_function				
	| yes_or_no					
	| '(' expression ')'				
	;
column_name : column_identifier				
	| ifld_identifier				
	| table_name '.' column_identifier		
	| correlation_name '.' column_identifier	
	;
table_name : table_identifier				
	| owner_name '.' table_identifier		
	| qualifier_name_and_separator table_identifier	
	| qualifier_name_and_separator opt_owner_name
			'.' table_identifier		
	;
owner_name : RT_SCHEMA_NAME				
	;
opt_owner_name : /* null */				
	| owner_name					
	;
qualifier_name_and_separator: RT_QUALIFIER_NAME		
	;
table_identifier: RT_TABLE_NAME				
	;
correlation_name: RT_CORRELATION_NAME			
	;
ifld_identifier: ifld_identifier2 ifld_occurs		
	;
ifld_identifier2: RT_USER_DEFINED_IFLD_NAME		
	;
ifld_occurs: /* null */					
	| RT_USER_DEFINED_IFLD_OCCURS			
	;
column_identifier: RT_USER_DEFINED_NAME			
	;
dynamic_parameter : '?' dynamic_parameter_type		
	| ':' numlit dynamic_parameter_type		
	;
dynamic_parameter_type:					
	| RT_USER_DEFINED_NAME				
								switch (ps->szLexToken[0]) 
							}	      
	;
literal : RT_CHARACTER_STRING_LITERAL			
	| numeric_literal				
	| ODBC_date_time_extension			
	| RW_DATE date_value				
	| RW_TIME time_value				
	| RW_TIMESTAMP timestamp_value			
	;
opt_quote : /* null */
	| RT_QUOTATION_MARK
	;
numeric_literal : opt_quote RT_INT_LITERAL		
	| opt_quote RT_EXACT_NUMERIC_REAL_LITERAL	
	| opt_quote RT_APPROXIMATE_NUMERIC_LITERAL	
	;
ODBC_date_time_extension :
	  RT_ESC_D date_value RT_ESC_CLOSE		
	| RT_ODBC_D date_value '}'			
	| date_value					
	| RT_ODBC_J literal_integer '}'			
	| RT_ESC_T time_value RT_ESC_CLOSE		
	| RT_ODBC_T time_value '}'			
	| time_value					
	| RT_ESC_TS timestamp_value RT_ESC_CLOSE	
	| RT_ODBC_TS timestamp_value '}'		
	| RT_ODBC_TS literal_real '}'			
	;
date_value : RT_DATE_LITERAL				
	;
time_value : RT_TIME_LITERAL				
	;
timestamp_value : RT_TIMESTAMP_LITERAL			
	;
set_function_reference : RW_COUNT '(' '*'
				')'			
	| distinct_function				
	| all_function					
	;
distinct_function : RW_AVG '(' RW_DISTINCT
			column_name ')'			
	| RW_COUNT '(' RW_DISTINCT
			column_name ')'			
	| RW_MAX '(' RW_DISTINCT
			column_name ')'			
	| RW_MIN '(' RW_DISTINCT
			column_name ')'			
	| RW_SUM '(' RW_DISTINCT
			column_name ')'			
	;
all_function : RW_AVG '(' expression ')'		
	/* the following is not in ODBC 2.0 but is in x/Open '92 */
	| RW_COUNT '(' expression ')'			
	| RW_MAX '(' expression ')'			
	| RW_MIN '(' expression ')'			
	| RW_SUM '(' expression ')'			
	;
column_alias : RT_ALIAS_NAME				
	;
table_reference_list : table_reference			
	| table_reference_list ',' table_reference	
	;
table_reference : table_name				
	| table_name correlation_name			
	| outer_join					
	| RT_ESC_OJ outer_join RT_ESC_CLOSE		
	| RT_ODBC_OJ outer_join '}'			
	| sub_query_as_table opt_sq_alias		
	;
sub_query_as_table: '('					
		sub_query ')'				
	;
opt_sq_alias:						
	| optas RT_TABLE_NAME				
	;
optas:	/* nothing */
	| RW_AS
	;
outer_join_keyword :
		RW_LEFT RW_OUTER RW_JOIN		
	|	RW_RIGHT RW_OUTER RW_JOIN		
	;
outer_join_table :	table_name_and_opt_correlation
	|		outer_join
	;
outer_join :	outer_join_table
		outer_join_keyword
		table_name_and_opt_correlation RW_ON			
		search_condition			
									if ($2) 
									tl_node = CreateParserNode(ps, ENODE_TABLE_LIST, lnode, rnode, 0);
									$$ = CreateParserNode(ps, ENODE_LEFT_OUTER_JOIN, tl_node, $6, 0);
									ps->bTableNames = TRUE; }
	;
table_name_and_opt_correlation : table_name		
	| table_name correlation_name			
	;
search_condition : boolean_term				
	| boolean_term RW_OR search_condition		
	;
boolean_term : boolean_factor				
	| boolean_factor RW_AND boolean_term		
	;
boolean_factor : boolean_primary			
	| RW_NOT boolean_primary			
	;
opt_not : /* null */					
	| RW_NOT					
	;
boolean_primary : predicate				
	| '(' search_condition ')'			
	;
predicate : between_predicate				
	| comparison_predicate				
	| exists_predicate				
	| in_predicate					
	| like_predicate				
	| null_predicate				
	| qualified_predicate				
	| true_false_predicate				
	;
between_predicate : expression opt_not RW_BETWEEN
			between_range			
	;
between_range : expression RW_AND expression		
	;
comparison_predicate : expression comparison_operator
			expression			
	| expression comparison_operator
			'(' sub_query ')'		
	;
comparison_operator : RT_LT				
	| RT_GT						
	| RT_LTE					
	| RT_GTE					
	| '='						
	| RT_NE						
	;
sub_query : RW_SELECT					
		opt_all_or_distinct
		select_list RW_FROM			
		table_reference_list			
		opt_where_clause
		opt_group_clause
		opt_having_clause
		opt_union_clause
		opt_order_by_clause			
	;
exists_predicate : RW_EXISTS '(' sub_query ')'		
	;
in_predicate : expression opt_not RW_IN
			'(' value_list ')'		
	| expression opt_not RW_IN
			'(' sub_query ')'		
	;
value_list : value					
	| value_list ',' value				
	;
value : literal						
	| dynamic_parameter				
	| userfn					
	;
userfn: RW_USER						
	;
like_opt_escape: /* none */				
	| RW_ESCAPE RT_CHARACTER_STRING_LITERAL 	
								else 
							}
	;
like_predicate : expression opt_not RW_LIKE pattern_value like_opt_escape
							
	;
pattern_value : RT_CHARACTER_STRING_LITERAL		
	| dynamic_parameter				
	| userfn					
	;
null_predicate : column_name RW_IS opt_not RW_NULL	
	;
qualified_predicate : expression comparison_operator
		 RW_ALL '(' sub_query ')'		
	| expression comparison_operator RW_SOME
			'(' sub_query ')'		
	| expression comparison_operator RW_ANY
			'(' sub_query ')'		
	;
true_false_predicate : RW_TRUE				
	| RW_FALSE					
	;
yes_or_no : RW_YES					
	| RW_NO						
	;
opt_where_clause : /* null */
	| RW_WHERE search_condition			
	;
sort_specification_list : sort_specification		
	| sort_specification_list ','
		sort_specification			
	;
sort_specification : expression OptAscDesc		
	;
OptAscDesc : /* null */					
	| RW_ASC					
	| RW_DESC					
	;
opt_group_clause : /* null */
	| RW_GROUP RW_BY column_name_list		
	;
column_name_list : column_name_element			
	| column_name_list ',' column_name_element	
	;
column_name_element : column_name			
	;
opt_having_clause : /* null */
	| RW_HAVING search_condition			
	;
opt_order_by_clause : /* null */
	| RW_ORDER RW_BY sort_specification_list	
	;
ODBC_scalar_function_extension :
	RT_ESC_FN scalar_function RT_ESC_CLOSE		
	| RT_ODBC_FN scalar_function '}'		
	;
scalar_function : string_function			
	| numeric_function				
	| date_function					
	| system_function				
	;
trimspec: /* nothing */					
	| RW_LEADING					
	| RW_TRAILING					
	| RW_BOTH					
	;
trimchar: /* nothing */					
	| RT_CHARACTER_STRING_LITERAL			
	;
two_expressions: expression ',' expression		
	;
three_expressions: expression ',' two_expressions	
	;
string_function : RW_ASCII '(' expression ')'		
	| RW_BIT '(' expression ',' expression ')'
							
	| RW_CHAR '(' expression ')'			
	| RW_CONCAT '(' expression ',' expression ')'	
	| RW_DIFFERENCE '(' expression ',' expression ')'
							
	| RW_LCASE '(' expression ')'			
	| RW_LOWER '(' expression ')'			
	| RW_LEFT '(' expression ',' expression ')'
							
	| RW_LENGTH '(' expression ')'			
	| RW_LOCATE '(' two_expressions ',' expression ')'
							
	| RW_LOCATE '(' two_expressions ')'
							
	| RW_LTRIM '(' expression ')'			
	| RW_RIGHT '(' expression ',' expression ')'
							
	| RW_RTRIM '(' expression ')'			
	| RW_SOUNDEX '(' expression ')'			
	| RW_SPACE '(' expression ')'			
	| RW_REPEAT '(' expression ',' expression ')'	
	| RW_REPLACE '(' expression ',' two_expressions ')'
							
	| RW_SUBSTR '(' expression ',' two_expressions ')'
							
	| RW_SUBSTRING '(' expression ',' two_expressions ')'
							
	| RW_UCASE '(' expression ')'			
	| RW_UPPER '(' expression ')'			
	| RW_BLOBDATA '(' expression ',' literal_integer ')'
							
	| RW_HEX '(' expression ')'			
	| RW_TRIM '(' trimspec trimchar RW_FROM expression ')'
							
	| RW_INSERT '(' expression ',' three_expressions ')'
							
	;
numeric_function : RW_ABS '(' expression ')'		
	| RW_ATAN '(' expression ')'			
	| RW_CEILING '(' expression ')'			
	| RW_COS '(' expression ')'			
	| RW_DEGREES '(' expression ')'			
	| RW_ACOS '(' expression ')'			
	| RW_EXP '(' expression ')'			
	| RW_FLOOR '(' expression ')'			
	| RW_LOG '(' expression ')'			
	| RW_LOG10 '(' expression ')'			
	| RW_MOD '(' expression ',' expression ')'	
	| RW_ATAN2 '(' expression ',' expression ')'	
	| RW_POWER '(' expression ',' expression ')'	
	| RW_ROUND '(' expression ',' expression ')'	
	| RW_ROUND '(' expression ')'			
	| RW_TRUNCATE '(' expression ',' expression ')'	
	| RW_RAND '(' expression ')'			
	| RW_RAND '(' ')'				
	| RW_PI '(' ')'					
	| RW_SIGN '(' expression ')'			
	| RW_SIN '(' expression ')'			
	| RW_ASIN '(' expression ')'			
	| RW_SQRT '(' expression ')'			
	| RW_TAN '(' expression ')'			
	| RW_COT '(' expression ')'			
	| RW_RADIANS '(' expression ')'			
	;
date_function : RW_DAYNAME '(' expression ')'		
	| RW_DAYOFMONTH '(' expression ')'		
	| RW_DAYOFWEEK '(' expression ')'		
	| RW_DAYOFYEAR '(' expression ')'		
	| RW_MONTH '(' expression ')'			
	| RW_MONTHNAME '(' expression ')'		
	| RW_QUARTER '(' expression ')'			
	| RW_HOUR '(' expression ')'			
	| RW_MINUTE '(' expression ')'			
	| RW_SECOND '(' expression ')'			
	| RW_CURDATE '(' ')'				
	| RW_CURTIME '(' ')'				
	| RW_NOW '(' ')'				
	| RW_TIMESTAMPADD '(' time_interval ',' two_expressions ')'
							
	| RW_TIMESTAMPDIFF '(' time_interval ',' two_expressions ')'
							
	| RW_WEEK '(' expression ')'			
	| RW_YEAR '(' expression ')'			
	;
system_function : RW_DATABASE '(' ')'			
	| RW_IFNULL '(' expression ',' expression ')'
							
	| RW_USER '(' ')'				
	| userfn					
	;
time_interval : RW_SQL_TSI_FRAC_SECOND			
	| RW_SQL_TSI_SECOND				
	| RW_SQL_TSI_MINUTE				
	| RW_SQL_TSI_HOUR				
	| RW_SQL_TSI_DAY				
	| RW_SQL_TSI_WEEK				
	| RW_SQL_TSI_MONTH				
	| RW_SQL_TSI_QUARTER				
	| RW_SQL_TSI_YEAR				
	;