1
1
/* -----------------------------------------------------------------------
2
2
* formatting.c
3
3
*
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 $
5
5
*
6
6
*
7
7
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -344,24 +344,24 @@ static int NUMCounter = 0;
344
344
* ----------
345
345
*/
346
346
typedef 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 ;
348
348
} TmFromChar ;
349
349
350
350
#define ZERO_tmfc ( _X ) \
351
351
do { \
352
352
(_X)->hh= (_X)->am= (_X)->pm= (_X)->mi= (_X)->ss= (_X)->ssss= \
353
353
(_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; \
355
355
} while(0)
356
356
357
357
#ifdef DEBUG_TO_FROM_CHAR
358
358
359
359
#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", \
361
361
tmfc->hh, tmfc->am, tmfc->pm, tmfc->mi, tmfc->ss, \
362
362
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);
365
365
366
366
#define NOTICE_TM \
367
367
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
487
487
DCH_HH24 ,
488
488
DCH_HH12 ,
489
489
DCH_HH ,
490
+ DCH_IW ,
490
491
DCH_J ,
491
492
DCH_MI ,
492
493
DCH_MM ,
@@ -524,6 +525,7 @@ typedef enum
524
525
DCH_hh24 ,
525
526
DCH_hh12 ,
526
527
DCH_hh ,
528
+ DCH_iw ,
527
529
DCH_j ,
528
530
DCH_mi ,
529
531
DCH_mm ,
@@ -596,14 +598,14 @@ typedef enum
596
598
* ----------
597
599
*/
598
600
static KeyWord DCH_keywords [] = {
599
- /* keyword, len, func. type is in Index */
601
+ /* keyword,len,func.type is in Index */
600
602
{"A.D." , 4 , dch_date , DCH_A_D }, /* A */
601
603
{"A.M." , 4 , dch_time , DCH_A_M },
602
604
{"AD" , 2 , dch_date , DCH_AD },
603
605
{"AM" , 2 , dch_time , DCH_AM },
604
606
{"B.C." , 4 , dch_date , DCH_B_C }, /* B */
605
607
{"BC" , 2 , dch_date , DCH_BC },
606
- {"CC" , 2 , dch_date , DCH_CC },/* C */
608
+ {"CC" , 2 , dch_date , DCH_CC }, /* C */
607
609
{"DAY" , 3 , dch_date , DCH_DAY }, /* D */
608
610
{"DDD" , 3 , dch_date , DCH_DDD },
609
611
{"DD" , 2 , dch_date , DCH_DD },
@@ -615,7 +617,8 @@ static KeyWord DCH_keywords[] = {
615
617
{"HH24" , 4 , dch_time , DCH_HH24 }, /* H */
616
618
{"HH12" , 4 , dch_time , DCH_HH12 },
617
619
{"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 */
619
622
{"MI" , 2 , dch_time , DCH_MI },
620
623
{"MM" , 2 , dch_date , DCH_MM },
621
624
{"MONTH" , 5 , dch_date , DCH_MONTH },
@@ -624,12 +627,12 @@ static KeyWord DCH_keywords[] = {
624
627
{"Mon" , 3 , dch_date , DCH_Mon },
625
628
{"P.M." , 4 , dch_time , DCH_P_M }, /* P */
626
629
{"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 */
629
632
{"SSSS" , 4 , dch_time , DCH_SSSS }, /* S */
630
633
{"SS" , 2 , dch_time , DCH_SS },
631
634
{"TZ" , 2 , dch_time , DCH_TZ }, /* T */
632
- {"WW" , 2 , dch_date , DCH_WW },/* W */
635
+ {"WW" , 2 , dch_date , DCH_WW }, /* W */
633
636
{"W" , 1 , dch_date , DCH_W },
634
637
{"Y,YYY" , 5 , dch_date , DCH_Y_YYY }, /* Y */
635
638
{"YYYY" , 4 , dch_date , DCH_YYYY },
@@ -642,7 +645,7 @@ static KeyWord DCH_keywords[] = {
642
645
{"am" , 2 , dch_time , DCH_am },
643
646
{"b.c." , 4 , dch_date , DCH_b_c }, /* b */
644
647
{"bc" , 2 , dch_date , DCH_bc },
645
- {"cc" , 2 , dch_date , DCH_CC },/* c */
648
+ {"cc" , 2 , dch_date , DCH_CC }, /* c */
646
649
{"day" , 3 , dch_date , DCH_day }, /* d */
647
650
{"ddd" , 3 , dch_date , DCH_DDD },
648
651
{"dd" , 2 , dch_date , DCH_DD },
@@ -652,19 +655,20 @@ static KeyWord DCH_keywords[] = {
652
655
{"hh24" , 4 , dch_time , DCH_HH24 }, /* h */
653
656
{"hh12" , 4 , dch_time , DCH_HH12 },
654
657
{"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 */
657
661
{"mm" , 2 , dch_date , DCH_MM },
658
662
{"month" , 5 , dch_date , DCH_month },
659
663
{"mon" , 3 , dch_date , DCH_mon },
660
664
{"p.m." , 4 , dch_time , DCH_p_m }, /* p */
661
665
{"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 */
664
668
{"ssss" , 4 , dch_time , DCH_SSSS }, /* s */
665
669
{"ss" , 2 , dch_time , DCH_SS },
666
670
{"tz" , 2 , dch_time , DCH_tz }, /* t */
667
- {"ww" , 2 , dch_date , DCH_WW },/* w */
671
+ {"ww" , 2 , dch_date , DCH_WW }, /* w */
668
672
{"w" , 1 , dch_date , DCH_W },
669
673
{"y,yyy" , 5 , dch_date , DCH_Y_YYY }, /* y */
670
674
{"yyyy" , 4 , dch_date , DCH_YYYY },
@@ -735,10 +739,10 @@ static int DCH_index[KeyWord_INDEX_SIZE] = {
735
739
-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
736
740
-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
737
741
-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 ,
739
743
DCH_P_M , DCH_Q , DCH_RM , DCH_SSSS , DCH_TZ , -1 , -1 , DCH_WW , -1 , DCH_Y_YYY ,
740
744
-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 ,
742
746
-1 , -1 , DCH_p_m , DCH_q , DCH_rm , DCH_ssss , DCH_tz , -1 , -1 , DCH_ww ,
743
747
-1 , DCH_y_yyy , -1 , -1 , -1 , -1
744
748
@@ -1526,8 +1530,8 @@ dch_global(int arg, char *inout, int suf, int flag, FormatNode *node)
1526
1530
1527
1531
/* ----------
1528
1532
* 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
1531
1535
* ----------
1532
1536
*/
1533
1537
static int
@@ -1772,7 +1776,7 @@ do { \
1772
1776
1773
1777
/* ----------
1774
1778
* Master of DATE for:
1775
- * TO_CHAR - write (inout) formated string
1779
+ * TO_CHAR - write (inout) formated string
1776
1780
* FROM_CHAR - scan (inout) string by course of FormatNode
1777
1781
* ----------
1778
1782
*/
@@ -2086,6 +2090,33 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node)
2086
2090
return 1 + SKIP_THth (suf );
2087
2091
}
2088
2092
}
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
+ }
2089
2120
break ;
2090
2121
case DCH_Q :
2091
2122
if (flag == TO_CHAR )
@@ -2687,19 +2718,29 @@ to_timestamp(PG_FUNCTION_ARGS)
2687
2718
case 4 : tm -> tm_mday = 1 ; tm -> tm_mon = 10 ; break ;
2688
2719
}
2689
2720
2690
- if (tmfc -> j )
2691
- j2date (tmfc -> j , & tm -> tm_year , & tm -> tm_mon , & tm -> tm_mday );
2692
2721
if (tmfc -> yyyy )
2693
2722
tm -> tm_year = tmfc -> yyyy ;
2723
+
2724
+ if (tmfc -> j )
2725
+ j2date (tmfc -> j , & tm -> tm_year , & tm -> tm_mon , & tm -> tm_mday );
2726
+
2694
2727
if (tmfc -> bc && tm -> tm_year > 0 )
2695
2728
tm -> tm_year = - (tm -> tm_year );
2729
+
2696
2730
if (tm -> tm_year < 0 )
2697
2731
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
+
2698
2736
if (tmfc -> d ) tm -> tm_wday = tmfc -> d ;
2699
2737
if (tmfc -> dd ) tm -> tm_mday = tmfc -> dd ;
2700
2738
if (tmfc -> ddd ) tm -> tm_yday = tmfc -> ddd ;
2701
2739
if (tmfc -> mm ) tm -> tm_mon = tmfc -> mm ;
2702
2740
2741
+ /*
2742
+ * we not ignore DDD
2743
+ */
2703
2744
if (tmfc -> ddd && (tm -> tm_mon <=1 || tm -> tm_mday <=1 ))
2704
2745
{
2705
2746
/* count mday and mon from yday */
@@ -2726,6 +2767,7 @@ to_timestamp(PG_FUNCTION_ARGS)
2726
2767
tm -> tm_mday = i == 0 ? tm -> tm_yday :
2727
2768
tm -> tm_yday - y [i - 1 ];
2728
2769
}
2770
+
2729
2771
/* -------------------------------------------------------------- */
2730
2772
2731
2773
#ifdef DEBUG_TO_FROM_CHAR
0 commit comments