1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-27 00:12:01 +03:00
Subject: Re: [PATCHES] SET DateStyle patches

On Tue, 22 Apr 1997, Thomas Lockhart wrote:

> Some more patches! These (try to) finish implementing SET variable TO value
> for "DateStyle" (changed the name from simply "date" to be more descriptive).
> This is based on code from Martin and Bruce (?), which was easy to modify.
> The syntax is
>
> SET DateStyle TO 'iso'
> SET DateStyle TO 'postgres'
> SET DateStyle TO 'sql'
> SET DateStyle TO 'european'
> SET DateStyle TO 'noneuropean'
> SET DateStyle TO 'us'         (same as "noneuropean")
> SET DateStyle TO 'default'    (current same as "postgres,us")
>
> ("european" is just compared for the first 4 characters, and "noneuropean"
> is compared for the first 7 to allow less typing).
>
> Multiple arguments are allowed, so SET datestyle TO 'sql,euro' is valid.
>
> My mods also try to implement "SHOW variable" and "RESET variable", but
> that part just core dumps at the moment. I would guess that my errors
> are obvious to someone who knows what they are doing with the parser stuff,
> so if someone (Bruce and/or Martin??) could have it do the right thing
> we will have a more complete set of what we need.
>
> Also, I would like to have a floating point precision global variable to
> implement "SET precision TO 10" and perhaps "SET precision TO 10,2" for
> float8 and float4, but I don't know how to do that for integer types rather
> than strings. If someone is fixing the SHOW and RESET code, perhaps they can
> add some hooks for me to do the floats while they are at it.
>
> I've left some remnants of variable structures in the source code which
> I did not use in the interests of getting something working for v6.1.
> We'll have time to clean things up for the next release...
This commit is contained in:
Marc G. Fournier
1997-04-23 03:18:27 +00:00
parent cf398593fd
commit 4b5319129c
7 changed files with 392 additions and 41 deletions

View File

