@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------
* formatting . c
*
* $ Header : / cvsroot / pgsql / src / backend / utils / adt / formatting . c , v 1.20 2000 / 07 / 29 03 : 26 : 41 tgl Exp $
* $ Header : / cvsroot / pgsql / src / backend / utils / adt / formatting . c , v 1.21 2000 / 08 / 29 04 : 41 : 47 momjian Exp $
*
*
* Portions Copyright ( c ) 1999 - 2000 , PostgreSQL , Inc
@ -344,24 +344,24 @@ static int NUMCounter = 0;
* - - - - - - - - - -
*/
typedef struct {
int hh , am , pm , mi , ss , ssss , d , dd , ddd , mm , yyyy , bc , ww , w , cc , q , j ;
int hh , am , pm , mi , ss , ssss , d , dd , ddd , mm , yyyy , bc , iw , ww , w , cc , q , j ;
} TmFromChar ;
# define ZERO_tmfc( _X ) \
do { \
( _X ) - > hh = ( _X ) - > am = ( _X ) - > pm = ( _X ) - > mi = ( _X ) - > ss = ( _X ) - > ssss = \
( _X ) - > d = ( _X ) - > dd = ( _X ) - > ddd = ( _X ) - > mm = ( _X ) - > yyyy = ( _X ) - > bc = \
( _X ) - > ww = ( _X ) - > w = ( _X ) - > cc = ( _X ) - > q = ( _X ) - > j = 0 ; \
( _X ) - > iw = ( _X ) - > ww = ( _X ) - > w = ( _X ) - > cc = ( _X ) - > q = ( _X ) - > j = 0 ; \
} while ( 0 )
# ifdef DEBUG_TO_FROM_CHAR
# define NOTICE_TMFC \
elog ( DEBUG_elog_output , " TMFC: \n hh %d \n am %d \n pm %d \n mi %d \n ss %d \n ssss %d \n d %d \n dd %d \n ddd %d \n mm %d \n yyyy %d \n bc %d \n ww %d \n w %d \n cc %d \n q %d \n j %d " , \
elog ( DEBUG_elog_output , " TMFC: \n hh %d \n am %d \n pm %d \n mi %d \n ss %d \n ssss %d \n d %d \n dd %d \n ddd %d \n mm %d \n yyyy %d \n bc %d \n iw %d \n ww %d \n w %d \n cc %d \n q %d \n j %d " , \
tmfc - > hh , tmfc - > am , tmfc - > pm , tmfc - > mi , tmfc - > ss , \
tmfc - > ssss , tmfc - > d , tmfc - > dd , tmfc - > ddd , tmfc - > mm , \
tmfc - > yyyy , tmfc - > bc , tmfc - > ww , tmfc - > w , tmfc - > cc , \
tmfc - > q , tmfc - > j ) ;
tmfc - > yyyy , tmfc - > bc , tmfc - > iw , tmfc - > ww , tmfc - > w , \
tmfc - > cc , tmfc - > q , tmfc - > j ) ;
# define NOTICE_TM \
elog ( DEBUG_elog_output , " TM: \n sec %d \n year %d \n min %d \n wday %d \n hour %d \n yday %d \n mday %d \n nisdst %d \n mon %d \n " , \
@ -487,6 +487,7 @@ typedef enum
DCH_HH24 ,
DCH_HH12 ,
DCH_HH ,
DCH_IW ,
DCH_J ,
DCH_MI ,
DCH_MM ,
@ -524,6 +525,7 @@ typedef enum
DCH_hh24 ,
DCH_hh12 ,
DCH_hh ,
DCH_iw ,
DCH_j ,
DCH_mi ,
DCH_mm ,
@ -615,6 +617,7 @@ static KeyWord DCH_keywords[] = {
{ " HH24 " , 4 , dch_time , DCH_HH24 } , /* H */
{ " HH12 " , 4 , dch_time , DCH_HH12 } ,
{ " HH " , 2 , dch_time , DCH_HH } ,
{ " IW " , 2 , dch_date , DCH_IW } , /* I */
{ " J " , 1 , dch_date , DCH_J } , /* J */
{ " MI " , 2 , dch_time , DCH_MI } ,
{ " MM " , 2 , dch_date , DCH_MM } ,
@ -652,6 +655,7 @@ static KeyWord DCH_keywords[] = {
{ " hh24 " , 4 , dch_time , DCH_HH24 } , /* h */
{ " hh12 " , 4 , dch_time , DCH_HH12 } ,
{ " hh " , 2 , dch_time , DCH_HH } ,
{ " iw " , 2 , dch_date , DCH_IW } , /* i */
{ " j " , 1 , dch_time , DCH_J } , /* j */
{ " mi " , 2 , dch_time , DCH_MI } , /* m */
{ " mm " , 2 , dch_date , DCH_MM } ,
@ -735,10 +739,10 @@ static int DCH_index[KeyWord_INDEX_SIZE] = {
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , DCH_A_D , DCH_B_C , DCH_CC , DCH_DAY , - 1 ,
DCH_FX , - 1 , DCH_HH24 , - 1 , DCH_J , - 1 , - 1 , DCH_MI , - 1 , - 1 ,
DCH_FX , - 1 , DCH_HH24 , DCH_IW , DCH_J , - 1 , - 1 , DCH_MI , - 1 , - 1 ,
DCH_P_M , DCH_Q , DCH_RM , DCH_SSSS , DCH_TZ , - 1 , - 1 , DCH_WW , - 1 , DCH_Y_YYY ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , DCH_a_d , DCH_b_c , DCH_cc ,
DCH_day , - 1 , DCH_fx , - 1 , DCH_hh24 , - 1 , DCH_j , - 1 , - 1 , DCH_mi ,
DCH_day , - 1 , DCH_fx , - 1 , DCH_hh24 , DCH_iw , DCH_j , - 1 , - 1 , DCH_mi ,
- 1 , - 1 , DCH_p_m , DCH_q , DCH_rm , DCH_ssss , DCH_tz , - 1 , - 1 , DCH_ww ,
- 1 , DCH_y_yyy , - 1 , - 1 , - 1 , - 1
@ -2087,6 +2091,33 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node)
}
}
break ;
case DCH_IW :
if ( flag = = TO_CHAR )
{
sprintf ( inout , " %0*d " , S_FM ( suf ) ? 0 : 2 ,
date2isoweek ( tm - > tm_year , tm - > tm_mon , tm - > tm_mday ) ) ;
if ( S_THth ( suf ) )
str_numth ( p_inout , inout , S_TH_TYPE ( suf ) ) ;
if ( S_FM ( suf ) | | S_THth ( suf ) )
return strlen ( p_inout ) - 1 ;
else
return 1 ;
}
else if ( flag = = FROM_CHAR )
{
if ( S_FM ( suf ) )
{
sscanf ( inout , " %d " , & tmfc - > iw ) ;
return int4len ( ( int4 ) tmfc - > iw ) - 1 + SKIP_THth ( suf ) ;
}
else
{
sscanf ( inout , " %02d " , & tmfc - > iw ) ;
return 1 + SKIP_THth ( suf ) ;
}
}
break ;
case DCH_Q :
if ( flag = = TO_CHAR )
{
@ -2687,19 +2718,29 @@ to_timestamp(PG_FUNCTION_ARGS)
case 4 : tm - > tm_mday = 1 ; tm - > tm_mon = 10 ; break ;
}
if ( tmfc - > j )
j2date ( tmfc - > j , & tm - > tm_year , & tm - > tm_mon , & tm - > tm_mday ) ;
if ( tmfc - > yyyy )
tm - > tm_year = tmfc - > yyyy ;
if ( tmfc - > j )
j2date ( tmfc - > j , & tm - > tm_year , & tm - > tm_mon , & tm - > tm_mday ) ;
if ( tmfc - > bc & & tm - > tm_year > 0 )
tm - > tm_year = - ( tm - > tm_year ) ;
if ( tm - > tm_year < 0 )
tm - > tm_year = tm - > tm_year + 1 ;
if ( tmfc - > iw )
isoweek2date ( tmfc - > iw , & tm - > tm_year , & tm - > tm_mon , & tm - > tm_mday ) ;
if ( tmfc - > d ) tm - > tm_wday = tmfc - > d ;
if ( tmfc - > dd ) tm - > tm_mday = tmfc - > dd ;
if ( tmfc - > ddd ) tm - > tm_yday = tmfc - > ddd ;
if ( tmfc - > mm ) tm - > tm_mon = tmfc - > mm ;
/*
* we not ignore DDD
*/
if ( tmfc - > ddd & & ( tm - > tm_mon < = 1 | | tm - > tm_mday < = 1 ) )
{
/* count mday and mon from yday */
@ -2726,6 +2767,7 @@ to_timestamp(PG_FUNCTION_ARGS)
tm - > tm_mday = i = = 0 ? tm - > tm_yday :
tm - > tm_yday - y [ i - 1 ] ;
}
/* -------------------------------------------------------------- */
# ifdef DEBUG_TO_FROM_CHAR