11/* -----------------------------------------------------------------------
22 * formatting.c
33 *
4- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.20 2000/07 /29 03:26:41 tgl Exp $
4+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.21 2000/08 /29 04:41:47 momjian Exp $
55 *
66 *
77 * Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -344,24 +344,24 @@ static int NUMCounter = 0;
344344 * ----------
345345 */
346346typedef struct {
347- int hh , am , pm , mi , ss , ssss , d , dd , ddd , mm , yyyy , bc , ww , w , cc , q , j ;
347+ int hh , am , pm , mi , ss , ssss , d , dd , ddd , mm , yyyy , bc , iw , ww , w , cc , q , j ;
348348} TmFromChar ;
349349
350350#define ZERO_tmfc ( _X ) \
351351 do { \
352352 (_X)->hh= (_X)->am= (_X)->pm= (_X)->mi= (_X)->ss= (_X)->ssss= \
353353 (_X)->d= (_X)->dd= (_X)->ddd= (_X)->mm= (_X)->yyyy= (_X)->bc= \
354- (_X)->ww= (_X)->w= (_X)->cc= (_X)->q= (_X)->j= 0; \
354+ (_X)->iw= (_X)-> ww= (_X)->w= (_X)->cc= (_X)->q= (_X)->j= 0; \
355355 } while(0)
356356
357357#ifdef DEBUG_TO_FROM_CHAR
358358
359359#define NOTICE_TMFC \
360- elog(DEBUG_elog_output, "TMFC:\nhh %d\nam %d\npm %d\nmi %d\nss %d\nssss %d\nd %d\ndd %d\nddd %d\nmm %d\nyyyy %d\nbc %d\nww %d\nw %d\ncc %d\nq %d\nj %d", \
360+ elog(DEBUG_elog_output, "TMFC:\nhh %d\nam %d\npm %d\nmi %d\nss %d\nssss %d\nd %d\ndd %d\nddd %d\nmm %d\nyyyy %d\nbc %d\niw %d\ nww %d\nw %d\ncc %d\nq %d\nj %d", \
361361 tmfc->hh, tmfc->am, tmfc->pm, tmfc->mi, tmfc->ss, \
362362 tmfc->ssss, tmfc->d, tmfc->dd, tmfc->ddd, tmfc->mm, \
363- tmfc->yyyy, tmfc->bc, tmfc->ww , tmfc->w , tmfc->cc , \
364- tmfc->q, tmfc->j);
363+ tmfc->yyyy, tmfc->bc, tmfc->iw , tmfc->ww , tmfc->w , \
364+ tmfc->cc, tmfc-> q, tmfc->j);
365365
366366#define NOTICE_TM \
367367 elog(DEBUG_elog_output, "TM:\nsec %d\nyear %d\nmin %d\nwday %d\nhour %d\nyday %d\nmday %d\nnisdst %d\nmon %d\n",\
@@ -487,6 +487,7 @@ typedef enum
487487 DCH_HH24 ,
488488 DCH_HH12 ,
489489 DCH_HH ,
490+ DCH_IW ,
490491 DCH_J ,
491492 DCH_MI ,
492493 DCH_MM ,
@@ -524,6 +525,7 @@ typedef enum
524525 DCH_hh24 ,
525526 DCH_hh12 ,
526527 DCH_hh ,
528+ DCH_iw ,
527529 DCH_j ,
528530 DCH_mi ,
529531 DCH_mm ,
@@ -596,14 +598,14 @@ typedef enum
596598 * ----------
597599 */
598600static KeyWord DCH_keywords [] = {
599- /* keyword, len, func. type is in Index */
601+ /* keyword,len,func.type is in Index */
600602 {"A.D." , 4 , dch_date , DCH_A_D }, /* A */
601603 {"A.M." , 4 , dch_time , DCH_A_M },
602604 {"AD" , 2 , dch_date , DCH_AD },
603605 {"AM" , 2 , dch_time , DCH_AM },
604606 {"B.C." , 4 , dch_date , DCH_B_C }, /* B */
605607 {"BC" , 2 , dch_date , DCH_BC },
606- {"CC" , 2 , dch_date , DCH_CC },/* C */
608+ {"CC" , 2 , dch_date , DCH_CC }, /* C */
607609 {"DAY" , 3 , dch_date , DCH_DAY }, /* D */
608610 {"DDD" , 3 , dch_date , DCH_DDD },
609611 {"DD" , 2 , dch_date , DCH_DD },
@@ -615,7 +617,8 @@ static KeyWord DCH_keywords[] = {
615617 {"HH24" , 4 , dch_time , DCH_HH24 }, /* H */
616618 {"HH12" , 4 , dch_time , DCH_HH12 },
617619 {"HH" , 2 , dch_time , DCH_HH },
618- {"J" , 1 , dch_date , DCH_J }, /* J */
620+ {"IW" , 2 , dch_date , DCH_IW }, /* I */
621+ {"J" , 1 , dch_date , DCH_J }, /* J */
619622 {"MI" , 2 , dch_time , DCH_MI },
620623 {"MM" , 2 , dch_date , DCH_MM },
621624 {"MONTH" , 5 , dch_date , DCH_MONTH },
@@ -624,12 +627,12 @@ static KeyWord DCH_keywords[] = {
624627 {"Mon" , 3 , dch_date , DCH_Mon },
625628 {"P.M." , 4 , dch_time , DCH_P_M }, /* P */
626629 {"PM" , 2 , dch_time , DCH_PM },
627- {"Q" , 1 , dch_date , DCH_Q }, /* Q */
628- {"RM" , 2 , dch_date , DCH_RM },/* R */
630+ {"Q" , 1 , dch_date , DCH_Q }, /* Q */
631+ {"RM" , 2 , dch_date , DCH_RM }, /* R */
629632 {"SSSS" , 4 , dch_time , DCH_SSSS }, /* S */
630633 {"SS" , 2 , dch_time , DCH_SS },
631634 {"TZ" , 2 , dch_time , DCH_TZ }, /* T */
632- {"WW" , 2 , dch_date , DCH_WW },/* W */
635+ {"WW" , 2 , dch_date , DCH_WW }, /* W */
633636 {"W" , 1 , dch_date , DCH_W },
634637 {"Y,YYY" , 5 , dch_date , DCH_Y_YYY }, /* Y */
635638 {"YYYY" , 4 , dch_date , DCH_YYYY },
@@ -642,7 +645,7 @@ static KeyWord DCH_keywords[] = {
642645 {"am" , 2 , dch_time , DCH_am },
643646 {"b.c." , 4 , dch_date , DCH_b_c }, /* b */
644647 {"bc" , 2 , dch_date , DCH_bc },
645- {"cc" , 2 , dch_date , DCH_CC },/* c */
648+ {"cc" , 2 , dch_date , DCH_CC }, /* c */
646649 {"day" , 3 , dch_date , DCH_day }, /* d */
647650 {"ddd" , 3 , dch_date , DCH_DDD },
648651 {"dd" , 2 , dch_date , DCH_DD },
@@ -652,19 +655,20 @@ static KeyWord DCH_keywords[] = {
652655 {"hh24" , 4 , dch_time , DCH_HH24 }, /* h */
653656 {"hh12" , 4 , dch_time , DCH_HH12 },
654657 {"hh" , 2 , dch_time , DCH_HH },
655- {"j" , 1 , dch_time , DCH_J }, /* j */
656- {"mi" , 2 , dch_time , DCH_MI },/* m */
658+ {"iw" , 2 , dch_date , DCH_IW }, /* i */
659+ {"j" , 1 , dch_time , DCH_J }, /* j */
660+ {"mi" , 2 , dch_time , DCH_MI }, /* m */
657661 {"mm" , 2 , dch_date , DCH_MM },
658662 {"month" , 5 , dch_date , DCH_month },
659663 {"mon" , 3 , dch_date , DCH_mon },
660664 {"p.m." , 4 , dch_time , DCH_p_m }, /* p */
661665 {"pm" , 2 , dch_time , DCH_pm },
662- {"q" , 1 , dch_date , DCH_Q }, /* q */
663- {"rm" , 2 , dch_date , DCH_rm },/* r */
666+ {"q" , 1 , dch_date , DCH_Q }, /* q */
667+ {"rm" , 2 , dch_date , DCH_rm }, /* r */
664668 {"ssss" , 4 , dch_time , DCH_SSSS }, /* s */
665669 {"ss" , 2 , dch_time , DCH_SS },
666670 {"tz" , 2 , dch_time , DCH_tz }, /* t */
667- {"ww" , 2 , dch_date , DCH_WW },/* w */
671+ {"ww" , 2 , dch_date , DCH_WW }, /* w */
668672 {"w" , 1 , dch_date , DCH_W },
669673 {"y,yyy" , 5 , dch_date , DCH_Y_YYY }, /* y */
670674 {"yyyy" , 4 , dch_date , DCH_YYYY },
@@ -735,10 +739,10 @@ static int DCH_index[KeyWord_INDEX_SIZE] = {
735739 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
736740 -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
737741 -1 , -1 , -1 , -1 , -1 , DCH_A_D , DCH_B_C , DCH_CC , DCH_DAY , -1 ,
738- DCH_FX , -1 , DCH_HH24 , -1 , DCH_J , -1 , -1 , DCH_MI , -1 , -1 ,
742+ DCH_FX , -1 , DCH_HH24 , DCH_IW , DCH_J , -1 , -1 , DCH_MI , -1 , -1 ,
739743 DCH_P_M , DCH_Q , DCH_RM , DCH_SSSS , DCH_TZ , -1 , -1 , DCH_WW , -1 , DCH_Y_YYY ,
740744 -1 , -1 , -1 , -1 , -1 , -1 , -1 , DCH_a_d , DCH_b_c , DCH_cc ,
741- DCH_day , -1 , DCH_fx , -1 , DCH_hh24 , -1 , DCH_j , -1 , -1 , DCH_mi ,
745+ DCH_day , -1 , DCH_fx , -1 , DCH_hh24 , DCH_iw , DCH_j , -1 , -1 , DCH_mi ,
742746 -1 , -1 , DCH_p_m , DCH_q , DCH_rm , DCH_ssss , DCH_tz , -1 , -1 , DCH_ww ,
743747 -1 , DCH_y_yyy , -1 , -1 , -1 , -1
744748
@@ -1526,8 +1530,8 @@ dch_global(int arg, char *inout, int suf, int flag, FormatNode *node)
15261530
15271531/* ----------
15281532 * Master function of TIME for:
1529- * TO_CHAR - write (inout) formated string
1530- * FROM_CHAR - scan (inout) string by course of FormatNode
1533+ * TO_CHAR - write (inout) formated string
1534+ * FROM_CHAR - scan (inout) string by course of FormatNode
15311535 * ----------
15321536 */
15331537static int
@@ -1772,7 +1776,7 @@ do { \
17721776
17731777/* ----------
17741778 * Master of DATE for:
1775- * TO_CHAR - write (inout) formated string
1779+ * TO_CHAR - write (inout) formated string
17761780 * FROM_CHAR - scan (inout) string by course of FormatNode
17771781 * ----------
17781782 */
@@ -2086,6 +2090,33 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node)
20862090 return 1 + SKIP_THth (suf );
20872091 }
20882092 }
2093+ break ;
2094+ case DCH_IW :
2095+ if (flag == TO_CHAR )
2096+ {
2097+ sprintf (inout , "%0*d" , S_FM (suf ) ? 0 : 2 ,
2098+ date2isoweek (tm -> tm_year , tm -> tm_mon , tm -> tm_mday ));
2099+ if (S_THth (suf ))
2100+ str_numth (p_inout , inout , S_TH_TYPE (suf ));
2101+ if (S_FM (suf ) || S_THth (suf ))
2102+ return strlen (p_inout ) - 1 ;
2103+ else
2104+ return 1 ;
2105+
2106+ }
2107+ else if (flag == FROM_CHAR )
2108+ {
2109+ if (S_FM (suf ))
2110+ {
2111+ sscanf (inout , "%d" , & tmfc -> iw );
2112+ return int4len ((int4 ) tmfc -> iw ) - 1 + SKIP_THth (suf );
2113+ }
2114+ else
2115+ {
2116+ sscanf (inout , "%02d" , & tmfc -> iw );
2117+ return 1 + SKIP_THth (suf );
2118+ }
2119+ }
20892120 break ;
20902121 case DCH_Q :
20912122 if (flag == TO_CHAR )
@@ -2687,19 +2718,29 @@ to_timestamp(PG_FUNCTION_ARGS)
26872718 case 4 : tm -> tm_mday = 1 ; tm -> tm_mon = 10 ; break ;
26882719 }
26892720
2690- if (tmfc -> j )
2691- j2date (tmfc -> j , & tm -> tm_year , & tm -> tm_mon , & tm -> tm_mday );
26922721 if (tmfc -> yyyy )
26932722 tm -> tm_year = tmfc -> yyyy ;
2723+
2724+ if (tmfc -> j )
2725+ j2date (tmfc -> j , & tm -> tm_year , & tm -> tm_mon , & tm -> tm_mday );
2726+
26942727 if (tmfc -> bc && tm -> tm_year > 0 )
26952728 tm -> tm_year = - (tm -> tm_year );
2729+
26962730 if (tm -> tm_year < 0 )
26972731 tm -> tm_year = tm -> tm_year + 1 ;
2732+
2733+ if (tmfc -> iw )
2734+ isoweek2date (tmfc -> iw , & tm -> tm_year , & tm -> tm_mon , & tm -> tm_mday );
2735+
26982736 if (tmfc -> d ) tm -> tm_wday = tmfc -> d ;
26992737 if (tmfc -> dd ) tm -> tm_mday = tmfc -> dd ;
27002738 if (tmfc -> ddd ) tm -> tm_yday = tmfc -> ddd ;
27012739 if (tmfc -> mm ) tm -> tm_mon = tmfc -> mm ;
27022740
2741+ /*
2742+ * we not ignore DDD
2743+ */
27032744 if (tmfc -> ddd && (tm -> tm_mon <=1 || tm -> tm_mday <=1 ))
27042745 {
27052746 /* count mday and mon from yday */
@@ -2726,6 +2767,7 @@ to_timestamp(PG_FUNCTION_ARGS)
27262767 tm -> tm_mday = i == 0 ? tm -> tm_yday :
27272768 tm -> tm_yday - y [i - 1 ];
27282769 }
2770+
27292771 /* -------------------------------------------------------------- */
27302772
27312773#ifdef DEBUG_TO_FROM_CHAR
0 commit comments