1
1
/* -----------------------------------------------------------------------
2
2
* formatting.c
3
3
*
4
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.20 2000/07 /2903:26:41 tgl Exp $
4
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.21 2000/08 /2904:41:47 momjian Exp $
5
5
*
6
6
*
7
7
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -344,24 +344,24 @@ static intNUMCounter = 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 intDCH_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