@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.30 1997/04/05 06:25:59 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.31 1997/04/23 03:17:00 scrappy Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -108,7 +108,7 @@ 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, VariableSetStmt
ExplainStmt, VariableSetStmt, VariableShowStmt, VariableResetStmt
%type <str> relation_name, copy_file_name, copy_delimiter, def_name,
database_name, access_method_clause, access_method, attr_name,
@@ -190,8 +190,8 @@ static Node *makeA_Expr(int oper, char *opname, Node *lexpr, Node *rexpr);
NONE, NOT, NOTHING, NOTIFY, NOTNULL,
OIDS, ON, OPERATOR, OPTION, OR, ORDER,
PNULL, PRIVILEGES, PUBLIC, PURGE, P_TYPE,
RENAME, REPLACE, RETRIEVE, RETURNS, REVOKE, ROLLBACK, RULE,
SELECT, SET, SETOF, STDIN, STDOUT, STORE,
RENAME, REPLACE, RESET, RETRIEVE, RETURNS, REVOKE, ROLLBACK, RULE,
SELECT, SET, SETOF, SHOW, STDIN, STDOUT, STORE,
TABLE, TO, TRANSACTION, UNIQUE, UPDATE, USING, VACUUM, VALUES
VERBOSE, VERSION, VIEW, WHERE, WITH, WORK
%token EXECUTE, RECIPE, EXPLAIN, LIKE, SEQUENCE
@@ -275,6 +275,8 @@ stmt : AddAttrStmt
| DestroydbStmt
| VacuumStmt
| VariableSetStmt
| VariableShowStmt
| VariableResetStmt
;
/*****************************************************************************
@@ -289,7 +291,7 @@ VariableSetStmt: SET var_name TO var_value
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = $2;
n->value = $4;
$$ = (Node *) n;
}
;
@@ -297,6 +299,26 @@ VariableSetStmt: SET var_name TO var_value
var_value: Sconst { $$ = $1; }
;
VariableShowStmt: SHOW var_name
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = $2;
n->value = NULL;
$$ = (Node *) n;
}
;
VariableResetStmt: RESET var_name
{
VariableSetStmt *n = makeNode(VariableSetStmt);
n->name = $2;
n->value = NULL;
$$ = (Node *) n;
}
;
/*****************************************************************************
*
* QUERY :

View File

@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.8 1997/04/02 04:49:13 vadim Exp $
* $Header: /cvsroot/pgsql/src/backend/parser/keywords.c,v 1.9 1997/04/23 03:17:04 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -116,6 +116,7 @@ static ScanKeyword ScanKeywords[] = {
{ "recipe", RECIPE },
{ "rename", RENAME },
{ "replace", REPLACE },
{ "reset", RESET },
{ "retrieve", RETRIEVE },
{ "returns", RETURNS },
{ "revoke", REVOKE },
@@ -125,6 +126,7 @@ static ScanKeyword ScanKeywords[] = {
{ "sequence", SEQUENCE },
{ "set", SET },
{ "setof", SETOF },
{ "show", SHOW },
{ "stdin", STDIN },
{ "stdout", STDOUT },
{ "store", STORE },

View File

@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.14 1997/04/02 18:23:34 scrappy Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.15 1997/04/23 03:17:09 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -643,7 +643,23 @@ ProcessUtility(Node *parsetree,
{
VariableSetStmt *n = (VariableSetStmt *) parsetree;
SetPGVariable(n->name, n->value);
commandTag = "SET_VARIABLE";
commandTag = "SET VARIABLE";
}
break;
case T_VariableShowStmt:
{
VariableSetStmt *n = (VariableSetStmt *) parsetree;
GetPGVariable(n->name);
commandTag = "SHOW VARIABLE";
}
break;
case T_VariableResetStmt:
{
VariableSetStmt *n = (VariableSetStmt *) parsetree;
ResetPGVariable(n->name);
commandTag = "RESET VARIABLE";
}
break;

View File

@@ -1,9 +1,49 @@
/*
* Routines for handling of SET var TO statements
*
* $Id: variable.c,v 1.3 1997/04/17 13:50:30 scrappy Exp $
* $Id: variable.c,v 1.4 1997/04/23 03:17:16 scrappy Exp $
*
* $Log: variable.c,v $
* Revision 1.4 1997/04/23 03:17:16 scrappy
* To: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
* Subject: Re: [PATCHES] SET DateStyle patches
*
* On Tue, 22 Apr 1997, Thomas Lockhart wrote:
*
* > Some more patches! These (try to) finish implementing SET variable TO value
* > for "DateStyle" (changed the name from simply "date" to be more descriptive).
* > This is based on code from Martin and Bruce (?), which was easy to modify.
* > The syntax is
* >
* > SET DateStyle TO 'iso'
* > SET DateStyle TO 'postgres'
* > SET DateStyle TO 'sql'
* > SET DateStyle TO 'european'
* > SET DateStyle TO 'noneuropean'
* > SET DateStyle TO 'us' (same as "noneuropean")
* > SET DateStyle TO 'default' (current same as "postgres,us")
* >
* > ("european" is just compared for the first 4 characters, and "noneuropean"
* > is compared for the first 7 to allow less typing).
* >
* > Multiple arguments are allowed, so SET datestyle TO 'sql,euro' is valid.
* >
* > My mods also try to implement "SHOW variable" and "RESET variable", but
* > that part just core dumps at the moment. I would guess that my errors
* > are obvious to someone who knows what they are doing with the parser stuff,
* > so if someone (Bruce and/or Martin??) could have it do the right thing
* > we will have a more complete set of what we need.
* >
* > Also, I would like to have a floating point precision global variable to
* > implement "SET precision TO 10" and perhaps "SET precision TO 10,2" for
* > float8 and float4, but I don't know how to do that for integer types rather
* > than strings. If someone is fixing the SHOW and RESET code, perhaps they can
* > add some hooks for me to do the floats while they are at it.
* >
* > I've left some remnants of variable structures in the source code which
* > I did not use in the interests of getting something working for v6.1.
* > We'll have time to clean things up for the next release...
*
* Revision 1.3 1997/04/17 13:50:30 scrappy
* From: "Martin J. Laubach" <mjl@CSlab.tuwien.ac.at>
* Subject: [HACKERS] Patch: set date to euro/us postgres/iso/sql
@@ -24,8 +64,10 @@
*/
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include "postgres.h"
#include "miscadmin.h"
#include "tcop/variable.h"
/*-----------------------------------------------------------------------*/
@@ -70,38 +112,55 @@ static bool parse_null(const char *value)
return TRUE;
}
static bool show_null(const char *value)
{
return TRUE;
}
static bool reset_null(const char *value)
{
return TRUE;
}
static bool parse_date(const char *value)
{
char tok[32];
int dcnt = 0, ecnt = 0;
while(value = get_token(tok, sizeof(tok), value))
while((value = get_token(tok, sizeof(tok), value)) != 0)
{
/* Ugh. Somebody ought to write a table driven version -- mjl */
if(!strcasecmp(tok, "iso"))
{
PGVariables.date.format = Date_ISO;
DateStyle = USE_ISO_DATES;
dcnt++;
}
else if(!strcasecmp(tok, "sql"))
{
PGVariables.date.format = Date_SQL;
DateStyle = USE_SQL_DATES;
dcnt++;
}
else if(!strcasecmp(tok, "postgres"))
{
PGVariables.date.format = Date_Postgres;
DateStyle = USE_POSTGRES_DATES;
dcnt++;
}
else if(!strcasecmp(tok, "euro"))
else if(!strncasecmp(tok, "euro", 4))
{
PGVariables.date.euro = TRUE;
EuroDates = TRUE;
ecnt++;
}
else if(!strcasecmp(tok, "us"))
else if((!strcasecmp(tok, "us"))
|| (!strncasecmp(tok, "noneuro", 7)))
{
PGVariables.date.euro = FALSE;
EuroDates = FALSE;
ecnt++;
}
else if(!strcasecmp(tok, "default"))
{
DateStyle = USE_POSTGRES_DATES;
EuroDates = FALSE;
ecnt++;
}
else
@@ -116,16 +175,39 @@ static bool parse_date(const char *value)
return TRUE;
}
static bool show_date()
{
char buf[64];
sprintf( buf, "Date style is %s with%s European conventions",
((DateStyle == USE_ISO_DATES)? "iso": ((DateStyle == USE_ISO_DATES)? "sql": "postgres")),
((EuroDates)? "": "out"));
elog(NOTICE, buf, NULL);
return TRUE;
}
static bool reset_date()
{
DateStyle = USE_POSTGRES_DATES;
EuroDates = FALSE;
return TRUE;
}
/*-----------------------------------------------------------------------*/
struct VariableParsers
{
const char *name;
bool (*parser)(const char *);
bool (*show)();
bool (*reset)();
} VariableParsers[] =
{
{ "date", parse_date },
{ "timezone", parse_null },
{ NULL }
{ "datestyle", parse_date, show_date, reset_date },
{ "timezone", parse_null, show_null, reset_null },
{ NULL, NULL, NULL }
};
/*-----------------------------------------------------------------------*/
@@ -139,14 +221,39 @@ bool SetPGVariable(const char *name, const char *value)
return (vp->parser)(value);
}
elog(NOTICE, "No such variable %s", name);
elog(NOTICE, "Unrecognized variable %s", name);
return TRUE;
}
/*-----------------------------------------------------------------------*/
const char *GetPGVariable(const char *varName)
bool GetPGVariable(const char *name)
{
return NULL;
struct VariableParsers *vp;
for(vp = VariableParsers; vp->name; vp++)
{
if(!strcasecmp(vp->name, name))
return (vp->show)();
}
elog(NOTICE, "Unrecognized variable %s", name);
return TRUE;
}
/*-----------------------------------------------------------------------*/
bool ResetPGVariable(const char *name)
{
struct VariableParsers *vp;
for(vp = VariableParsers; vp->name; vp++)
{
if(!strcasecmp(vp->name, name))
return (vp->reset)();
}
elog(NOTICE, "Unrecognized variable %s", name);
return TRUE;
}