From a51df14a6927933ba576850a50125fccf283a175 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Wed, 2 Apr 1997 18:24:52 +0000 Subject: [PATCH] From: "Martin J. Laubach" Subject: [HACKERS] Patch: SET var TO 'val' Here is a patch that adds a "SET variable TO 'somevalue'" capability to the parser, and then calls the SetPGVariable() function (which does just issue a elog(NOTICE) to see whether it works). That's the framework for adding timezone/date format/language/... stuff. --- src/backend/parser/gram.y | 33 +++++++++++++++++++++++++++++---- src/backend/tcop/utility.c | 15 +++++++++++++-- src/backend/tcop/variable.c | 4 +++- src/include/nodes/nodes.h | 3 ++- src/include/nodes/parsenodes.h | 13 ++++++++++++- 5 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 15fc14e9b1..402f3343ae 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.28 1997/04/02 04:01:03 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.29 1997/04/02 18:23:07 scrappy Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -108,11 +108,12 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr); RevokeStmt, RuleStmt, TransactionStmt, ViewStmt, LoadStmt, CreatedbStmt, DestroydbStmt, VacuumStmt, RetrieveStmt, CursorStmt, ReplaceStmt, AppendStmt, NotifyStmt, DeleteStmt, ClusterStmt, - ExplainStmt + ExplainStmt, VariableSetStmt %type relation_name, copy_file_name, copy_delimiter, def_name, database_name, access_method_clause, access_method, attr_name, - class, index_name, var_name, name, file_name, recipe_name + class, index_name, var_name, name, file_name, recipe_name, + var_name %type opt_id, opt_portal_name, before_clause, after_clause, all_Op, MathOp, opt_name, opt_unique, @@ -168,7 +169,7 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr); %type Iconst %type Sconst -%type Id, date +%type Id, date, var_value /* @@ -273,6 +274,30 @@ stmt : AddAttrStmt | CreatedbStmt | DestroydbStmt | VacuumStmt + | VariableSetStmt + ; + +/***************************************************************************** + * + * Set PG internal variable + * SET var_name TO 'var_value' + * + *****************************************************************************/ + +VariableSetStmt: SET var_name TO var_value + { + VariableSetStmt *n = makeNode(VariableSetStmt); + n->name = $2; + n->value = $4; + + $$ = (Node *) n; + } + ; + +var_name: Id { $$ = $1; } + ; + +var_value: Sconst { $$ = $1; } ; /***************************************************************************** diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 7511b154a6..ec4c7c68ae 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.13 1997/04/02 04:06:32 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.14 1997/04/02 18:23:34 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -44,6 +44,7 @@ #include "rewrite/rewriteDefine.h" #include "tcop/tcopdebug.h" #include "tcop/dest.h" +#include "tcop/variable.h" #include "tcop/utility.h" #include "fmgr.h" /* For load_file() */ @@ -634,7 +635,17 @@ ProcessUtility(Node *parsetree, beginRecipe(stmt); } break; - + + /* ******************************** + * set variable statements + *********************************/ + case T_VariableSetStmt: + { + VariableSetStmt *n = (VariableSetStmt *) parsetree; + SetPGVariable(n->name, n->value); + commandTag = "SET_VARIABLE"; + } + break; /* ******************************** * default diff --git a/src/backend/tcop/variable.c b/src/backend/tcop/variable.c index 6f27989755..e304136139 100644 --- a/src/backend/tcop/variable.c +++ b/src/backend/tcop/variable.c @@ -1,8 +1,10 @@ #include "postgres.h" #include "tcop/variable.h" -bool SetPGVariable(const char *varName, const char *value) +bool SetPGVariable(const char *name, const char *value) { + elog(NOTICE, "Variable %s set to \"%s\"", name, value); + return TRUE; } diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 560fd1a38d..a7c7ae95f1 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: nodes.h,v 1.6 1997/04/02 03:34:44 vadim Exp $ + * $Id: nodes.h,v 1.7 1997/04/02 18:24:38 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -179,6 +179,7 @@ typedef enum NodeTag { T_VacuumStmt, T_ExplainStmt, T_CreateSeqStmt, + T_VariableSetStmt, T_A_Expr = 700, T_Attr, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index dee1c1eac5..b806326e9e 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: parsenodes.h,v 1.11 1997/04/02 03:34:46 vadim Exp $ + * $Id: parsenodes.h,v 1.12 1997/04/02 18:24:52 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -423,6 +423,17 @@ typedef struct ExplainStmt { bool verbose; /* print plan info */ } ExplainStmt; +/* ---------------------- + * Set Statement + * ---------------------- + */ + +typedef struct VariableSetStmt { + NodeTag type; + char *name; + char *value; + } VariableSetStmt; + /***************************************************************************** * Optimizable Statements