aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
authorNeil Conway <neilc@samurai.com>2007-05-29 04:59:15 +0000
committerNeil Conway <neilc@samurai.com>2007-05-29 04:59:15 +0000
commit75103cc2189d8455dfb6904b01c4a96449518ee9 (patch)
tree2072e15fca5bfedbaefe0eaec127a31ec53c72b7 /src/backend/utils
parent7b6b5ba9b289510b71313cc250db45c3fd38d8cd (diff)
downloadpostgresql-75103cc2189d8455dfb6904b01c4a96449518ee9.tar.gz
postgresql-75103cc2189d8455dfb6904b01c4a96449518ee9.zip
Fix a bug in input processing for the "interval" type. Previously,
"microsecond" and "millisecond" units were not considered valid input by themselves, which caused inputs like "1 millisecond" to be rejected erroneously. Update the docs, add regression tests, and backport to 8.2 and 8.1
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/adt/datetime.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index f72d1c6b403..5a1613ef7d0 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.174 2006/10/18 16:43:13 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.174.2.1 2007/05/29 04:59:13 neilc Exp $
*
*-------------------------------------------------------------------------
*/
@@ -922,6 +922,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
#else
*fsec = frac;
#endif
+ tmask = DTK_ALL_SECS_M;
}
break;
@@ -1697,6 +1698,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
#else
*fsec = frac;
#endif
+ tmask = DTK_ALL_SECS_M;
}
break;
@@ -2803,6 +2805,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
#else
*fsec += (val + fval) * 1e-6;
#endif
+ tmask = DTK_M(MICROSECOND);
break;
case DTK_MILLISEC:
@@ -2811,6 +2814,7 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
#else
*fsec += (val + fval) * 1e-3;
#endif
+ tmask = DTK_M(MILLISECOND);
break;
case DTK_SECOND:
@@ -2820,7 +2824,15 @@ DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm,
#else
*fsec += fval;
#endif
- tmask = DTK_M(SECOND);
+ /*
+ * If any subseconds were specified, consider
+ * this microsecond and millisecond input as
+ * well.
+ */
+ if (fval == 0)
+ tmask = DTK_M(SECOND);
+ else
+ tmask = DTK_ALL_SECS_M;
break;
case DTK_MINUTE: