Skip to content

Commit bd97e4e

Browse files
author
Thomas G. Lockhart
committed
Implement explicit date/time precision per SQL99 spec.
Use CAST() mechanism to define CURRENT_TIME and CURRENT_TIMESTAMP.
1 parent c24e5dd commit bd97e4e

File tree

1 file changed

+45
-44
lines changed

1 file changed

+45
-44
lines changed

src/backend/parser/gram.y

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.258 2001/10/03 20:54:21 tgl Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.259 2001/10/05 06:37:42 thomas Exp $
1515
*
1616
* HISTORY
1717
* AUTHOR DATE MAJOR EVENT
@@ -4251,8 +4251,8 @@ ConstDatetime: datetime
42514251
*/
42524252
$$->timezone = $5;
42534253
if (($3 < 0) || ($3 > 13))
4254-
elog(ERROR,"TIMESTAMP %s precision %d must be beween 0 and %d",
4255-
($5? " WITH TIME ZONE": ""), 0, 13);
4254+
elog(ERROR,"TIMESTAMP(%d) %s precision must be beween %d and %d",
4255+
$3, ($5? " WITH TIME ZONE": ""), 0, 13);
42564256
$$->typmod = $3;
42574257
}
42584258
| TIMESTAMP opt_timezone_x
@@ -4276,8 +4276,8 @@ ConstDatetime: datetime
42764276
else
42774277
$$->name = xlateSqlType("time");
42784278
if (($3 < 0) || ($3 > 13))
4279-
elog(ERROR,"TIME %s precision %d must be beween 0 and %d",
4280-
($5? " WITH TIME ZONE": ""), 0, 13);
4279+
elog(ERROR,"TIME(%d) %s precision must be beween %d and %d",
4280+
$3, ($5? " WITH TIME ZONE": ""), 0, 13);
42814281
$$->typmod = $3;
42824282
}
42834283
| TIME opt_timezone
@@ -4911,7 +4911,7 @@ c_expr: attr
49114911
*/
49124912
A_Const *s = makeNode(A_Const);
49134913
TypeName *t = makeNode(TypeName);
4914-
FuncCall *n = makeNode(FuncCall);
4914+
TypeName *d = makeNode(TypeName);
49154915

49164916
s->val.type = T_String;
49174917
s->val.val.str = "now";
@@ -4921,12 +4921,12 @@ c_expr: attr
49214921
t->setof = FALSE;
49224922
t->typmod = -1;
49234923

4924-
n->funcname = xlateSqlType("date");
4925-
n->args = makeList1(s);
4926-
n->agg_star = FALSE;
4927-
n->agg_distinct = FALSE;
4924+
d = makeNode(TypeName);
4925+
d->name = xlateSqlType("date");
4926+
d->setof = FALSE;
4927+
d->typmod = -1;
49284928

