-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.22 2001/08/24 14:07:49 petere Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.23 2001/09/19 14:09:32 meskes Exp $ */
/*
* The aim is to get a simpler inteface to the database routines.
* it should go into a separate function
*/
{
+ bool clear_result = TRUE;
var = stmt->outlist;
switch (PQresultStatus(results))
{
break;
}
- for (act_field = 0; act_field < nfields && status; act_field++)
+ if (var != NULL && var->type==ECPGt_descriptor)
+ { PGresult **resultpp = ECPGdescriptor_lvalue(stmt->lineno, (const char*)var->pointer);
+ if (resultpp == NULL) status = false;
+ else
+ { if (*resultpp)
+ PQclear(*resultpp);
+ *resultpp=results;
+ clear_result = FALSE;
+ ECPGlog("ECPGexecute putting result into descriptor '%s'\n", (const char*)var->pointer);
+ }
+ var = var->next;
+ }
+ else for (act_field = 0; act_field < nfields && status; act_field++)
{
if (var == NULL)
{
status = false;
break;
}
- PQclear(results);
+ if (clear_result) PQclear(results);
}
/* check for asynchronous returns */
return (status);
}
-/* dynamic SQL support routines
- *
- * Copyright (c) 2000, Christof Petig <christof.petig@wtal.de>
- *
- * $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/execute.c,v 1.22 2001/08/24 14:07:49 petere Exp $
- */
-
-PGconn *ECPG_internal_get_connection(char *name);
-
-extern struct descriptor
-{
- char *name;
- PGresult *result;
- struct descriptor *next;
-} *all_descriptors;
-
-/* like ECPGexecute */
-static bool
-execute_descriptor(int lineno, const char *query
- ,struct connection * con, PGresult **resultptr)
-{
- bool status = false;
- PGresult *results;
- PGnotify *notify;
-
- /* Now the request is built. */
-
- if (con->committed && !con->autocommit)
- {
- if ((results = PQexec(con->connection, "begin transaction")) == NULL)
- {
- ECPGraise(lineno, ECPG_TRANS, NULL);
- return false;
- }
- PQclear(results);
- con->committed = false;
- }
-
- ECPGlog("execute_descriptor line %d: QUERY: %s on connection %s\n", lineno, query, con->name);
- results = PQexec(con->connection, query);
-
- if (results == NULL)
- {
- ECPGlog("ECPGexecute line %d: error: %s", lineno,
- PQerrorMessage(con->connection));
- ECPGraise(lineno, ECPG_PGSQL, PQerrorMessage(con->connection));
- }
- else
- {
- *resultptr = results;
- switch (PQresultStatus(results))
- {
- int ntuples;
-
- case PGRES_TUPLES_OK:
- status = true;
- sqlca.sqlerrd[2] = ntuples = PQntuples(results);
- if (ntuples < 1)
- {
- ECPGlog("execute_descriptor line %d: Incorrect number of matches: %d\n",
- lineno, ntuples);
- ECPGraise(lineno, ECPG_NOT_FOUND, NULL);
- status = false;
- break;
- }
- break;
-#if 1 /* strictly these are not needed (yet) */
- case PGRES_EMPTY_QUERY:
- /* do nothing */
- ECPGraise(lineno, ECPG_EMPTY, NULL);
- break;
- case PGRES_COMMAND_OK:
- status = true;
- sqlca.sqlerrd[1] = PQoidValue(results);
- sqlca.sqlerrd[2] = atol(PQcmdTuples(results));
- ECPGlog("ECPGexecute line %d Ok: %s\n", lineno, PQcmdStatus(results));
- break;
- case PGRES_COPY_OUT:
- ECPGlog("ECPGexecute line %d: Got PGRES_COPY_OUT ... tossing.\n", lineno);
- PQendcopy(con->connection);
- break;
- case PGRES_COPY_IN:
- ECPGlog("ECPGexecute line %d: Got PGRES_COPY_IN ... tossing.\n", lineno);
- PQendcopy(con->connection);
- break;
-#else
- case PGRES_EMPTY_QUERY:
- case PGRES_COMMAND_OK:
- case PGRES_COPY_OUT:
- case PGRES_COPY_IN:
- break;
-#endif
- case PGRES_NONFATAL_ERROR:
- case PGRES_FATAL_ERROR:
- case PGRES_BAD_RESPONSE:
- ECPGlog("ECPGexecute line %d: Error: %s",
- lineno, PQerrorMessage(con->connection));
- ECPGraise(lineno, ECPG_PGSQL, PQerrorMessage(con->connection));
- status = false;
- break;
- default:
- ECPGlog("ECPGexecute line %d: Got something else, postgres error.\n",
- lineno);
- ECPGraise(lineno, ECPG_PGSQL, PQerrorMessage(con->connection));
- status = false;
- break;
- }
- }
-
- /* check for asynchronous returns */
- notify = PQnotifies(con->connection);
- if (notify)
- {
- ECPGlog("ECPGexecute line %d: ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
- lineno, notify->relname, notify->be_pid);
- free(notify);
- }
- return status;
-}
-
-/* like ECPGdo */
-static bool
-do_descriptor2(int lineno, const char *connection_name,
- PGresult **resultptr, const char *query)
-{
- struct connection *con = get_connection(connection_name);
- bool status = true;
- char *locale = setlocale(LC_NUMERIC, NULL);
-
- /* Make sure we do NOT honor the locale for numeric input/output */
- /* since the database wants teh standard decimal point */
- setlocale(LC_NUMERIC, "C");
-
- if (!ecpg_init(con, connection_name, lineno))
- {
- setlocale(LC_NUMERIC, locale);
- return (false);
- }
-
- /* are we connected? */
- if (con == NULL || con->connection == NULL)
- {
- ECPGlog("do_descriptor2: not connected to %s\n", con->name);
- ECPGraise(lineno, ECPG_NOT_CONN, NULL);
- setlocale(LC_NUMERIC, locale);
- return false;
- }
-
- status = execute_descriptor(lineno, query, con, resultptr);
-
- /* and reset locale value so our application is not affected */
- setlocale(LC_NUMERIC, locale);
- return (status);
-}
-
+/* old descriptor interface */
bool
ECPGdo_descriptor(int line, const char *connection,
const char *descriptor, const char *query)
{
- struct descriptor *i;
-
- for (i = all_descriptors; i != NULL; i = i->next)
- {
- if (!strcmp(descriptor, i->name))
- {
- bool status;
-
- /* free previous result */
- if (i->result)
- PQclear(i->result);
- i->result = NULL;
-
- status = do_descriptor2(line, connection, &i->result, query);
-
- if (!i->result)
- PQmakeEmptyPGresult(NULL, 0);
- return (status);
- }
- }
-
- ECPGraise(line, ECPG_UNKNOWN_DESCRIPTOR, (char *) descriptor);
- return false;
+ return ECPGdo(line, connection, (char *)query, ECPGt_EOIT,
+ ECPGt_descriptor, descriptor, 0L, 0L, 0L,
+ ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
}
%token ABORT_TRANS, ACCESS, AFTER, AGGREGATE, ANALYSE, ANALYZE,
BACKWARD, BEFORE, BINARY, BIT, CACHE, CHECKPOINT, CLUSTER,
COMMENT, COPY, CREATEDB, CREATEUSER, CYCLE, DATABASE,
- DELIMITERS, DO, EACH, ENCODING, EXCLUSIVE, EXPLAIN, EXTEND,
- FORCE, FORWARD, FUNCTION, HANDLER, INCREMENT,
+ DELIMITERS, DO, EACH, ENCODING, EXCLUSIVE, EXPLAIN,
+ FORCE, FORWARD, FREEZE, FUNCTION, HANDLER, INCREMENT,
INDEX, INHERITS, INSTEAD, ISNULL, LANCOMPILER, LIMIT,
LISTEN, UNLISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE,
MINVALUE, MODE, MOVE, NEW, NOCREATEDB, NOCREATEUSER,
%type <str> copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
%type <str> opt_with_copy FetchStmt direction fetch_how_many from_in
%type <str> ClosePortalStmt DropStmt VacuumStmt AnalyzeStmt opt_verbose
-%type <str> opt_full func_arg OptWithOids
+%type <str> opt_full func_arg OptWithOids opt_freeze opt_ecpg_into
%type <str> analyze_keyword opt_name_list ExplainStmt index_params
%type <str> index_list func_index index_elem opt_class access_method_clause
%type <str> index_opt_unique IndexStmt func_return ConstInterval
%type <str> select_limit opt_for_update_clause CheckPointStmt
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
-%type <str> indicator ECPGExecute ECPGPrepare ecpg_using
+%type <str> indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into
%type <str> storage_clause opt_initializer c_anything blockstart
%type <str> blockend variable_list variable c_thing c_term
%type <str> opt_pointer ECPGDisconnect dis_name storage_modifier
%type <str> ECPGGetDescriptorHeader ECPGColLabel ECPGTypeName
%type <str> ECPGLabelTypeName ECPGColId variablelist cvariable
-%type <descriptor> ECPGFetchDescStmt ECPGGetDescriptor
+%type <descriptor> ECPGGetDescriptor
%type <type_enum> simple_type signed_type unsigned_type varchar_type
opt_at: AT connection_target { connection = $2; };
-stmt: AlterSchemaStmt { output_statement($1, 0, NULL, connection); }
- | AlterTableStmt { output_statement($1, 0, NULL, connection); }
- | AlterGroupStmt { output_statement($1, 0, NULL, connection); }
- | AlterUserStmt { output_statement($1, 0, NULL, connection); }
- | ClosePortalStmt { output_statement($1, 0, NULL, connection); }
- | CommentStmt { output_statement($1, 0, NULL, connection); }
- | CopyStmt { output_statement($1, 0, NULL, connection); }
- | CreateStmt { output_statement($1, 0, NULL, connection); }
- | CreateAsStmt { output_statement($1, 0, NULL, connection); }
- | CreateSchemaStmt { output_statement($1, 0, NULL, connection); }
- | CreateGroupStmt { output_statement($1, 0, NULL, connection); }
- | CreateSeqStmt { output_statement($1, 0, NULL, connection); }
- | CreatePLangStmt { output_statement($1, 0, NULL, connection); }
- | CreateTrigStmt { output_statement($1, 0, NULL, connection); }
- | CreateUserStmt { output_statement($1, 0, NULL, connection); }
- | ClusterStmt { output_statement($1, 0, NULL, connection); }
- | DefineStmt { output_statement($1, 0, NULL, connection); }
- | DropStmt { output_statement($1, 0, NULL, connection); }
- | DropSchemaStmt { output_statement($1, 0, NULL, connection); }
- | TruncateStmt { output_statement($1, 0, NULL, connection); }
- | DropGroupStmt { output_statement($1, 0, NULL, connection); }
- | DropPLangStmt { output_statement($1, 0, NULL, connection); }
- | DropTrigStmt { output_statement($1, 0, NULL, connection); }
- | DropUserStmt { output_statement($1, 0, NULL, connection); }
- | ExplainStmt { output_statement($1, 0, NULL, connection); }
- | FetchStmt { output_statement($1, 1, NULL, connection); }
- | GrantStmt { output_statement($1, 0, NULL, connection); }
- | IndexStmt { output_statement($1, 0, NULL, connection); }
- | ListenStmt { output_statement($1, 0, NULL, connection); }
- | UnlistenStmt { output_statement($1, 0, NULL, connection); }
- | LockStmt { output_statement($1, 0, NULL, connection); }
- | NotifyStmt { output_statement($1, 0, NULL, connection); }
- | ProcedureStmt { output_statement($1, 0, NULL, connection); }
- | ReindexStmt { output_statement($1, 0, NULL, connection); }
- | RemoveAggrStmt { output_statement($1, 0, NULL, connection); }
- | RemoveOperStmt { output_statement($1, 0, NULL, connection); }
- | RemoveFuncStmt { output_statement($1, 0, NULL, connection); }
- | RenameStmt { output_statement($1, 0, NULL, connection); }
- | RevokeStmt { output_statement($1, 0, NULL, connection); }
+stmt: AlterSchemaStmt { output_statement($1, 0, connection); }
+ | AlterTableStmt { output_statement($1, 0, connection); }
+ | AlterGroupStmt { output_statement($1, 0, connection); }
+ | AlterUserStmt { output_statement($1, 0, connection); }
+ | ClosePortalStmt { output_statement($1, 0, connection); }
+ | CommentStmt { output_statement($1, 0, connection); }
+ | CopyStmt { output_statement($1, 0, connection); }
+ | CreateStmt { output_statement($1, 0, connection); }
+ | CreateAsStmt { output_statement($1, 0, connection); }
+ | CreateSchemaStmt { output_statement($1, 0, connection); }
+ | CreateGroupStmt { output_statement($1, 0, connection); }
+ | CreateSeqStmt { output_statement($1, 0, connection); }
+ | CreatePLangStmt { output_statement($1, 0, connection); }
+ | CreateTrigStmt { output_statement($1, 0, connection); }
+ | CreateUserStmt { output_statement($1, 0, connection); }
+ | ClusterStmt { output_statement($1, 0, connection); }
+ | DefineStmt { output_statement($1, 0, connection); }
+ | DropStmt { output_statement($1, 0, connection); }
+ | DropSchemaStmt { output_statement($1, 0, connection); }
+ | TruncateStmt { output_statement($1, 0, connection); }
+ | DropGroupStmt { output_statement($1, 0, connection); }
+ | DropPLangStmt { output_statement($1, 0, connection); }
+ | DropTrigStmt { output_statement($1, 0, connection); }
+ | DropUserStmt { output_statement($1, 0, connection); }
+ | ExplainStmt { output_statement($1, 0, connection); }
+ | FetchStmt { output_statement($1, 1, connection); }
+ | GrantStmt { output_statement($1, 0, connection); }
+ | IndexStmt { output_statement($1, 0, connection); }
+ | ListenStmt { output_statement($1, 0, connection); }
+ | UnlistenStmt { output_statement($1, 0, connection); }
+ | LockStmt { output_statement($1, 0, connection); }
+ | NotifyStmt { output_statement($1, 0, connection); }
+ | ProcedureStmt { output_statement($1, 0, connection); }
+ | ReindexStmt { output_statement($1, 0, connection); }
+ | RemoveAggrStmt { output_statement($1, 0, connection); }
+ | RemoveOperStmt { output_statement($1, 0, connection); }
+ | RemoveFuncStmt { output_statement($1, 0, connection); }
+ | RenameStmt { output_statement($1, 0, connection); }
+ | RevokeStmt { output_statement($1, 0, connection); }
| OptimizableStmt {
if (strncmp($1, "/* " , sizeof("/* ")-1) == 0)
output_simple_statement($1);
else
- output_statement($1, 1, NULL, connection);
+ output_statement($1, 1, connection);
}
- | RuleStmt { output_statement($1, 0, NULL, connection); }
+ | RuleStmt { output_statement($1, 0, connection); }
| TransactionStmt {
fprintf(yyout, "{ ECPGtrans(__LINE__, %s, \"%s\");", connection ? connection : "NULL", $1);
whenever_action(2);
free($1);
}
- | ViewStmt { output_statement($1, 0, NULL, connection); }
- | LoadStmt { output_statement($1, 0, NULL, connection); }
- | CreatedbStmt { output_statement($1, 0, NULL, connection); }
- | DropdbStmt { output_statement($1, 0, NULL, connection); }
- | VacuumStmt { output_statement($1, 0, NULL, connection); }
- | AnalyzeStmt { output_statement($1, 0, NULL, connection); }
- | VariableSetStmt { output_statement($1, 0, NULL, connection); }
- | VariableShowStmt { output_statement($1, 0, NULL, connection); }
- | VariableResetStmt { output_statement($1, 0, NULL, connection); }
- | ConstraintsSetStmt { output_statement($1, 0, NULL, connection); }
- | CheckPointStmt { output_statement($1, 0, NULL, connection); }
+ | ViewStmt { output_statement($1, 0, connection); }
+ | LoadStmt { output_statement($1, 0, connection); }
+ | CreatedbStmt { output_statement($1, 0, connection); }
+ | DropdbStmt { output_statement($1, 0, connection); }
+ | VacuumStmt { output_statement($1, 0, connection); }
+ | AnalyzeStmt { output_statement($1, 0, connection); }
+ | VariableSetStmt { output_statement($1, 0, connection); }
+ | VariableShowStmt { output_statement($1, 0, connection); }
+ | VariableResetStmt { output_statement($1, 0, connection); }
+ | ConstraintsSetStmt { output_statement($1, 0, connection); }
+ | CheckPointStmt { output_statement($1, 0, connection); }
| ECPGAllocateDescr { fprintf(yyout,"ECPGallocate_desc(__LINE__, %s);",$1);
whenever_action(0);
free($1);
whenever_action(2);
free($1);
}
- | ECPGExecute { output_statement($1, 0, NULL, connection); }
- | ECPGFetchDescStmt { output_statement($1.str, 1, $1.name, connection); }
+ | ECPGExecute { output_statement($1, 0, connection); }
| ECPGFree {
fprintf(yyout, "{ ECPGdeallocate(__LINE__, \"%s\");", $1);
for (p = ptr->argsresult; p; p = p->next)
add_variable(&argsresult, p->variable, p->indicator);
- output_statement(mm_strdup(ptr->command), 0, NULL, ptr->connection ? mm_strdup(ptr->connection) : NULL);
+ output_statement(mm_strdup(ptr->command), 0, ptr->connection ? mm_strdup(ptr->connection) : NULL);
}
| ECPGPrepare {
if (connection)
*
*****************************************************************************/
-FetchStmt: FETCH direction fetch_how_many from_in name INTO into_list
+FetchStmt: FETCH direction fetch_how_many from_in name ecpg_into
{
if (strcmp($2, "relative") == 0 && atol($3) == 0L)
mmerror(ET_ERROR, "FETCH/RELATIVE at current position is not supported");
$$ = cat_str(5, make_str("fetch"), $2, $3, $4, $5);
}
- | FETCH fetch_how_many from_in name INTO into_list
+ | FETCH fetch_how_many from_in name ecpg_into
{
$$ = cat_str(4, make_str("fetch"), $2, $3, $4);
}
- | FETCH direction from_in name INTO into_list
+ | FETCH direction from_in name ecpg_into
{
$$ = cat_str(4, make_str("fetch"), $2, $3, $4);
}
- | FETCH from_in name INTO into_list
+ | FETCH from_in name ecpg_into
{
$$ = cat_str(3, make_str("fetch"), $2, $3);
}
- | FETCH name INTO into_list
+ | FETCH name ecpg_into
{
$$ = cat2_str(make_str("fetch"), $2);
}
* QUERY:
* create index <indexname> on <relname>
* [ using <access> ] "(" (<col> with <op>)+ ")"
- * [ with <parameters> ]
* [ where <predicate> ]
*
*****************************************************************************/
IndexStmt: CREATE index_opt_unique INDEX index_name ON relation_name
- access_method_clause '(' index_params ')' opt_with where_clause
+ access_method_clause '(' index_params ')' where_clause
{
- $$ = cat_str(12, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11, $12);
+ $$ = cat_str(11, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11);
}
;
*
*****************************************************************************/
-VacuumStmt: VACUUM opt_full opt_verbose
+VacuumStmt: VACUUM opt_full opt_freeze opt_verbose
{
- $$ = cat_str(3, make_str("vacuum"), $2, $3);
+ $$ = cat_str(4, make_str("vacuum"), $2, $3, $4);
}
- | VACUUM opt_full opt_verbose relation_name
+ | VACUUM opt_full opt_freeze opt_verbose relation_name
{
- $$ = cat_str(4, make_str("vacuum"), $2, $3, $4);
+ $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5);
}
- | VACUUM opt_full opt_verbose AnalyzeStmt
+ | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt
{
- $$ = cat_str(4, make_str("vacuum"), $2, $3, $4);
+ $$ = cat_str(5, make_str("vacuum"), $2, $3, $4, $5);
}
;
| /*EMPTY*/ { $$ = EMPTY; }
;
+opt_freeze: FREEZE { $$ = make_str("freeze"); }
+ | /*EMPTY*/ { $$ = EMPTY; }
+ ;
+
opt_name_list: '(' name_list ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
| /*EMPTY*/ { $$ = EMPTY; }
;
FoundInto = 1;
$$= cat2_str(make_str("into"), $2);
}
- | INTO into_list { $$ = EMPTY; }
- | /*EMPTY*/ { $$ = EMPTY; }
+ | ecpg_into { $$ = EMPTY; }
+ | /*EMPTY*/ { $$ = EMPTY; }
;
/*
sprintf(thisquery->name, "ECPGprepared_statement(\"%s\")", $2);
add_variable(&argsinsert, thisquery, &no_indicator);
- } ecpg_using
+ } ecpg_using opt_ecpg_into
{
$$ = make_str("?");
}
}
;
+opt_sql: /* empty */ | SQL_SQL;
+
+ecpg_into: INTO into_list {
+ $$ = EMPTY;
+ }
+ | INTO opt_sql SQL_DESCRIPTOR quoted_ident_stringvar
+ {
+ add_variable(&argsresult, descriptor_variable($4,0), &no_indicator);
+ $$ = EMPTY;
+ }
+ ;
+
+opt_ecpg_into: /* empty */ { $$ = EMPTY; }
+ | ecpg_into { $$ = $1; }
+ ;
+
variable: civarind | civar
variablelist: variable | variable ',' variablelist;
{ $$.str = $5; $$.name = $3; }
;
-/*****************************************************************************
- *
- * QUERY:
- * fetch [forward | backward] [ # | all ] [ in <portalname> ]
- * fetch [ forward | backward | absolute | relative ]
- * [ # | all | next | prior ] [ [ in | from ] <portalname> ]
- *
- * Have to seperate the descriptor version since we have to
- * call a different output function
- *
- *****************************************************************************/
-
-ECPGFetchDescStmt: FETCH direction fetch_how_many from_in name INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
- {
- $$.str = cat_str(5, make_str("fetch"), $2, $3, $4, $5);
- $$.name=$9;
- }
- | FETCH fetch_how_many from_in name INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
- {
- $$.str = cat_str(4, make_str("fetch"), $2, $3, $4);
- $$.name=$8;
- }
- | FETCH direction from_in name INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
- {
- $$.str = cat_str(4, make_str("fetch"), $2, $3, $4);
- $$.name=$8;
- }
- | FETCH from_in name INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
- {
- $$.str = cat_str(3, make_str("fetch"), $2, $3);
- $$.name=$7;
- }
- | FETCH name INTO SQL_SQL SQL_DESCRIPTOR quoted_ident_stringvar
- {
- $$.str = cat2_str(make_str("fetch"), $2);
- $$.name=$6;
- }
- ;
-
/*
* for compatibility with ORACLE we will also allow the keyword RELEASE
* after a transaction statement to disconnect from the database.
| DROP { $$ = make_str("drop"); }
| EACH { $$ = make_str("each"); }
| ENCODING { $$ = make_str("encoding"); }
+ | ENCRYPTED { $$ = make_str("encrypted"); }
| ESCAPE { $$ = make_str("escape"); }
| EXCLUSIVE { $$ = make_str("exclusive"); }
| EXECUTE { $$ = make_str("execute"); }
| TRIGGER { $$ = make_str("trigger"); }
| TRUNCATE { $$ = make_str("truncate"); }
| TRUSTED { $$ = make_str("trusted"); }
+ | UNENCRYPTED { $$ = make_str("unencrypted"); }
| UNLISTEN { $$ = make_str("unlisten"); }
| UNTIL { $$ = make_str("until"); }
| UPDATE { $$ = make_str("update"); }
| DISTINCT { $$ = make_str("distinct"); }
| DO { $$ = make_str("do"); }
| ELSE { $$ = make_str("else"); }
- | ENCRYPTED { $$ = make_str("encrypted"); }
| END_TRANS { $$ = make_str("end"); }
| EXCEPT { $$ = make_str("except"); }
| EXISTS { $$ = make_str("exists"); }
| FALSE_P { $$ = make_str("false"); }
| FOR { $$ = make_str("for"); }
| FOREIGN { $$ = make_str("foreign"); }
+ | FREEZE { $$ = make_str("freeze"); }
| FROM { $$ = make_str("from"); }
| FULL { $$ = make_str("full"); }
| IN { $$ = make_str("in"); }
| TRANSACTION { $$ = make_str("transaction"); }
| TRIM { $$ = make_str("trim"); }
| TRUE_P { $$ = make_str("true"); }
- | UNENCRYPTED { $$ = make_str("unencrypted"); }
| UNIQUE { $$ = make_str("unique"); }
| UNKNOWN { $$ = make_str("unknown"); }
| USER { $$ = make_str("user"); }