Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit dffd8ca

Browse files
committed
* to_char:
- full support for IW (ISO week) and vice versa conversion for IW too (the to_char 'week' support is now complete and I hope correct). Thomas, I use for IW code from timestamp.c, for this I create separate function date2isoweek() from original 'case DTK_WEEK:' code in the timestamp_part(). I mean will better use one code for same feature in date_part() and in to_char(). The isoweek2date() is added to timestamp.c too. Right? IMHO in 7.1 will all to_char's features complete. It is cca 41 templates for date/time and cca 21 for numbers. * to_ascii: - gcc, is it correct now? :-) In the patch is documentation for to_char's IW and for to_ascii(). Karel
1 parent d4f6265 commit dffd8ca

File tree

5 files changed

+168
-60
lines changed

5 files changed

+168
-60
lines changed

doc/src/sgml/func.sgml

+13
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,12 @@
355355
</row>
356356
</thead>
357357
<tbody>
358+
<row>
359+
<entry>to_ascii(text [,name|int])</entry>
360+
<entry>text</entry>
361+
<entry>convert text from multibyte encoding to ASCII</entry>
362+
<entry>to_ascii('Karel')</entry>
363+
</row>
358364
<row>
359365
<entry>char(text)</entry>
360366
<entry>char</entry>
@@ -447,6 +453,9 @@
447453
<para>
448454
Most functions explicitly defined for text will work for char() and varchar() arguments.
449455
</para>
456+
<para>
457+
The to_ascii() support conversion from LATIN1, LATIN2, WIN1250 (CP1250) only.
458+
</para>
450459
</sect1>
451460

452461
<sect1>
@@ -803,6 +812,10 @@
803812
<entry>WW</entry>
804813
<entry>week number of year (1-53) where first week start on the first day of the year</entry>
805814
</row>
815+
<row>
816+
<entry>IW</entry>
817+
<entry>ISO week number of year</entry>
818+
</row>
806819
<row>
807820
<entry>CC</entry>
808821
<entry>century (2 digits)</entry>

src/backend/utils/adt/formatting.c

+67-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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
*/
346346
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;
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
*/
598600
static 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
*/
15331537
static 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

src/backend/utils/adt/pg_locale.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/* -----------------------------------------------------------------------
33
* pg_locale.c
44
*
5-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v 1.5 2000/06/29 01:19:36 momjian Exp $
5+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v 1.6 2000/08/29 04:41:47 momjian Exp $
66
*
77
*
88
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -26,6 +26,8 @@
2626
/* #define DEBUG_LOCALE_UTILS */
2727

2828

29+
static struct lconv *CurrentLocaleConv = NULL;
30+
2931
/*------
3032
* Return in PG_LocaleCategories current locale setting
3133
*------
@@ -119,7 +121,9 @@ struct lconv *
119121
PGLC_localeconv(void)
120122
{
121123
PG_LocaleCategories lc;
122-
struct lconv *lconv;
124+
125+
if (CurrentLocaleConv)
126+
return CurrentLocaleConv;
123127

124128
/* Save current locale setting to lc */
125129
PGLC_current(&lc);
@@ -128,12 +132,12 @@ PGLC_localeconv(void)
128132
setlocale(LC_ALL, "");
129133

130134
/* Get numeric formatting information */
131-
lconv = localeconv();
135+
CurrentLocaleConv = localeconv();
132136

133137
/* Set previous original locale */
134138
PGLC_setlocale(&lc);
135139

136-
return lconv;
140+
return CurrentLocaleConv;
137141
}
138142

139143

0 commit comments

Comments
 (0)