4929-
$$ = (Node *)n;
4929+
$$ = (Node *)makeTypeCast((Node *)s, d);
49304930
}
49314931
| CURRENT_TIME
49324932
{
@@ -4936,7 +4936,7 @@ c_expr: attr
49364936
*/
49374937
A_Const *s = makeNode(A_Const);
49384938
TypeName *t = makeNode(TypeName);
4939-
FuncCall *n = makeNode(FuncCall);
4939+
TypeName *d = makeNode(TypeName);
49404940

49414941
s->val.type = T_String;
49424942
s->val.val.str = "now";
@@ -4946,12 +4946,12 @@ c_expr: attr
49464946
t->setof = FALSE;
49474947
t->typmod = -1;
49484948

4949-
n->funcname = xlateSqlType("time");
4950-
n->args = makeList1(s);
4951-
n->agg_star = FALSE;
4952-
n->agg_distinct = FALSE;
4949+
d = makeNode(TypeName);
4950+
d->name = xlateSqlType("time");
4951+
d->setof = FALSE;
4952+
d->typmod = 0;
49534953

4954-
$$ = (Node *)n;
4954+
$$ = (Node *)makeTypeCast((Node *)s, d);
49554955
}
49564956
| CURRENT_TIME '(' Iconst ')'
49574957
{
@@ -4961,7 +4961,7 @@ c_expr: attr
49614961
*/
49624962
A_Const *s = makeNode(A_Const);
49634963
TypeName *t = makeNode(TypeName);
4964-
FuncCall *n = makeNode(FuncCall);
4964+
TypeName *d = makeNode(TypeName);
49654965

49664966
s->val.type = T_String;
49674967
s->val.val.str = "now";
@@ -4971,26 +4971,25 @@ c_expr: attr
49714971
t->setof = FALSE;
49724972
t->typmod = -1;
49734973

4974-
n->funcname = xlateSqlType("time");
4975-
n->args = makeList1(s);
4976-
n->agg_star = FALSE;
4977-
n->agg_distinct = FALSE;
4978-
4979-
if ($3 != 0)
4980-
elog(NOTICE,"CURRENT_TIME(%d) precision not implemented"
4981-
"; zero used instead",$3);
4974+
d = makeNode(TypeName);
4975+
d->name = xlateSqlType("timetz");
4976+
d->setof = FALSE;
4977+
if (($3 < 0) || ($3 > 13))
4978+
elog(ERROR,"CURRENT_TIME(%d) precision must be between %d and %d",
4979+
$3, 0, 13);
4980+
d->typmod = $3;
49824981

4983-
$$ = (Node *)n;
4982+
$$ = (Node *)makeTypeCast((Node *)s, d);
49844983
}
49854984
| CURRENT_TIMESTAMP
49864985
{
49874986
/*
4988-
* Translate as "timestamp('now'::text)".
4987+
* Translate as "timestamptz('now'::text)".
49894988
* See comments for CURRENT_DATE.
49904989
*/
49914990
A_Const *s = makeNode(A_Const);
49924991
TypeName *t = makeNode(TypeName);
4993-
FuncCall *n = makeNode(FuncCall);
4992+
TypeName *d = makeNode(TypeName);
49944993

49954994
s->val.type = T_String;
49964995
s->val.val.str = "now";
@@ -5000,12 +4999,15 @@ c_expr: attr
50004999
t->setof = FALSE;
50015000
t->typmod = -1;
50025001

5003-
n->funcname = xlateSqlType("timestamp");
5004-
n->args = makeList1(s);
5005-
n->agg_star = FALSE;
5006-
n->agg_distinct = FALSE;
5002+
/* SQL99 mandates a default precision of 6
5003+
* for timestamp. - thomas 2001-10-04
5004+
*/
5005+
d = makeNode(TypeName);
5006+
d->name = xlateSqlType("timestamptz");
5007+
d->setof = FALSE;
5008+
d->typmod = 6;
50075009

5008-
$$ = (Node *)n;
5010+
$$ = (Node *)makeTypeCast((Node *)s, d);
50095011
}
50105012
| CURRENT_TIMESTAMP '(' Iconst ')'
50115013
{
@@ -5015,7 +5017,7 @@ c_expr: attr
50155017
*/
50165018
A_Const *s = makeNode(A_Const);
50175019
TypeName *t = makeNode(TypeName);
5018-
FuncCall *n = makeNode(FuncCall);
5020+
TypeName *d = makeNode(TypeName);
50195021

50205022
s->val.type = T_String;
50215023
s->val.val.str = "now";
@@ -5025,16 +5027,15 @@ c_expr: attr
50255027
t->setof = FALSE;
50265028
t->typmod = -1;
50275029

5028-
n->funcname = xlateSqlType("timestamp");
5029-
n->args = makeList1(s);
5030-
n->agg_star = FALSE;
5031-
n->agg_distinct = FALSE;
5032-
5033-
if ($3 != 0)
5034-
elog(NOTICE,"CURRENT_TIMESTAMP(%d) precision not implemented"
5035-
"; zero used instead",$3);
5030+
d = makeNode(TypeName);
5031+
d->name = xlateSqlType("timestamptz");
5032+
d->setof = FALSE;
5033+
if (($3 < 0) || ($3 > 13))
5034+
elog(ERROR,"CURRENT_TIMESTAMP(%d) precision must be beween %d and %d",
5035+
$3, 0, 13);
5036+
d->typmod = $3;
50365037

5037-
$$ = (Node *)n;
5038+
$$ = (Node *)makeTypeCast((Node *)s, d);
50385039
}
50395040
| CURRENT_USER
50405041
{

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy