Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdffd8ca

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 parentd4f6265 commitdffd8ca

File tree

5 files changed

+168
-60
lines changed

5 files changed

+168
-60
lines changed

‎doc/src/sgml/func.sgml

Lines changed: 13 additions & 0 deletions
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

Lines changed: 67 additions & 25 deletions
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/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 $
55
*
66
*
77
* Portions Copyright (c) 1999-2000, PostgreSQL, Inc
@@ -344,24 +344,24 @@ static intNUMCounter = 0;
344344
* ----------
345345
*/
346346
typedefstruct {
347-
inthh,am,pm,mi,ss,ssss,d,dd,ddd,mm,yyyy,bc,ww,w,cc,q,j;
347+
inthh,am,pm,mi,ss,ssss,d,dd,ddd,mm,yyyy,bc,iw,ww,w,cc,q,j;
348348
}TmFromChar;
349349

350350
#defineZERO_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
#ifdefDEBUG_TO_FROM_CHAR
358358

359359
#defineNOTICE_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
#defineNOTICE_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
staticKeyWordDCH_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 intDCH_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
staticint
@@ -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
return1+SKIP_THth(suf);
20872091
}
20882092
}
2093+
break;
2094+
caseDCH_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+
returnstrlen(p_inout)-1;
2103+
else
2104+
return1;
2105+
2106+
}
2107+
elseif (flag==FROM_CHAR)
2108+
{
2109+
if (S_FM(suf))
2110+
{
2111+
sscanf(inout,"%d",&tmfc->iw);
2112+
returnint4len((int4)tmfc->iw)-1+SKIP_THth(suf);
2113+
}
2114+
else
2115+
{
2116+
sscanf(inout,"%02d",&tmfc->iw);
2117+
return1+SKIP_THth(suf);
2118+
}
2119+
}
20892120
break;
20902121
caseDCH_Q:
20912122
if (flag==TO_CHAR)
@@ -2687,19 +2718,29 @@ to_timestamp(PG_FUNCTION_ARGS)
26872718
case4: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
#ifdefDEBUG_TO_FROM_CHAR

‎src/backend/utils/adt/pg_locale.c

Lines changed: 8 additions & 4 deletions
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/2901:19:36 momjian Exp $
5+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v 1.6 2000/08/2904: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+
staticstructlconv*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_LocaleCategorieslc;
122-
structlconv*lconv;
124+
125+
if (CurrentLocaleConv)
126+
returnCurrentLocaleConv;
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-
returnlconv;
140+
returnCurrentLocaleConv;
137141
}
138142

139143

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp