[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Reduce-Reduce errors in SQL92 grammar



I am building a SQL92 parser with SableCC. However, I am getting
multiple reduce/reduce errors ..... Can anyone suggest how I could
resolve these issues?

Sometimes, I get an exception from org.sablecc.sablecc.SableCC.main
(more specifically a call to append from Inlining.inline)

Any ideas?

- T

The sepcification file is
------------------------------
Package com.ibm.hippo.SQL92Parser;

Helpers

	all = [0 .. 127];
	cr = 13;
	lf = 10;
	eol = cr | lf | cr lf;
	tab = 9;
	sq = ''';
	non_eol = [all - [cr + lf] ];
	not_db = [all-'"'];
	not_sb = [all-sq];

	doublequoted = '"' not_db* '"';
	singlequoted = sq not_sb* sq;


	ucase  =  ['A'-'Z'];
	lcase  =  ['a'-'z'];
	digit =  ['0'-'9'];
         sign = ('+' | '-');

         bits = ('0' | '1')+;
         hex = ( ['0'..'9'] | ['a'-'f'] | ['A'-'F'] )+;

         binary_literal = 'B' sq bits sq;
         hex_literal = 'X' sq hex sq;

         unsigned_numeric = digit+ ('.' digit* )?;
         signed_numeric = sign digit+ ( '.' digit* )?;

         year = (digit digit digit digit);
         month = ('0' |'1') ['0'-'2'];
         day = ['0'-'3'] digit;
         date = year '-' month '-' day;


         hours = ['0'-'2'] digit;
         mins = ['0'-'5'] digit;
         secs = ['0'-'5'] digit;
         nano = digit digit digit digit digit digit;
         time = hours ':' mins ':' secs ( '.' nano )?;


         timezone_displacement = sign hours ':' mins;

         h_comment = '--' non_eol* eol;


Tokens

	/****************/
	/* White Spaces */
	/****************/
	comments = h_comment;
	blanks = ( eol | tab | ' ')+;

	/****************/
	/* Time Tokenss */
	/****************/
	year_int = year;
	month_int = month;
	time_int = time;
	date_int = date;
	day_int = day;
	hour_int = hours;
	min_int = mins;
	sec_int = secs;
         nano_int = nano;
	timestamp_int = date time;
	timezone_int = timezone_displacement;

	/**************/
	/* Delimiters */
	/**************/


	/* A Character String literal */
         character_string_literal = singlequoted;

	/* a delimited identifier */
         delimited_identifier = doublequoted;

	/* sql special characters */
	dbl_quote = '"';
	percent = '%';
	ampersand = '&';
	single_quote = sq;
	openbr = '(';
	closebr = ')';
	star = '*';
	plus = '+';
	comma = ',';
	dash = '-';
	dot = '.';
	slash = '/';
	colon = ':';
	semi_colon = ';';
	lt  = '<';
	eq = '=';
	gt = '>';
	qmark = '?';
	underscore = '_';
	log_or = '|';

	/* extra symbols */
	neq = '<>';
	lteq = '<=';
	gteq = '>=';
	concat = '||';
	dotdot =  '..';
	opensqbr = '(';
	closesqbr = ')?';


	/*****************/
	/* nondelimiters */
	/*****************/

	/* reserved key words */
	absolute = 'ABSOLUTE' | 'absolute';
	action = 'ACTION' | 'action';
	add = 'ADD' | 'add';
	all = 'ALL' | 'all';
	allocate = 'ALLOCATE' | 'allocate';
	alter = 'ALTER' | 'alter';
	and = 'AND' | 'and';
	any = 'ANY' | 'any';
	are = 'ARE' | 'are';
	as = 'AS' | 'as';
	asc = 'ASC' | 'asc';
	assertion = 'ASSERTION' | 'assertion';
	at = 'AT' | 'at';
	authorization = 'AUTHORIZATION' | 'authorization';
	avg = 'AVG' | 'avg';
	begin = 'BEGIN' | 'begin';
	between = 'BETWEEN' | 'between';
	bit = 'BIT' | 'bit';
	bit_length = 'BIT_LENGTH' | 'bit_length';
	both = 'BOTH' | 'both';
	by = 'BY' | 'by';
	cascade = 'CASCADE' | 'cascade';
	cascaded = 'CASCADED' | 'cascaded';
	case = 'CASE' | 'case';
	cast = 'CAST' | 'cast';
	catalog = 'CATALOG' | 'catalog';
	char = 'CHAR' | 'char';
	character = 'CHARACTER' | 'character';
	char_length = 'CHAR_LENGTH' | 'char_length';
	character_length = 'CHARACTER_LENGTH' | 'character_length';
	check = 'CHECK' | 'check';
	close = 'CLOSE' | 'close';
	coalesce = 'COALESCE' | 'coalesce';
	collate = 'COLLATE' | 'collate';
	collation = 'COLLATION' | 'collation';
	column = 'COLUMN' | 'column';
	commit = 'COMMIT' | 'commit';
	connect = 'CONNECT' | 'connect';
	connection = 'CONNECTION' | 'connection';
	constraint = 'CONSTRAINT' | 'constraint';
	constraints = 'CONSTRAINTS' | 'constraints';
	continue = 'CONTINUE' | 'continue';
	convert = 'CONVERT' | 'convert';
	corresponding = 'CORRESPONDING' | 'corresponding';
	count = 'COUNT' | 'count';
	create = 'CREATE' | 'create';
	cross = 'CROSSS' | 'cross';
	current = 'CURRENT' | 'current';
	current_date = 'CURRENT_DATE' | 'current_date';
	current_time = 'CURRENT_TIME' | 'current_time';
	current_timestamp = 'CURRENT_TIMESTAMP' | 'current_timestamp';
	current_user = 'CURRENT_USER' | 'current_user';
	cursor = 'CURSOR' | 'cursor';
	date = 'DATE' | 'date';
	day = 'DAY' | 'day';
	deallocate = 'DEALLOCATE' | 'deallocate';
	dec = 'DEC' | 'dec';
	decimal = 'DECIMAL' | 'decimal';
	declare = 'DECLARE' | 'declare';
	default = 'DEFAULT' | 'default';
	deferrable = 'DEFERRABLE' | 'deferrable';
	deferred = 'DEFERRED' | 'deferred';
	delete = 'DELETE' | 'delete';
	desc = 'DESC' | 'desc';
	describe = 'DESCRIBE' | 'describe';
	descriptor = 'DESCRIPTOR' | 'descriptor';
	diagnostics = 'DIAGNOSTICS' | 'diagnostics';
	disconnect = 'DISCONNECT' | 'disconnect';
	distinct = 'DISTINCT' | 'distinct';
	domain = 'DOMAIN' | 'domain';
	double = 'DOUBLE' | 'double';
	drop = 'DROP' | 'drop';
	else = 'ELSE' | 'else';
	end = 'END' | 'end';
	end_exec = 'END-EXEC' | 'end-exec';
	escape = 'ESCAPE' | 'escape';
	except = 'EXCEPT' | 'except';
	exception = 'EXCEPTION' | 'exception';
	exec = 'EXEC' | 'exec';
	execute = 'EXECUTE' | 'execute';
	exists = 'EXISTS' | 'exists';
	external = 'EXTERNAL' | 'external';
	extract = 'EXTRACT' | 'extract';
	false = 'FALSE' | 'false';
	fetch = 'FETCH' | 'fetch';
	first = 'FIRST' | 'first';
	float = 'FLOAT' | 'float';
	for = 'FOR' | 'for';
	foreign = 'FOREIGN' | 'foreign';
	found = 'FOUND' | 'found';
	from = 'FROM' | 'from';
	full = 'FULL' | 'full';
	get = 'GET' | 'get';
	global = 'GLOBAL' | 'global';
	go = 'GO' | 'go';
	goto = 'GOTO' | 'goto';
	grant = 'GRANT' | 'grant';
	group = 'GROUP' | 'group';
	having = 'HAVING' | 'having';
	hour = 'HOUR' | 'hour';
	identity = 'IDENTITY' | 'identity';
	immediate = 'IMMEDIATE' | 'immediate';
	in = 'IN' | 'in';
	indicator = 'INDICATOR' | 'indicator';
	initially = 'INITIALLY' | 'initially';
	inner = 'INNER' | 'inner';
	input = 'INPUT' | 'input';
	insensitive = 'INSENSITIVE' | 'insensitive';
	insert = 'INSERT' | 'insert';
	int = 'INT' | 'int';
	integer = 'INTEGER' | 'integer';
	intersect = 'INTERSECT' | 'intersect';
	interval = 'INTERVAL' | 'interval';
	into = 'INTO' | 'into';
	is = 'IS' | 'is';
	isolation = 'ISOLATION' | 'isolation';
	join = 'JOIN' | 'join';
	key = 'KEY' | 'key';
	language = 'LANGUAGE' | 'language';
	last = 'LAST' | 'last';
	leading = 'LEADING' | 'leading';
	left = 'LEFT' | 'left';
	level = 'LEVEL' | 'level';
	like = 'LIKE' | 'like';
	local = 'LOCAL' | 'local';
	lower = 'LOWER' | 'lower';
	match = 'MATCH' | 'match';
	max = 'MAX' | 'max';
	min = 'MIN' | 'min';
	minute = 'MINUTE' | 'minute';
	module = 'MODULE' | 'module';
	month = 'MONTH' | 'month';
	names = 'NAMES' | 'names';
	national = 'NATIONAL' | 'national';
	natural = 'NATURAL' | 'natural';
	nchar = 'NCHAR' | 'nchar';
	next = 'NEXT' | 'next';
	no = 'NO' | 'no';
	not = 'NOT' | 'not';
	null = 'NULL' | 'null';
	nullif = 'NULLIF' | 'nullif';
	numeric = 'NUMERIC' | 'numeric';
	octet_length = 'OCTET_LENGTH' | 'octet_length';
	of = 'OF' | 'of';
	on = 'ON' | 'on';
	only = 'ONLY' | 'only';
	open = 'OPEN' | 'open';
	option = 'OPTION' | 'option';
	or = 'OR' | 'or';
	order = 'ORDER' | 'order';
	outer = 'OUTER' | 'outer';
	output = 'OUTPUT' | 'output';
	overlaps = 'OVERLAPS' | 'overlaps';
	pad = 'PAD' | 'pad';
	partial = 'PARTIAL' | 'partial';
	position = 'POSITION' | 'position';
	precision = 'PRECISION' | 'precision';
	prepare = 'PREPARE' | 'prepare';
	preserve = 'PRESERVE' | 'preserve';
	primary = 'PRIMARY' | 'primary';
	prior = 'PRIOR' | 'prior';
	privileges = 'PRIVILEGES' | 'privileges';
	procedure = 'PROCEDURE' | 'procedure';
	public = 'PUBLIC' | 'public';
	read = 'READ' | 'read';
	real = 'REAL' | 'real';
	references = 'REFERENCES' | 'references';
	relative = 'RELATIVE' | 'relative';
	restrict = 'RESTRICT' | 'restrict';
	revoke = 'REVOKE' | 'revoke';
	right = 'RIGHT' | 'right';
	rollback = 'ROLLBACK' | 'rollback';
	rows = 'ROWS' | 'rows';
	schema = 'SCHEMA' | 'schema';
	scroll = 'SCROLL' | 'scroll';
	second = 'SECOND' | 'second';
	section = 'SECTION' | 'section';
	select = 'SELECT' | 'select';
	session = 'SESSION' | 'session';
	session_user = ' SESSION_USER' | 'session_user';
	set = 'SET' | 'set';
	size = 'SIZE' | 'size';
	smallint = 'SMALLINT' | 'smallint';
	some = 'SOME' | 'some';
	space = 'SPACE' | 'space';
	sql = 'SQL' | 'sql';
	sqlcode = 'SQLCODE' | 'sqlcode';
	sqlerror = 'SQLERROR' | 'sqlerror';
	sqlstate = 'SQLSTATE' | 'sqlstate';
	substring = 'SUBSTRING' | 'substring';
	sum = 'SUM' | 'sum';
	system_user = 'SYSTEM_USER' | 'system_user';
	table = 'TABLE' | 'table';
	temporary = 'TEMPORARY' | 'temporary';
	then = 'THEN' | 'then';
	time = 'TIME' | 'time';
	timestamp = 'TIMESTAMP' | 'timestamp';
	timezone_hour = 'TIMEZINE_HOUR' | 'timezone_hour';
	timezone_minute = 'TIMEZONE_MINUTE' | 'timezone_minute';
	to = 'TO' | 'to';
	trailing = 'TRAILING' | 'trailing';
	transaction = 'TRANSACTION' | 'transaction';
	translate = 'TRANSLATE' | 'translate';
	translation = 'TRANSLATION' | 'translation';
	trim = 'TRIM' | 'trim';
	true = 'TRUE' | 'true';
	union = 'UNION' | 'union';
	unique = 'UNIQUE' | 'unique';
	unknown = 'UNKNOWN' | 'unknown';
	update = 'UPDATE' | 'update';
	upper = 'UPPER' | 'upper';
	usage = 'USAGE' | 'usage';
	user = 'USER' | 'user';
	using = 'USING' | 'using';
	value = 'VALUE' | 'value';
	values = 'VALUES' | 'values';
	varchar = 'VARCHAR' | 'varchar';
	varying = 'VARYING' | 'varying';
	view = 'VIEW' | 'view';
	when = 'WHEN' | 'when';
	whenever = 'WHENEVER' | 'whenever';
	where = 'WHERE' | 'where';
	with = 'WITH' | 'with';
	work = 'WORK' | 'work';
	write = 'WRITE' | 'write';
	year = 'YEAR' | 'year';
	zone = 'ZONE' | 'zone';

	/* semi-reserved key words */
	ada = 'ADA' | 'ada';
	c = 'C' | 'c';
	catalog_name = 'CATALOG_NAME' | 'catalog_name';
	character_set_catalog = 'CHARACTER_SET_CATALOG' |
'character_set_catalog';
	character_set_name = 'CHARACTER_SET_NAME' |
'character_set_name';
	character_set_schema = ' CHARACTER_SET_SCHEMA' |
'character_set_schema';
	class_origin = 'CLASS_ORIGIN' | 'class_origin';
	cobol = 'COBOL' | 'cobol';
	collation_catalog = 'COLLATION_CATALOG' | 'collation_catalog';
	collation_name = 'COLLATION_NAME' | 'collation_name';
	collation_schema = 'COLLATION_SCHEMA' | 'collation_schema';
	column_name = 'COLUMN_NAME' | 'column_name';
	command_function = 'COMMAND_FUNCTION' | 'command_function';
	committed = 'COMMITTED' | 'committed';
	condition_number = 'CONDITION_NUMBER' | 'condition_number';
	connection_name = 'CONNECTION_NAME' | 'connection_name';
	constraint_catalog = 'CONSTRAINT_CATALOG' |
'constraint_catalog';
	constraint_name = 'CONSTRAINT_NAME' | 'constraint_name';
	constraint_schema = ' CONSTRAINT_SCHEMA' | 'constraint_schema';
	cursor_name = 'CURSOR_NAME' | 'cursor_name';
	data = 'DATA' | 'data';
	datetime_interval_code = 'DATETIME_INTERVAL_CODE' |
'datetime_interval_code';
	datetime_interval_precision = ' DATETIME_INTERVAL_PRECISION' |
'datetime_interval_precision';
	dynamic_function = 'DYNAMIC_FUNCTION' | 'dynamic_function';
	fortran = 'FORTRAN' | 'FORTRAN';
	length = 'LENGTH' | 'length';
	message_length = 'MESSAGE_LENGTH' | 'message_length';
	message_octet_length = ' MESSAGE_OCTET_LENGTH' |
'message_octet_length';
	message_text = 'MESSAGE_TEXT' | 'message_text';
	more = 'MORE' | 'more';
	mumps = 'MUMPS' | 'mumps';
	name = 'NAME' | 'name';
	nullable = 'NULLABLE' | 'nullable';
	number = 'NUMBER' | 'number';
	pascal = 'PASCAL' | 'pascal';
	pli = 'PLI' | 'pli';
	repeatable = 'REPEATABLE' | 'repeatable';
	returned_length = 'RETURNED_LENGTH' | 'returned_length';
	returned_octet_length = ' RETURNED_OCTET_LENGTH' |
'returned_octet_length';
	returned_sqlstate = ' RETURNED_SQLSTATE' | 'returned_sqlstate';
	row_count = 'ROW_COUNT' | 'row_count';
	scale = 'SCALE' | 'scale';
	schema_name = 'SCHEMA_NAME' | 'schema_name';
	serializable = 'SERIALIZABLE' | 'serializable';
	server_name = 'SERVER_NAME' | 'server_name';
	subclass_origin = 'SUBCLASS_ORIGIN' | 'subclass_origin';
	table_name = 'TABLE_NAME' | 'table_name';
	type = 'TYPE' | 'type';
	uncommitted = 'UNCOMMITTED' | 'uncommitted';
	unnamed = 'UNNAMED' | 'unnamed';

	/* a literal of type unsigned numeric, national character string
	   or bit string (inc hexademical string) */
         bit_string_literal_both_rep = binary_literal | hex_literal;
         exact_numeric_literal = unsigned_numeric | signed_numeric;
         approx_numeric_literal = (unsigned_numeric | signed_numeric) 'e'
('-')? digit+;

	/* a regular identifier */
	identifier = ( ucase | lcase ) ( ucase | lcase | digit | '_')*;

	integer_def = digit+;
	bit_string_literal_bit = binary_literal;



Ignored Tokens

	blanks,
	comments;



Productions

	sql_program = sql_statements+;

	sql_statements =
		     sql_statement semi_colon;

	sql_statement =
	{schema_st}		schema_st |
	{data_st}		data_st |
	{transaction_st}	transaction_st |
	{connection_st}		connection_st |
	{session_st}		session_st |
	{diagnostics_st}	diagnostics_st |
	{exception_st}		exception_st |
	{dynamic_st} 		dynamic_st ;

	schema_st =
	{create_schema}		schema_def |
	{drop_schema}		schema_drop |
	{create_domain}		domain_def |
	{alter_domain}		domain_alteration |
	{drop_domain}		domain_drop |
	{create_table}		base_table_def |
	{alter_table}		base_table_alteration |
	{drop_table}		base_table_drop |
	{create_view}		view_def |
	{drop_view}		view_drop |
	{create_character_set}	character_set_def |
	{drop_character_set}	character_set_drop |
	{create_collation}	collation_def |
	{drop_collation}	collation_drop |
	{create_translation}	translation_def |
	{drop_translation}	translation_drop |
	{create_assertion}	general_constraint_def |
	{drop_assertion}	general_constraint_drop |
	{grant_authorization}	authorization_def |
	{revoke_authorization}	authorization_drop;

	data_st =
	{declare_cursor}		cursor_def |
	{declare_local_temp_table}	temporary_table_def |
	{open_cursor}			open_cursor |
	{close_cursor}			close_cursor |
	{fetch_cursor}			fetch_cursor |
	{positioned_update}		positioned_update |
	{positioned_delete}		positioned_delete |
	{select_single_row}		single_row_select |
	{select_general}		select_exp |
	{insert}			insert_stat |
	{searched_update}		searched_update |
	{searched_delete}		searched_delete;

	transaction_st =
	{set_transaction}	set_transaction |
	{set_constraints}	set_constraints |
	{commit}		commit_statement |
	{rollback}		rollback_statement;

	connection_st =
	{connect}    		connect_statement |
	{disconnect}		disconnect_statement |
         {set_connection}	set_connection ;

	session_st =
	{set_session_authorization}	set_authorization |
	{set_catalog}			set_catalog |
	{set_schema}			set_schema |
	{set_time_zone}			set_time_zone |
	{set_names}			set_names ;

	diagnostics_st =
  	{get_diagnostics}	get_diagnostics;

	exception_st =
	{whenever_stat}		whenever_stat;

	dynamic_st =
	{execute_immediate}	execute_immediate |
	{execute_general}	execute_stat |
	{prepare}		prepare_stat |
	{describe_input}	describe_input |
	{dyn_positioned_update}	dynamic_positioned_update |
	{dyn_positioned_delete}	dynamic_positioned_delete |
	{deallocate_prepare}	deallocate_prepare |
	{allocate_cursor}	allocate_cursor |
	{define_dyn_cursor}	dynamic_cursor_def |
	{open_dyn_cursor}	dynamic_open |
	{close_dyn_cursor}	dynamic_close |
	{fetch_dyn_cursor}	dynamic_fetch |
	{allocate_descriptor}	allocate_descriptor |
	{set_descriptor}	set_descriptor |
	{get_descriptor}	get_descriptor |
	{deallocate_descriptor} deallocate_descriptor |
	{define_module}		module_def |
	{define_procedure}	procedure_def;


	/* sessions, connections and transactions */

	connect_statement =
			connect to connect_db;

	connect_db =
	{default}	default |
	{named_db}	lit_param_or_var as_clause? user_clause? ;

	as_clause =
			as lit_param_or_var;

	user_clause =
			user lit_param_or_var;

	set_connection =
			set connection connected_db_name;

	connected_db_name =
	{default}	default |
	{names_db}	lit_param_or_var;

	disconnect_statement =
			disconnect disconnect_db;

	disconnect_db =
	{default}	default |
	{current}	current |
	{all}		all |
	{named_db}	lit_param_or_var;

	set_catalog =
			set catalog resource_name_def;

	set_schema =
			set schema resource_name_def;

	set_names =
			set names resource_name_def;

	set_authorization =
			set session authorization resource_name_def;

	resource_name_def =
	{named}	 	 lit_param_or_var |
	{system_defined} authid_function_ref;

	set_time_zone =
			set time zone timezone_name;

	timezone_name =
	{interval_exp}	interval_exp |
	{local}		local ;

	commit_statement =
			commit work?;

	rollback_statement =
			rollback work?;

	set_transaction =
			set transaction trans_option_commalist;

	trans_option_commalist =
			trans_option next_trans_option*;

	next_trans_option  =
			comma trans_option;

	trans_option =
	{diagnostics}  diagnostics size integer_def |
	{read}	       read_type |
	{isolation}    isolation level isolation_type ;

	read_type =
	{read_only}  	read only |
	{read_write} 	read write;

	isolation_type =
	{read_uncommitted}	read uncommitted |
	{read_committed}	read committed |
	{repeatable_read}	repeatable read |
	{serializable}		serializable;

	/* data definition */

	schema_def =
			 create schema schema_name_def? auth_user?
schema_character_set? schema_element_list?;

	auth_user =
			authorization user_name_def;

	user_name_def =
	{system_ref}	authid_function_ref |
	{actual_name}	identifier;

         schema_character_set =
			default character set character_set;

	schema_element_list =
	 		schema_element+;

	schema_element =
	{domain}	 domain_def |
	{base_table}	 base_table_def |
	{view}		 view_def |
	{authorization}	 authorization_def |
	{gen_constr}	 general_constraint_def |
	{char_set}	 character_set_def |
	{collation}	 collation_def |
	{translation}	 translation_def;

	domain_def =
			 create domain domain_name_def as? data_type
default_def? domain_constraint_def?;

	data_type =
	{smallint}	smallint |
	{integer}	integer |
	{decimal}	decimal openbr integer_def decimal_scale?
closebr |
	{real}		real |
	{double}	double |
	{size}		size |
	{char}		char char_quantifier? |
	{varchar}	varchar openbr integer_def closebr |
	{date}		date |
	{time}		time |
	{timestamp}	timestamp;

	decimal_scale =
		comma integer_def;

	char_quantifier =
		openbr integer_def closebr;

	default_def =
			 default def_choices;

	def_choices =
	{literal}	literal |
	{niladic_func}	niladic_function_ref |
	{null}		null;

	base_table_def =
			 create table_decl? table base_table openbr
base_table_element_commalist closebr commit_action?;

	table_decl =
			table_scope temporary;

	table_scope =
	{global}	global |
	{local}		local;

	commit_action =
			on commit create_commit_act rows;

	create_commit_act =
	{delete}	delete |
	{preserve}	preserve;

	base_table_element_commalist =
			 base_table_element more_base_table_element*;

	more_base_table_element =
			comma base_table_element;

	base_table_element =
	{column}		 column_def |
	{base_table_constr}	 base_table_constraint_def;

	column_def =
			 column_name_def column_type default_def?
column_constraint_def_list?;

	column_type =
	{data_type}	data_type |
	{domain}	domain_name_def;

	column_constraint_def_list =
			 column_constraint_def+;

	view_def =
			 create view view_name_def
bracketed_comma_column_list? as table_exp view_opts?;

	bracketed_comma_column_list =
			openbr column_commalist closebr;

	column_commalist =
			column_name_def more_columns*;

         more_columns =
			comma column_name_def;

	column_name_def  =
			 table_name_qualifer? identifier;

	table_name_qualifer =
			table_or_view_def dot;

	view_opts =
			 with cascading_opt? check option;

	cascading_opt =
	{cascaded}	cascaded |
	{local}		local;

	authorization_def =
			 grant priv_list on accessible_object to
grantee_commalist grant_opt?;

	priv_list =
	{privileges}	 privilege_commalist |
	{all}		 all privileges ;

	privilege_commalist =
			privilege more_privilege*;

	more_privilege =
			comma privilege;

	grantee_commalist =
			grantee more_grantee*;

	more_grantee =
			comma grantee;

	grant_opt =
			with grant option;

	general_constraint_def =
			 create assertion constraint_name_def check
openbr cond_exp closebr deferrability?;

	deferrability =
			 initially deferrability_opts not? deferrable;

	deferrability_opts =
	{deferred}	deferred |
	{immediate}	immediate;

	privilege =
	{select}	 select |
	{insert}	 insert bracketed_comma_column_list? |
	{update}	 update bracketed_comma_column_list? |
	{delete}	 delete |
	{references}	 references bracketed_comma_column_list? |
	{usage}		 usage;

	accessible_object =
	{domain}	 domain domain_name_def |
	{table}		 table? table_or_view_def |
	{char_set}	 character set character_set |
	{collation}	 collation collation_name_def |
	{translation}	 translation translation_name_def;

	grantee =
	{user}		 user_name_def |
	{public}	 public;

	character_set_def =
			 create character set [c1]:character_set as? get
[c2]:character_set collate_opts?;

	collate_opts =
	{collate}		collate collation_name_def |
	{collation_source}	collation from collation_source;

	collation_source =
	{external}	 external openbr [s1]:single_quote
collation_name_def [s2]:single_quote closebr |
	{collation}	 collation_name_def |
	{desc_collation} desc openbr collation_name_def closebr |
	{default}	 default |
	{translation}	 translation translation_name_def
translation_collation_opts?;

	translation_collation_opts =
			then collation collation_name_def;

	collation_def =
			 create collation collation_name_def for
character_set from collation_source;

	translation_def =
			 create translation translation_name_def for
[c1]:character_set
			 to [c2]:character_set from translation_source;

	translation_source =
	{external}	 external openbr [s1]:single_quote
translation_name_def [s2]:single_quote closebr |
	{identity}	 identity |
	{translation}	 translation_name_def;

	domain_alteration =
			 alter domain domain_name_def
domain_alteration_action;

	domain_alteration_action =
	{default}	 domain_default_alteration_action |
	{constraint}	 domain_constraint_alteration_action;

	domain_default_alteration_action =
	{set}		 set default_def |
	{drop}		 drop default;

	domain_constraint_alteration_action =
	{add}		 add domain_constraint_def |
	{drop}		 drop constr_def;

	base_table_alteration =
			 alter table base_table
base_table_alteration_action;

	base_table_alteration_action =
	{column}	 column_alteration_action |
	{base_table}	 base_table_constraint_alteration_action;

	column_alteration_action =
	{add}		 add column? column_def |
	{alter}		 alter column? column_name_def alter_def_action
|
	{drop}		 drop column? column_name_def drop_opts ;

	alter_def_action =
	{set}		set default_def |
	{drop}		drop default;

	drop_opts =
	{restrict}	restrict |
	{cascade}	cascade;

	base_table_constraint_alteration_action =
	{add}		 add base_table_constraint_def |
	{drop}		 drop constr_def drop_opts;

	schema_drop =
			 drop schema schema_name_def drop_opts;

	domain_drop =
			 drop domain domain_name_def drop_opts;

	base_table_drop =
			 drop table base_table drop_opts;

	view_drop =
			 drop view view_name_def drop_opts;

	authorization_drop =
			 revoke auth_grant_opt? privilege_commalist on
accessible_object
			 from grantee_commalist drop_opts;

	auth_grant_opt =
			grant option for;

	general_constraint_drop =
			 drop assertion constraint_name_def;

	character_set_drop =
			 drop character set character_set;

	collation_drop =
			 drop collation collation_name_def;

	translation_drop =
			 drop translation translation_name_def;


	/* modules */

	module_def =
			module module_name_def? names_opt? language
language_opts module_schema_opts? auth_user?
			temporary_table_def_list? module_element_list;

	names_opt =
			names are character_set;

	language_opts =
	{ada}		ada |
	{c}		c |
	{cobol}		cobol |
	{fortran}	fortran |
	{mumps}		mumps |
	{pascal}	pascal |
	{pli}		pli;

	module_schema_opts =
			schema schema_name_def;

	temporary_table_def_list =
			temporary_table_def+;

	module_element_list =
			module_element+;

	temporary_table_def =
			declare local temporary table module dot
base_table
			openbr base_table_element_commalist closebr
commit_action?;

	module_element =
	{cursor}	 cursor_def |
	{dynamic_cursor} dynamic_cursor_def |
	{procedure}	 procedure_def;

	procedure_def =
			procedure procedure_name_def procedure_params
[sc1]:semi_colon
			sql_statement [sc2]:semi_colon;

	procedure_params =
	{param_def_list}	parameter_def_list |
	{comma_param_def_list}	openbr parameter_def_commalist closebr;

	parameter_def_list =
			parameter_def+;

	parameter_def_commalist =
			parameter_def more_parameter_def*;

	more_parameter_def =
			comma parameter_def;

	parameter_def =
	{param_data_type} parameter_name_def data_type |
	{sqlcode}	  sqlcode |
	{sqlstate}	  sqlstate;

	parameter_name_def =
			colon identifier param_data_type;

	param_data_type =
	{char}		character openbr integer_def closebr |
	{varchar}	character varying openbr integer_def closebr|
	{bit}		bit openbr integer_def closebr|
	{bitvar}	bit varying openbr integer_def closebr|
	{decimal}	decimal openbr integer_def closebr|
	{integer}	integer |
	{smallint}	smallint |
	{float}		float openbr integer_def closebr;

	/* data manipulation */

	single_row_select =
			select sel_opts? select_item_commalist
			into target_commalist from table_ref_commalist
			where_clause? group_by_clause? having_clause?;

	sel_opts =
	{all}		all |
	{distinct}	distinct;

	where_clause =
			where cond_exp;

	group_by_clause =
			group by column_ref_commalist;

	having_clause =
			having cond_exp;

	target_commalist =
			target more_target*;

	more_target =
			comma target;

	table_ref_commalist =
			table_ref more_table_ref*;

	more_table_ref =
			comma table_ref;

	column_ref_commalist =
			column_ref more_column_ref*;

	more_column_ref =
			comma column_ref;

	insert_stat =
			insert into table_or_view_def insert_values;

         insert_values =
	{columns}	bracketed_comma_column_list? table_exp |
	{default}	default values;

	searched_update =
			update table_or_view_def set
update_assignment_commalist where_clause?;

	update_assignment_commalist =
			update_assignment more_update_assignment*;

	more_update_assignment =
			comma update_assignment;

	update_assignment	=
			column_name_def eq update_value;

	update_value =
	{scalar_exp}	scalar_exp |
	{default}	default |
	{null}		null;

	searched_delete =
			delete from table_or_view_def where_clause? ;

	cursor_def =
			declare cursor_name_def insensitive? scroll?
cursor for table_exp
			order_by_clause? for_clause?;

         order_by_clause =
			order by order_item_commalist;

	order_item_commalist =
			order_item more_order_item*;

	more_order_item =
		comma order_item;

	order_item =
			o_item o_order?;

	o_item =
	{column_name}	column_name_def |
	{integer}	integer_def;

	o_order =
	{ascending}	asc |
	{descending}	desc;

	for_clause =
			for for_purpose_list ;

	for_purpose_list =
	{read_only}	read only |
	{update}	update for_upd_cols?;

	for_upd_cols =
			of column_commalist;

	open_cursor =
			open cursor_name_def;

	fetch_cursor =
			fetch opt_fetch_selector_clause? cursor_name_def
into target_commalist;

	opt_fetch_selector_clause =
			row_selector? from;

	row_selector =
	{next}		next |
	{prior}		prior |
	{first}		first |
	{last}		last |
	{absolute}	absolute number_def |
	{relative}	relative number_def;

	positioned_update =
			update table_or_view_def
			set update_assignment_commalist
			where current of cursor_name_def;

	positioned_delete =
			delete from table_or_view_def
			where current of cursor_name_def;

	close_cursor =
			close cursor_name_def;



	/* table expressions */

	table_exp =
	{join}		join_table_exp |
	{nonjoin}	nonjoin_table_exp;

	join_table_exp =
	{cross_join}	[t1]:table_ref cross join [t2]:table_ref |
	{natural_join}	[t1]:table_ref natural? join_type? join
[t2]:table_ref join_cond? |
	{compound}	openbr join_table_exp closebr;

	join_cond =
	{condition}	on cond_exp |
	{column}	using bracketed_comma_column_list;

	table_ref =
	{join_table_exp}  	join_table_exp |
	{base_table_range}	table_or_view_def as_option? |
	{table_exp_range} 	openbr table_exp closebr as_option;

	as_option =
		as? range_variable bracketed_comma_column_list?;

	join_type =
	{inner}		inner |
	{left}		left outer? |
	{right}		right outer? |
	{full}		full outer? |
	{union}		union;

	nonjoin_table_exp =
	{nonjoin_table_term}	nonjoin_table_term |
	{union_exc_table_exp} 	table_exp union_exc_opts all?
corresponding_by_clause? table_term;

	union_exc_opts =
	{union}		union |
	{except}	except;

	corresponding_by_clause =
			corresponding optional_by?;

	optional_by =
		by bracketed_comma_column_list;

	nonjoin_table_term =
	{basic_nonjoin_table}  nonjoin_table_primary |
	{table_intersect_term} table_term intersect all?
corresponding_by_clause? table_primary;

	table_term =
	{join_table_exp}     join_table_exp |
	{nonjoin_table_term} nonjoin_table_term;

	table_primary =
	{join_table}	join_table_exp |
	{nonjoin_table}	nonjoin_table_primary;

	nonjoin_table_primary =
	{nonjoin_table_exp} openbr nonjoin_table_exp closebr |
	{select}	    select_exp |
	{table}		    table table_or_view_def |
	{table_constructor} table_constructor;

	table_constructor =
			values row_constructor_commalist;

	row_constructor_commalist =
			row_constructor more_row_constructor*;

	more_row_constructor =
			comma row_constructor;

	row_constructor =
	{scalar}	scalar_exp |
	{scalar_list}	openbr scalar_exp_commalist closebr |
	{table_exp}	openbr table_exp closebr;

	scalar_exp_commalist =
			scalar_exp more_scalar_exp*;

	more_scalar_exp =
			comma scalar_exp;

	select_exp =
			select sel_opts? select_item_commalist from
table_ref_commalist
			where_clause? group_by_clause? having_clause?;

	select_item_commalist =
			select_item more_select_item*;

	more_select_item =
	                comma select_item;

	select_item =
	{scalar}	scalar_exp select_as_opt? |
	{all}		range_qualifier? star ;

	select_as_opt =
			as? column_ref;

	range_qualifier =
			range_variable dot;


	/* Condiitonal Expressions */

	cond_exp =
	{simple}	cond_term |
	{compound}	compound_exp;

	compound_exp =
			cond_exp or cond_term;

	cond_term =
	{simple}	cond_factor |
	{compound}	compound_term;

	compound_term =
			cond_term and cond_factor;

	cond_factor =
			not? cond_test;

	cond_test =
			cond_primary is_test? ;

	is_test =
			is not? is_test_values;

	is_test_values =
	{true}		true |
	{false}		false |
	{unknown}	unknown;

	cond_primary =
	{simple}	simple_cond |
	{coumpound}	openbr cond_exp closebr;

	simple_cond =
	{comparison}	comparison_cond |
	{between}	between_cond |
	{like}		like_cond |
	{in}		in_cond |
	{match}		match_cond |
	{all_or_any}	all_or_any_cond |
	{exists}	exists_cond |
	{unique}	unique_cond |
	{overlaps}	overlaps_cond |
	{test_for_null}	test_for_null;

	comparison_cond =
			[r1]:row_constructor comparison_operator
[r2]:row_constructor;

	comparison_operator =
	{equals}	  eq |
	{less_than}	  lt |
	{less_than_or_eq} lteq |
	{gr_than}	  gt |
	{gr_than_or_eq}	  gteq |
	{not_equal_to}    neq;

	between_cond =
			[r1]:row_constructor not? between
[r2]:row_constructor and [r3]:row_constructor;

	like_cond =
			[c1]:character_string_exp not? like
[c2]:character_string_exp escape_opt?;

	escape_opt =
			escape character_string_exp;

	in_cond =
	{row}		row_constructor not? in openbr table_exp closebr
|
	{scalar}	scalar_exp not? in openbr scalar_exp_commalist
closebr;

	match_cond =
			row_constructor match unique? match_cond_opt?
openbr table_exp closebr;

	match_cond_opt =
	{partial}	partial |
	{full}		full;

	all_or_any_cond =
			row_constructor comparison_operator
all_or_any_opts openbr table_exp closebr;

	all_or_any_opts =
	{all}		all |
	{any}		any |
	{some}		some ;

	exists_cond =
			exists openbr table_exp closebr;

	unique_cond =
			unique openbr table_exp closebr;

	overlaps_cond =
			[o1]:openbr [s1]:scalar_exp [c1]:comma
[s2]:scalar_exp [cb1]:closebr overlaps
			[o2]:openbr [s3]:scalar_exp [c2]:comma
[s4]:scalar_exp [cb2]:closebr;

	test_for_null =
			row_constructor is not? null;



	/* constraints */

	domain_constraint_def =
			constr_def? check openbr cond_exp closebr
deferrability?;

	constr_def =
	 		constraint constraint_name_def;

	base_table_constraint_def =
	{cand_key}	constr_def? candidate_key_def  deferrability? |
	{for_key}	constr_def? foreign_key_def  deferrability? |
	{check_constr}	constr_def? check_constraint_def  deferrability?
;

	candidate_key_def =
			key_opts  bracketed_comma_column_list;

	key_opts =
	{primary}	primary key |
	{unique}	unique;

	foreign_key_def =
			foreign key bracketed_comma_column_list
references_def;

	references_def =
			references base_table
bracketed_comma_column_list?
				match_opt? on_delete_opt?
on_update_opt?;

	match_opt =
			 match match_choices;

	match_choices =
	{full}		full |
	{partial}	partial;

	on_delete_opt =
			on delete referential_action;

	on_update_opt =
			on update referential_action;

	referential_action =
	{no_action}	no action |
	{cascade}	cascade |
	{set_default}	set default |
	{set_null}	set null;

	check_constraint_def =
			check openbr cond_exp closebr;

	column_constraint_def =
	{not_null}	constr_def? not null deferrability? |
	{prim_key}	constr_def? key_opts? deferrability? |
	{references}	constr_def? references_def deferrability? |
	{cond_exp}	constr_def? check openbr cond_exp closebr
deferrability?;

	set_constraints =
			set constraints set_constr_list set_constr_opts
;

	set_constr_list =
	{constraint_list}	constraint_commalist |
	{all}			all;

	set_constr_opts =
	{deferred}	deferred |
	{immediate}	immediate;

	constraint_commalist =
			constraint_name_def more_constraint_name_def*;

	more_constraint_name_def =
			comma constraint_name_def;

	/* dynamic sql */

	execute_immediate =
			execute immediate param_or_var;

	prepare_stat =
			prepare prepared from param_or_var;

	prepared =
	{prepped_stat}	prepped_statement_container |
	{param_or_var}	param_or_var;

	prepped_statement_container =
	{parameter}	parameter_def |
	{host_variable}	host_variable;

	deallocate_prepare =
			deallocate prepare prepared;

	execute_stat =
			execute prepared places_opt? args_opt?;

	places_opt =
			into places;

	args_opt =
			using arguments;

	places =
	{target_list}	 target_commalist |
	{sql_descriptor} sql descriptor descriptor_name;

	arguments =
	{target_list}	 target_commalist |
	{sql_descriptor} sql descriptor descriptor_name;

	descriptor_name =
			lit_param_or_var;

	allocate_descriptor =
			allocate descriptor descriptor_name
max_desc_opt?;

	max_desc_opt =
		 	with max lit_param_or_var;

	deallocate_descriptor =
			deallocate descriptor descriptor_name;

	describe_input =
			describe input prepared using sql descriptor
descriptor_name;

	get_descriptor =
	{simple}	get descriptor descriptor_name target eq count |
	{compound}	get descriptor descriptor_name value number_def
get_assignment_commalist;

	get_assignment_commalist =
			get_assignment more_get_assignment*;

	more_get_assignment =
			comma get_assignment;

	get_assignment =
			target eq item_descriptor_component;

	item_descriptor_component =
	{name}			name |
	{unnamed}		unnamed |
	{type}			type |
	{length}		length |
	{returned_length}	returned_length |
	{returned_octet_length} returned_octet_length |
	{precision}		precision |
	{scale}			scale |
	{data}			data |
	{indicator}		indicator ;

	set_descriptor =
	{simple}	set descriptor descriptor_name count eq
lit_param_or_var |
	{compound}	set descriptor descriptor_name value number_def
set_assignment_commalist;

	set_assignment_commalist =
			set_assignment more_set_assignment*;

         more_set_assignment =
			comma set_assignment;

	set_assignment =
			item_descriptor_component eq lit_param_or_var;

	dynamic_cursor_def =
			declare [c1]:cursor_name_def insensitive?
scroll? [c2]:cursor_name_def for prepared;

	allocate_cursor =
			allocate param_or_var insensitive? scroll?
cursor_name_def for prepared;

	dynamic_open =
			open dynamic_cursor args_opt?;

	dynamic_cursor =
	{cursor}	cursor_name_def |
	{param_or_var}	param_or_var;

	dynamic_close =
			close dynamic_cursor;

	dynamic_fetch =
			fetch opt_fetch_selector_clause? dynamic_cursor
into places;


	dynamic_positioned_delete =
			delete from_table_opt? where current of
dynamic_cursor;

	from_table_opt =
			from table_or_view_def;

	dynamic_positioned_update =
			update table_or_view_def? set
update_assignment_commalist where current of dynamic_cursor;



	/* scalar expressions */

	scalar_exp =
	{numeric}	numeric_exp |
	{char_string}	character_string_exp |
	{bit_string}	bit_string_exp |
	{datetime}	datetime_exp |
	{interval}	interval_exp;

	numeric_exp =
	{simple}	numeric_term |
	{compound}	comp_numeric_exp;

	comp_numeric_exp =
			numeric_exp additive_ops numeric_term;

	additive_ops =
	{plus} 		plus |
	{minus}		dash;

	numeric_term =
	{simple}	numeric_factor |
	{compound}	comp_numeric_term;

	comp_numeric_term =
			numeric_term multiplicative_ops numeric_factor;

	multiplicative_ops =
	{multiply}	star |
	{divide}	slash;

	numeric_factor =
			additive_ops? numeric_primary;

	numeric_primary =
	{column}	column_ref |
	{param_or_var}	lit_param_or_var |
	{scalar_func}	scalar_function_ref |
	{agg_func}	aggregate_function_ref |
	{table_exp}	openbr table_exp closebr |
	{numeric_exp}	openbr numeric_exp closebr;

	scalar_function_ref =
	{bit_length}		bit_length openbr bit_length_arg closebr
|
	{case_stat}		case case_when_clause else scalar_exp
end |
	{cast_stat}		cast scalar_exp as new_cast_type |
	{ch_length}		ch_length_stat |
	{collate_stat}		character_string_literal collate
collation_name_def |
	{convert_stat}		convert openbr character_string_exp
using conversion |
	{current_date}		current_date |
	{current_time}		current_time |
	{current_timestamp}	current_timestamp |
	{current_user}		current_user |
	{extract_stat}		extract openbr extract_field from
extract_scalar_exp closebr |
	{low_up}		string_case_convert_stat |
	{octet_length}		octet_length openbr
character_string_literal closebr |
	{position}		position openbr
[s2]:character_string_literal in [s1]:character_string_literal closebr |
	{session_user}		session_user |
	{substring}		substring openbr char_or_bit_string_exp
from [no_from]:numeric_exp
				to [no_to]:numeric_exp closebr |
	{system_user}		system_user |
	{translate_stat}	translate openbr character_string_exp
using translation_name_def |
	{trim_stat}		trim openbr ltb_pad from
character_string_exp |
	{user}			user;

	bit_length_arg =
	{charstring}	character_string_literal |
	{bitstring}	bit_string_literal_bit;

	case_when_clause =
			when cond_exp then scalar_exp;

	new_cast_type =
	{sql_data_type}		data_type |
	{domain_tyep}		domain_name_def;

	ch_length_stat =
	{character_length}	character_length openbr
character_string_literal closebr |
	{char_length}		char_length openbr
character_string_literal closebr ;

	string_case_convert_stat =
	{lower}		lower openbr character_string_literal closebr |
	{upper}		upper openbr character_string_literal closebr;

	extract_field =
	{year}		year |
	{month}		month |
	{day}		day |
	{hour}		hour |
	{minute}	minute |
	{second}	second |
	{timezone_hour}	timezone_hour |
	{timezone_min}	timezone_minute;

	extract_scalar_exp =
	{datetime}	datetime_exp |
	{interval}	interval_exp;

	char_or_bit_string_exp =
	{char_exp}	character_string_exp |
	{bit_exp}	bit_string_exp;

	ltb_pad =
	{leading}	leading |
	{trailing}	trailing |
	{both}		both;

	aggregate_function_ref =
	{count}		count openbr star closebr |
	{other}		agg_funcs? openbr sel_opts scalar_exp closebr;

	agg_funcs =
	{avg}		avg |
	{max}		max |
	{min}		min |
	{sum}		sum |
	{count}		count;

	character_string_exp =
	{compound}	character_string_concatenation |
	{simple}	character_string_primary;

	character_string_concatenation =
			character_string_exp concat
character_string_primary;

	character_string_primary =
	{column}	column_ref |
	{param_or_var}	lit_param_or_var |
	{authid}	authid_function_ref |
	{scalar_func}	scalar_function_ref |
	{agg_func}	aggregate_function_ref |
	{table_exp}	openbr table_exp closebr |
	{char_str_exp}	openbr character_string_exp closebr ;

	bit_string_exp =
	{coumpound}	bit_string_concatenation |
	{simple}	bit_string_primary;

	bit_string_concatenation =
			bit_string_exp concat bit_string_primary;

	bit_string_primary =
	{column}	column_ref |
	{param_or_var}	lit_param_or_var |
	{scalar_func}	scalar_function_ref |
	{agg_func}	aggregate_function_ref |
	{table_exp}	openbr table_exp closebr |
	{bit_str_exp}	openbr bit_string_exp closebr ;

	datetime_exp =
	{datetime_term}	  datetime_term |
	{simple_inter}	  interval_exp plus datetime_term |
	{coumpound_inter} compound_datetime_exp;

	compound_datetime_exp = datetime_exp additive_ops interval_term;

	datetime_term =
			datetime_primary datetime_opt?;

	datetime_opt =
			at datetime_position;

	datetime_position =
	{local}		local |
	{time_zone}	time zone interval_primary;

	datetime_primary =
	{column}	column_ref |
	{param_or_var}	lit_param_or_var |
	{datetime_func}	datetime_function_ref |
	{scalar_func}	scalar_function_ref |
	{agg_func}	aggregate_function_ref |
	{table_exp}	openbr table_exp closebr |
	{datetime_exp}	openbr datetime_exp closebr ;

	interval_exp =
	{simple}	interval_term |
	{coumpound}	comp_interval_exp |
	{date_time}	openbr datetime_exp dash datetime_term closebr
interval_start_end;

	comp_interval_exp =
			interval_exp additive_ops interval_term;

	interval_start_end =
			datetime_interval date_time_end?;

	date_time_end =
			to datetime_interval;

	datetime_interval =
	{d}		day_int |
	{dh}		day_int hour_int |
	{dhm}		day_int hour_int colon min_int |
	{dhms}		day_int hour_int [c1]:colon min_int [c2]:colon
sec_int |
	{dhmsn}		day_int hour_int [c1]:colon min_int [c2]:colon
sec_int nano_opt? ;

	nano_opt =
			dot nano_int;

	interval_term =
	{simple}		interval_factor |
	{compound}		comp_interval_term |
	{comp_int_num_term}	numeric_term star interval_factor;

	comp_interval_term =
			interval_term multiplicative_ops numeric_factor;

	interval_factor =
			additive_ops? interval_primary
interval_start_end?;

	interval_primary =
	{column}	column_ref |
	{param_or_var}	lit_param_or_var |
	{scalar_func}	scalar_function_ref |
	{agg_func}	aggregate_function_ref |
	{table_exp}	openbr table_exp closebr |
	{char_string}	openbr interval_exp closebr ;



	/* get diagnostics */
	get_diagnostics =
	{simple}	get diagnostics diagnostics_one_assignment
more_diagnostics_one_assignment* |
	{compound}	get diagnostics exception exception_name_def
diagnostics_two_assignment
			  more_diagnostics_two_assignment*;

	more_diagnostics_one_assignment =
			comma diagnostics_one_assignment;

	diagnostics_one_assignment =
			target eq diags_one_source;

	diags_one_source =
	{number}	number |
	{more}		more |
	{command_func}	command_function |
	{dynamic_func}	dynamic_function |
	{row_count}	row_count;

	exception_name_def =
	{literal}	literal |
	{parameter}	parameter_def |
	{host_variable}	host_variable;

	more_diagnostics_two_assignment =
			comma diagnostics_two_assignment;

	diagnostics_two_assignment =
			target eq diags_two_source;

	diags_two_source =
	{condition_number}	condition_number |
	{returned_sqlstate}	returned_sqlstate |
	{class_origin}		class_origin |
	{subclass_origin}	subclass_origin |
	{server_name}		server_name |
	{connection_name}	connection_name |
	{constraint_catalog}	constraint_catalog |
	{constraint_schema}	constraint_schema |
	{constraint_name}	constraint_name |
	{catalog_name}		catalog_name |
	{schema_name}		schema_name |
	{table_name}		table_name |
	{column_name}		column_name |
	{cursor_name}		cursor_name |
	{message_text}		message_text |
	{message_length}	message_length |
	{message_octet_length} 	message_octet_length;


	/* Exceptions */

	whenever_stat =
		exec sql whenever when_cond when_action when_terminator;

	when_cond =
	{sqlerror}	sqlerror |
	{not_found}	not found;

	when_action =
	{continue}	continue |
	{goto}		go to sql_statement;

	when_terminator =
	{ada_c_pascal_pli}	semi_colon |
	{cobol}			end_exec |
	{mumps}			closebr;


	/* base definitions */

	schema_name_def =
			catalog_prefix? identifier;

	catalog_prefix =
			 catalog_def dot;

	catalog_def =
			identifier;

	schema_qualifier =
			schema_name_def dot;

	domain_name_def =
			schema_qualifier? identifier;

	base_table =
			schema_qualifier? identifier;

	view_name_def =
			schema_qualifier? identifier;

	table_or_view_def =
	{table}		base_table |
	{view}		view_name_def;

	module_name_def =
			identifier;

	procedure_name_def =
			identifier;

	cursor_name_def =
			identifier;

	constraint_name_def =
			schema_qualifier? identifier;

	character_set =
			schema_qualifier? identifier;

	collation_name_def =
			schema_qualifier? identifier;

	translation_name_def =
			schema_qualifier? identifier;

	conversion =
			schema_qualifier? identifier;

	column_ref =
			column_prefix? identifier;

	column_prefix =
			column_qualifier dot;

	column_qualifier =
	{table}		base_table |
	{range_var}	range_variable;

	param_or_var =
	{parameter}	parameter_def more_parameter? |
	{variable}	host_variable more_host_variable?;

	more_parameter = indicator? parameter_def ;

	more_host_variable = indicator? host_variable;

	/* place holder . unsure of this */ range_variable = identifier;

	host_variable =
			colon star? identifier;

	lit_param_or_var =
	{literal}	literal |
	{param_or_var}	param_or_var;

	target =
			param_or_var;

	number_def =
			lit_param_or_var;

	niladic_function_ref =
	{authid}	authid_function_ref |
	{datetime}	datetime_function_ref;

	authid_function_ref =
	{user}		user_name_def |
	{cur_user}	current_user |
	{sess_user}	session_user |
	{sys_user}	system_user;

	datetime_function_ref =
	{cur_date}	current_date |
	{cur_time}	current_time cur_time? |
	{cur_timestamp}	current_timestamp cur_time_stamp?;

	cur_time =
			openbr time_int closebr;

	cur_time_stamp =
			openbr timestamp_int closebr;

	literal =
	{character_string}  character_string_literal |
	{bit_string}	    bit_string_literal_both_rep |
	{datetime}	    datetime_literal |
	{exact_numeric}     exact_numeric_literal |
	{approx_numeric}    approx_numeric_literal;

	datetime_literal =
	{date}			date_literal |
	{time}			time_literal |
	{timestamp}		timestamp_literal |
         {interval} 	        interval_literal;

	/* A date, time, timestamp or interval string */
         date_literal =
		date [s1]:single_quote date_int [s2]:single_quote;

         time_literal =
		time [s1]:single_quote time_int  timezone_int?
[s2]:single_quote;

         timestamp_literal =
		timestamp [s1]:single_quote date_int time_int
timezone_int? [s2]:single_quote;

	interval_literal =
	{year_month}	 interval [s1]:single_quote additive_ops?
interval_st
			 [s2]:single_quote ym_interval_tag |
	{day_time}	 interval [s1]:single_quote additive_ops?
datetime_interval
			 [s3]:single_quote interval_dt end_interval_dt?;

	interval_st =
	{year}		year_int |
	{month}		month_int |
	{year_month}	year_int dash month_int;

	ym_interval_tag =
	{year}		year |
	{month}		month |
	{year_month}	year to month;


	interval_dt =
	{second}	second |
	{minute}	minute |
	{hour}		hour |
	{day}		day;

	end_interval_dt =
			to interval_dt;


------------------------------