--- /dev/null
+
+1998 May 25
+
+ I extended locale support. Now ORDER BY (if PostgreSQL configured with
+--enable-locale) uses strcoll() for all text fields: char(n), varchar(n),
+text. (I am not sure about ORDER BY char2/char4/etc.)
+
+ I included test suite .../src/test/locale. I didn't include this in
+the regression test because not so much people require locale support. Read
+.../src/test/locale/README for details on the test suite.
+
+ Many thanks to Oleg Bartunov (oleg@sai.msu.su) and Thomas G. Lockhart
+(lockhart@alumni.caltech.edu) for hints, tips, help and discussion.
+
+Oleg.
+----
+ Oleg Broytmann http://members.tripod.com/~phd2/ phd2@earthling.net
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.33 1998/06/15 19:29:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.34 1998/06/16 06:41:50 momjian Exp $
*
*-------------------------------------------------------------------------
*/
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (cmp == 0)
return (len1 < len2);
else
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (0 == cmp)
return (bool) (len1 <= len2 ? 1 : 0);
else
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (cmp == 0)
return (len1 > len2);
else
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (0 == cmp)
return (bool) (len1 >= len2 ? 1 : 0);
else
len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2);
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if ((0 == cmp) && (len1 != len2))
return (int32) (len1 < len2 ? -1 : 1);
else
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (cmp == 0)
return (len1 < len2);
else
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (0 == cmp)
return (bool) (len1 <= len2 ? 1 : 0);
else
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (cmp == 0)
return (len1 > len2);
else
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
- cmp = strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if (0 == cmp)
return (bool) (len1 >= len2 ? 1 : 0);
else
len1 = VARSIZE(arg1) - VARHDRSZ;
len2 = VARSIZE(arg2) - VARHDRSZ;
- cmp = (strncmp(VARDATA(arg1), VARDATA(arg2), Min(len1, len2)));
+ cmp = varstr_cmp(VARDATA(arg1), len1, VARDATA(arg2), len2);
if ((0 == cmp) && (len1 != len2))
return (int32) (len1 < len2 ? -1 : 1);
else
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.36 1998/06/15 19:29:38 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.37 1998/06/16 06:41:51 momjian Exp $
*
*-------------------------------------------------------------------------
*/
return ((bool) !texteq(arg1, arg2));
}
-/* text_lt()
- * Comparison function for text strings.
+/* varstr_cmp()
+ * Comparison function for text strings with given lengths.
* Includes locale support, but must copy strings to temporary memory
* to allow null-termination for inputs to strcoll().
- * XXX HACK code for textlen() indicates that there can be embedded nulls
- * but it appears that most routines (incl. this one) assume not! - tgl 97/04/07
+ * Returns -1, 0 or 1
*/
-bool
-text_lt(text *arg1, text *arg2)
+int
+varstr_cmp(unsigned char *arg1, int len1, unsigned char *arg2, int len2)
{
- bool result;
-
-#ifdef USE_LOCALE
- int cval;
-
-#endif
- int len;
- unsigned char *a1p,
- *a2p;
-
- if (arg1 == NULL || arg2 == NULL)
- return ((bool) FALSE);
-
- len = (((VARSIZE(arg1) <= VARSIZE(arg2)) ? VARSIZE(arg1) : VARSIZE(arg2)) - VARHDRSZ);
+ int result;
+ unsigned char *a1p, *a2p;
#ifdef USE_LOCALE
- a1p = (unsigned char *) palloc(len + 1);
- a2p = (unsigned char *) palloc(len + 1);
+ a1p = (unsigned char *) palloc(len1 + 1);
+ a2p = (unsigned char *) palloc(len2 + 1);
- memcpy(a1p, VARDATA(arg1), len);
- *(a1p + len) = '\0';
- memcpy(a2p, VARDATA(arg2), len);
- *(a2p + len) = '\0';
+ memcpy(a1p, arg1, len1);
+ *(a1p + len1) = '\0';
+ memcpy(a2p, arg2, len2);
+ *(a2p + len2) = '\0';
- cval = strcoll(a1p, a2p);
- result = ((cval < 0) || ((cval == 0) && (VARSIZE(arg1) < VARSIZE(arg2))));
+ result = strcoll(a1p, a2p);
pfree(a1p);
pfree(a2p);
+
#else
- a1p = (unsigned char *) VARDATA(arg1);
- a2p = (unsigned char *) VARDATA(arg2);
- while (len != 0 && *a1p == *a2p)
- {
- a1p++;
- a2p++;
- len--;
- };
+ a1p = arg1;
+ a2p = arg2;
- result = (len ? (*a1p < *a2p) : (VARSIZE(arg1) < VARSIZE(arg2)));
+ result = strncmp(a1p, a2p, Min(len1, len2));
+ if ((result == 0) && (len1 != len2))
+ result = (len1 < len2) ? -1 : 1;
#endif
return (result);
-} /* text_lt() */
+} /* varstr_cmp() */
-/* text_le()
+/* text_cmp()
* Comparison function for text strings.
* Includes locale support, but must copy strings to temporary memory
* to allow null-termination for inputs to strcoll().
* XXX HACK code for textlen() indicates that there can be embedded nulls
* but it appears that most routines (incl. this one) assume not! - tgl 97/04/07
+ * Returns -1, 0 or 1
*/
-bool
-text_le(text *arg1, text *arg2)
+int
+text_cmp(text *arg1, text *arg2)
{
- bool result;
-
-#ifdef USE_LOCALE
- int cval;
-
-#endif
- int len;
- unsigned char *a1p,
- *a2p;
+ unsigned char *a1p, *a2p;
+ int len1, len2;
if (arg1 == NULL || arg2 == NULL)
- return ((bool) 0);
-
- len = (((VARSIZE(arg1) <= VARSIZE(arg2)) ? VARSIZE(arg1) : VARSIZE(arg2)) - VARHDRSZ);
-
-#ifdef USE_LOCALE
- a1p = (unsigned char *) palloc(len + 1);
- a2p = (unsigned char *) palloc(len + 1);
-
- memcpy(a1p, VARDATA(arg1), len);
- *(a1p + len) = '\0';
- memcpy(a2p, VARDATA(arg2), len);
- *(a2p + len) = '\0';
-
- cval = strcoll(a1p, a2p);
- result = ((cval < 0) || ((cval == 0) && (VARSIZE(arg1) <= VARSIZE(arg2))));
+ return ((bool) FALSE);
- pfree(a1p);
- pfree(a2p);
-#else
a1p = (unsigned char *) VARDATA(arg1);
a2p = (unsigned char *) VARDATA(arg2);
- while (len != 0 && *a1p == *a2p)
- {
- a1p++;
- a2p++;
- len--;
- };
+ len1 = VARSIZE(arg1) - VARHDRSZ;
+ len2 = VARSIZE(arg2) - VARHDRSZ;
- result = (len ? (*a1p <= *a2p) : (VARSIZE(arg1) <= VARSIZE(arg2)));
-#endif
+ return varstr_cmp(a1p, len1, a2p, len2);
+} /* text_cmp() */
- return (result);
+/* text_lt()
+ * Comparison function for text strings.
+ */
+bool
+text_lt(text *arg1, text *arg2)
+{
+ return (bool)(text_cmp(arg1, arg2) < 0);
+} /* text_lt() */
+
+/* text_le()
+ * Comparison function for text strings.
+ */
+bool
+text_le(text *arg1, text *arg2)
+{
+ return (bool)(text_cmp(arg1, arg2) <= 0);
} /* text_le() */
bool
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: builtins.h,v 1.43 1998/05/29 13:37:29 thomas Exp $
+ * $Id: builtins.h,v 1.44 1998/06/16 06:41:51 momjian Exp $
*
* NOTES
* This should normally only be included by fmgr.h.
extern text *textcat(text *arg1, text *arg2);
extern bool texteq(text *arg1, text *arg2);
extern bool textne(text *arg1, text *arg2);
+extern int varstr_cmp(unsigned char *arg1, int len1, unsigned char *arg2, int len2);
+extern int text_cmp(text *arg1, text *arg2);
extern bool text_lt(text *arg1, text *arg2);
extern bool text_le(text *arg1, text *arg2);
extern bool text_gt(text *arg1, text *arg2);
--- /dev/null
+#
+# Makefile for example programs
+#
+
+SRCDIR= ../..
+include ../../Makefile.global
+
+#
+# And where libpq goes, so goes the authentication stuff...
+#
+ifdef KRBVERS
+LDFLAGS+= $(KRBLIBS)
+CFLAGS+= $(KRBFLAGS)
+endif
+
+PROGS = test-pgsql-locale test-ctype
+DIRS = koi8-r
+
+all: $(PROGS)
+
+$(PROGS): % : %.c
+ $(CC) $(CFLAGS) -o $@ $@.c $(LDFLAGS)
+
+clean:
+ rm -f $(PROGS) *.out
+ for d in $(DIRS); do \
+ cd $$d; \
+ $(MAKE) clean; \
+ cd ..; \
+ done
+
+test-%: all
+ @cd `echo $@ | sed s/^test-//` && $(MAKE) test
--- /dev/null
+
+1998 May 25
+
+ This directory contains a set of tests for locales. I provided one C
+program test-ctype.c to test CTYPE support in libc and installed
+localedata. Then there are test-sort.pl and test-sort.py that tests
+collating. (Also there is test-sort.py but it is commented out in scripts;
+uncomment it if you have Python interpreter installed).
+ To run a test for some locale (koi8, e.g) run
+make all test-$locale
+ (for example)
+make all test-koi8
+
+ Currently, only tests for koi8 locale (russian cyrillic for UN*X)
+provided in koi8 directory. Script `runall' calls test-pgsql-locale to test
+whether locale support had been compiled into PotgreSQL, test-ctype to test
+libc and localedata, test-sort.pl (uncomment test-sort.py, if you have
+Python interpreter installed) and does tests on PostgreSQL with
+test-koi8*.sql.in.
+
+ To add locale tests one need to create directory $locale and create
+Makefile (and other files) similar to koi8-r/*. Actually, the simplest (I
+think) method is just copy koi8-r directory and edit/replace files.
+
+Oleg.
+----
+ Oleg Broytmann http://members.tripod.com/~phd2/ phd2@earthling.net
--- /dev/null
+#
+# Makefile for example programs
+#
+
+all:
+ -@echo "make: Nothing to be done for \`all'."
+
+test:
+ @./runall
+
+clean:
+ rm -f *.out
--- /dev/null
+char# char alnum alpha cntrl digit lower graph print punct space upper xdigit lo up
+chr#0 +
+chr#1 +
+chr#2 +
+chr#3 +
+chr#4 +
+chr#5 +
+chr#6 +
+chr#7 +
+chr#8 +
+chr#9 + +
+chr#10 + +
+chr#11 + +
+chr#12 + +
+chr#13 + +
+chr#14 +
+chr#15 +
+chr#16 +
+chr#17 +
+chr#18 +
+chr#19 +
+chr#20 +
+chr#21 +
+chr#22 +
+chr#23 +
+chr#24 +
+chr#25 +
+chr#26 +
+chr#27 +
+chr#28 +
+chr#29 +
+chr#30 +
+chr#31 +
+chr#32 + +
+chr#33 ! + + + ! !
+chr#34 " + + + " "
+chr#35 # + + + # #
+chr#36 $ + + + $ $
+chr#37 % + + + % %
+chr#38 & + + + & &
+chr#39 ' + + + ' '
+chr#40 ( + + + ( (
+chr#41 ) + + + ) )
+chr#42 * + + + * *
+chr#43 + + + + + +
+chr#44 , + + + , ,
+chr#45 - + + + - -
+chr#46 . + + + . .
+chr#47 / + + + / /
+chr#48 0 + + + + + 0 0
+chr#49 1 + + + + + 1 1
+chr#50 2 + + + + + 2 2
+chr#51 3 + + + + + 3 3
+chr#52 4 + + + + + 4 4
+chr#53 5 + + + + + 5 5
+chr#54 6 + + + + + 6 6
+chr#55 7 + + + + + 7 7
+chr#56 8 + + + + + 8 8
+chr#57 9 + + + + + 9 9
+chr#58 : + + + : :
+chr#59 ; + + + ; ;
+chr#60 < + + + < <
+chr#61 = + + + = =
+chr#62 > + + + > >
+chr#63 ? + + + ? ?
+chr#64 @ + + + @ @
+chr#65 A + + + + + + a A
+chr#66 B + + + + + + b B
+chr#67 C + + + + + + c C
+chr#68 D + + + + + + d D
+chr#69 E + + + + + + e E
+chr#70 F + + + + + + f F
+chr#71 G + + + + + g G
+chr#72 H + + + + + h H
+chr#73 I + + + + + i I
+chr#74 J + + + + + j J
+chr#75 K + + + + + k K
+chr#76 L + + + + + l L
+chr#77 M + + + + + m M
+chr#78 N + + + + + n N
+chr#79 O + + + + + o O
+chr#80 P + + + + + p P
+chr#81 Q + + + + + q Q
+chr#82 R + + + + + r R
+chr#83 S + + + + + s S
+chr#84 T + + + + + t T
+chr#85 U + + + + + u U
+chr#86 V + + + + + v V
+chr#87 W + + + + + w W
+chr#88 X + + + + + x X
+chr#89 Y + + + + + y Y
+chr#90 Z + + + + + z Z
+chr#91 [ + + + [ [
+chr#92 \ + + + \ \
+chr#93 ] + + + ] ]
+chr#94 ^ + + + ^ ^
+chr#95 _ + + + _ _
+chr#96 ` + + + ` `
+chr#97 a + + + + + + a A
+chr#98 b + + + + + + b B
+chr#99 c + + + + + + c C
+chr#100 d + + + + + + d D
+chr#101 e + + + + + + e E
+chr#102 f + + + + + + f F
+chr#103 g + + + + + g G
+chr#104 h + + + + + h H
+chr#105 i + + + + + i I
+chr#106 j + + + + + j J
+chr#107 k + + + + + k K
+chr#108 l + + + + + l L
+chr#109 m + + + + + m M
+chr#110 n + + + + + n N
+chr#111 o + + + + + o O
+chr#112 p + + + + + p P
+chr#113 q + + + + + q Q
+chr#114 r + + + + + r R
+chr#115 s + + + + + s S
+chr#116 t + + + + + t T
+chr#117 u + + + + + u U
+chr#118 v + + + + + v V
+chr#119 w + + + + + w W
+chr#120 x + + + + + x X
+chr#121 y + + + + + y Y
+chr#122 z + + + + + z Z
+chr#123 { + + + { {
+chr#124 | + + + | |
+chr#125 } + + + } }
+chr#126 ~ + + + ~ ~
+chr#127 +
+chr#128 \80 + + + \80 \80
+chr#129 \81 + + + \81 \81
+chr#130 \82 + + + \82 \82
+chr#131 \83 + + + \83 \83
+chr#132 \84 + + + \84 \84
+chr#133 \85 + + + \85 \85
+chr#134 \86 + + + \86 \86
+chr#135 \87 + + + \87 \87
+chr#136 \88 + + + \88 \88
+chr#137 \89 + + + \89 \89
+chr#138 \8a + + + \8a \8a
+chr#139 \8b + + + \8b \8b
+chr#140 \8c + + + \8c \8c
+chr#141 \8d + + + \8d \8d
+chr#142 \8e + + + \8e \8e
+chr#143 \8f + + + \8f \8f
+chr#144 \90 + + + \90 \90
+chr#145 \91 + + + \91 \91
+chr#146 \92 + + + \92 \92
+chr#147 \93 + + + \93 \93
+chr#148 \94 + + + \94 \94
+chr#149 \95 + + + \95 \95
+chr#150 \96 + + + \96 \96
+chr#151 \97 + + + \97 \97
+chr#152 \98 + + + \98 \98
+chr#153 \99 + + + \99 \99
+chr#154 +
+chr#155 \9b + + + \9b \9b
+chr#156 \9c + + + \9c \9c
+chr#157 \9d + + + \9d \9d
+chr#158 \9e + + + \9e \9e
+chr#159 \9f + + + \9f \9f
+chr#160 + + +
+chr#161 ¡ + + + ¡ ¡
+chr#162 ¢ + + + ¢ ¢
+chr#163 £ + + + + + £ ³
+chr#164 ¤ + + + ¤ ¤
+chr#165 ¥ + + + ¥ ¥
+chr#166 ¦ + + + ¦ ¦
+chr#167 § + + + § §
+chr#168 ¨ + + + ¨ ¨
+chr#169 © + + + © ©
+chr#170 ª + + + ª ª
+chr#171 « + + + « «
+chr#172 ¬ + + + ¬ ¬
+chr#173 + + +
+chr#174 ® + + + ® ®
+chr#175 ¯ + + + ¯ ¯
+chr#176 ° + + + ° °
+chr#177 ± + + + ± ±
+chr#178 ² + + + ² ²
+chr#179 ³ + + + + + £ ³
+chr#180 ´ + + + ´ ´
+chr#181 µ + + + µ µ
+chr#182 ¶ + + + ¶ ¶
+chr#183 · + + + · ·
+chr#184 ¸ + + + ¸ ¸
+chr#185 ¹ + + + ¹ ¹
+chr#186 º + + + º º
+chr#187 » + + + » »
+chr#188 ¼ + + + ¼ ¼
+chr#189 ½ + + + ½ ½
+chr#190 ¾ + + + ¾ ¾
+chr#191 ¿ + + + ¿ ¿
+chr#192 À + + + + + À à
+chr#193 Á + + + + + Á á
+chr#194 Â + + + + + Â â
+chr#195 Ã + + + + + Ã ã
+chr#196 Ä + + + + + Ä ä
+chr#197 Å + + + + + Å å
+chr#198 Æ + + + + + Æ æ
+chr#199 Ç + + + + + Ç ç
+chr#200 È + + + + + È è
+chr#201 É + + + + + É é
+chr#202 Ê + + + + + Ê ê
+chr#203 Ë + + + + + Ë ë
+chr#204 Ì + + + + + Ì ì
+chr#205 Í + + + + + Í í
+chr#206 Î + + + + + Î î
+chr#207 Ï + + + + + Ï ï
+chr#208 Ð + + + + + Ð ð
+chr#209 Ñ + + + + + Ñ ñ
+chr#210 Ò + + + + + Ò ò
+chr#211 Ó + + + + + Ó ó
+chr#212 Ô + + + + + Ô ô
+chr#213 Õ + + + + + Õ õ
+chr#214 Ö + + + + + Ö ö
+chr#215 × + + + + + × ÷
+chr#216 Ø + + + + + Ø ø
+chr#217 Ù + + + + + Ù ù
+chr#218 Ú + + + + + Ú ú
+chr#219 Û + + + + + Û û
+chr#220 Ü + + + + + Ü ü
+chr#221 Ý + + + + + Ý ý
+chr#222 Þ + + + + + Þ þ
+chr#223 ß + + + + + ß
+chr#224 à + + + + + À à
+chr#225 á + + + + + Á á
+chr#226 â + + + + + Â â
+chr#227 ã + + + + + Ã ã
+chr#228 ä + + + + + Ä ä
+chr#229 å + + + + + Å å
+chr#230 æ + + + + + Æ æ
+chr#231 ç + + + + + Ç ç
+chr#232 è + + + + + È è
+chr#233 é + + + + + É é
+chr#234 ê + + + + + Ê ê
+chr#235 ë + + + + + Ë ë
+chr#236 ì + + + + + Ì ì
+chr#237 í + + + + + Í í
+chr#238 î + + + + + Î î
+chr#239 ï + + + + + Ï ï
+chr#240 ð + + + + + Ð ð
+chr#241 ñ + + + + + Ñ ñ
+chr#242 ò + + + + + Ò ò
+chr#243 ó + + + + + Ó ó
+chr#244 ô + + + + + Ô ô
+chr#245 õ + + + + + Õ õ
+chr#246 ö + + + + + Ö ö
+chr#247 ÷ + + + + + × ÷
+chr#248 ø + + + + + Ø ø
+chr#249 ù + + + + + Ù ù
+chr#250 ú + + + + + Ú ú
+chr#251 û + + + + + Û û
+chr#252 ü + + + + + Ü ü
+chr#253 ý + + + + + Ý ý
+chr#254 þ + + + + + Þ þ
+chr#255 + + + + + ß
--- /dev/null
+abbrev|name_en |name_ru
+------+--------------------+------------------------------------------------------------
+ID |Idaho |áÊÄÁÈÏ
+IA |Iowa |áÊÏ×Á
+AL |Alabama |áÌÁÂÁÍÁ
+AK |Alaska |áÌÑÓËÁ
+AZ |Arizona |áÒÉÚÏÎÁ
+AR |Arkansas |áÒËÁÎÚÁÓ
+WY |Wyoming |÷ÁÊÏÍÉÎÇ
+WA |Washington |÷ÁÛÉÎÇÔÏÎ
+VT |Vermont |÷ÅÒÍÏÎÔ
+VA |Virginia |փ񀅃냄
+WI |Wisconsin |÷ÉÓËÏÎÓÉÎ
+DE |Delaware |äÅÌÁ×ÜÒ
+GA |Georgia |äÖÏÒÄÖÉÑ
+WV |West Virginia |úÁÐÁÄÎÁÑ ÷ÉÒÄÖÉÎÉÑ
+IL |Illinois |éÌÌÉÎÏÊÓ
+IN |Indiana |éÎÄÉÁÎÁ
+CA |California |ëÁÌÉÆÏÒÎÉÑ
+KA |Kansas |ëÁÎÚÁÓ
+KY |Kentucky |ëÅÎÔÕËËÉ
+CO |Colorado |ëÏÌÏÒÁÄÏ
+CT |Connecticut |ëÏÎÎÅËÔÉËÕÔ
+LA |Louisiana |ìÕÉÚÉÁÎÁ
+MA |Massachusetts |íÁÓÓÁÞÕÓÅÔÓ
+MN |Minnesota |íÉÎÎÅÓÏÔÁ
+MS |Mississippi |íÉÓÓÉÓÉÐÉ
+MO |Missouri |íÉÓÓÕÒÉ
+MI |Michigan |íÉÞÉÇÁÎ
+MT |Montana |íÏÎÔÁÎÁ
+ME |Maine |íÜÎ
+MD |Maryland |íÜÒÉÌÅÎÄ
+NE |Nebraska |îÅÂÒÁÓËÁ
+NV |Nevada |îÅ×ÁÄÁ
+NH |New Hampshire |îØÀ-çÜÍÐÛÉÒ
+NJ |New Jersey |îØÀ-äÖÅÒÓÉ
+NY |New York |îØÀ-êÏÒË
+NM |New Mexico |îØÀ-íÅËÓÉËÏ
+OH |Ohio |ïÇÁÊÏ
+OK |Oklahoma |ïËÌÁÈÏÍÁ
+DC |Washington DC |ÏËÒÕÇ ëÏÌÕÍÂÉÑ (ÓÏÚÄÁÎ ÓÐÅÃÉÁÌØÎÏ ÐÏÄ ÓÔÏÌÉÃÕ)
+OR |Oregon |ïÒÅÇÏÎ
+PA |Pennsylvania |ðÅÎÓÉÌØ×ÁÎÉÑ
+RI |Rhode Island |òÏÄ-áÊÌÅÎÄ
+ND |North Dakota |óÅ×ÅÒÎÁÑ äÁËÏÔÁ
+NC |North Carolina |óÅ×ÅÒÎÁÑ ëÁÒÏÌÉÎÁ
+TN |Tennessee |ôÅÎÎÅÓÓÉ
+TX |Texas |ôÅÈÁÓ
+FL |Florida |æÌÏÒÉÄÁ
+SD |South Dakota |àÖÎÁÑ äÁËÏÔÁ
+SC |South Carolina |àÖÎÁÑ ëÁÒÏÌÉÎÁ
+UT |Utah |àÔÁ
+(50 rows)
+
+EOF
--- /dev/null
+abbrev|name_en |name_ru
+------+--------------------+----------------------------------------------
+OH |Ohio |ïÇÁÊÏ
+OK |Oklahoma |ïËÌÁÈÏÍÁ
+DC |Washington DC |ÏËÒÕÇ ëÏÌÕÍÂÉÑ (ÓÏÚÄÁÎ ÓÐÅÃÉÁÌØÎÏ ÐÏÄ ÓÔÏÌÉÃÕ)
+OR |Oregon |ïÒÅÇÏÎ
+(4 rows)
+
+EOF
--- /dev/null
+Bording
+hoarding
+Vesta
+vesta
+ÁÌØÑÎÓ
+áÆÒÉËÁ
+óÅ×ÅÒ
+ãÁÐÌÑ
+àÇ
--- /dev/null
+abbrev|name_en |name_ru
+------+--------------------+----------------------------------------------
+ID |Idaho |áÊÄÁÈÏ
+IA |Iowa |áÊÏ×Á
+AL |Alabama |áÌÁÂÁÍÁ
+AK |Alaska |áÌÑÓËÁ
+AZ |Arizona |áÒÉÚÏÎÁ
+AR |Arkansas |áÒËÁÎÚÁÓ
+WY |Wyoming |÷ÁÊÏÍÉÎÇ
+WA |Washington |÷ÁÛÉÎÇÔÏÎ
+VT |Vermont |÷ÅÒÍÏÎÔ
+VA |Virginia |փ񀅃냄
+WI |Wisconsin |÷ÉÓËÏÎÓÉÎ
+DE |Delaware |äÅÌÁ×ÜÒ
+GA |Georgia |äÖÏÒÄÖÉÑ
+WV |West Virginia |úÁÐÁÄÎÁÑ ÷ÉÒÄÖÉÎÉÑ
+IL |Illinois |éÌÌÉÎÏÊÓ
+IN |Indiana |éÎÄÉÁÎÁ
+CA |California |ëÁÌÉÆÏÒÎÉÑ
+KA |Kansas |ëÁÎÚÁÓ
+KY |Kentucky |ëÅÎÔÕËËÉ
+CO |Colorado |ëÏÌÏÒÁÄÏ
+CT |Connecticut |ëÏÎÎÅËÔÉËÕÔ
+LA |Louisiana |ìÕÉÚÉÁÎÁ
+MA |Massachusetts |íÁÓÓÁÞÕÓÅÔÓ
+MN |Minnesota |íÉÎÎÅÓÏÔÁ
+MS |Mississippi |íÉÓÓÉÓÉÐÉ
+MO |Missouri |íÉÓÓÕÒÉ
+MI |Michigan |íÉÞÉÇÁÎ
+MT |Montana |íÏÎÔÁÎÁ
+ME |Maine |íÜÎ
+MD |Maryland |íÜÒÉÌÅÎÄ
+NE |Nebraska |îÅÂÒÁÓËÁ
+NV |Nevada |îÅ×ÁÄÁ
+NH |New Hampshire |îØÀ-çÜÍÐÛÉÒ
+NJ |New Jersey |îØÀ-äÖÅÒÓÉ
+NY |New York |îØÀ-êÏÒË
+NM |New Mexico |îØÀ-íÅËÓÉËÏ
+OH |Ohio |ïÇÁÊÏ
+OK |Oklahoma |ïËÌÁÈÏÍÁ
+DC |Washington DC |ÏËÒÕÇ ëÏÌÕÍÂÉÑ (ÓÏÚÄÁÎ ÓÐÅÃÉÁÌØÎÏ ÐÏÄ ÓÔÏÌÉÃÕ)
+OR |Oregon |ïÒÅÇÏÎ
+PA |Pennsylvania |ðÅÎÓÉÌØ×ÁÎÉÑ
+RI |Rhode Island |òÏÄ-áÊÌÅÎÄ
+ND |North Dakota |óÅ×ÅÒÎÁÑ äÁËÏÔÁ
+NC |North Carolina |óÅ×ÅÒÎÁÑ ëÁÒÏÌÉÎÁ
+TN |Tennessee |ôÅÎÎÅÓÓÉ
+TX |Texas |ôÅÈÁÓ
+FL |Florida |æÌÏÒÉÄÁ
+SD |South Dakota |àÖÎÁÑ äÁËÏÔÁ
+SC |South Carolina |àÖÎÁÑ ëÁÒÏÌÉÎÁ
+UT |Utah |àÔÁ
+(50 rows)
+
+EOF
--- /dev/null
+abbrev|name_en |name_ru
+------+--------------------+----------------------------------------------
+ID |Idaho |áÊÄÁÈÏ
+IA |Iowa |áÊÏ×Á
+AL |Alabama |áÌÁÂÁÍÁ
+AK |Alaska |áÌÑÓËÁ
+AZ |Arizona |áÒÉÚÏÎÁ
+AR |Arkansas |áÒËÁÎÚÁÓ
+WY |Wyoming |÷ÁÊÏÍÉÎÇ
+WA |Washington |÷ÁÛÉÎÇÔÏÎ
+VT |Vermont |÷ÅÒÍÏÎÔ
+VA |Virginia |փ񀅃냄
+WI |Wisconsin |÷ÉÓËÏÎÓÉÎ
+DE |Delaware |äÅÌÁ×ÜÒ
+GA |Georgia |äÖÏÒÄÖÉÑ
+WV |West Virginia |úÁÐÁÄÎÁÑ ÷ÉÒÄÖÉÎÉÑ
+IL |Illinois |éÌÌÉÎÏÊÓ
+IN |Indiana |éÎÄÉÁÎÁ
+CA |California |ëÁÌÉÆÏÒÎÉÑ
+KA |Kansas |ëÁÎÚÁÓ
+KY |Kentucky |ëÅÎÔÕËËÉ
+CO |Colorado |ëÏÌÏÒÁÄÏ
+CT |Connecticut |ëÏÎÎÅËÔÉËÕÔ
+LA |Louisiana |ìÕÉÚÉÁÎÁ
+MA |Massachusetts |íÁÓÓÁÞÕÓÅÔÓ
+MN |Minnesota |íÉÎÎÅÓÏÔÁ
+MS |Mississippi |íÉÓÓÉÓÉÐÉ
+MO |Missouri |íÉÓÓÕÒÉ
+MI |Michigan |íÉÞÉÇÁÎ
+MT |Montana |íÏÎÔÁÎÁ
+ME |Maine |íÜÎ
+MD |Maryland |íÜÒÉÌÅÎÄ
+NE |Nebraska |îÅÂÒÁÓËÁ
+NV |Nevada |îÅ×ÁÄÁ
+NH |New Hampshire |îØÀ-çÜÍÐÛÉÒ
+NJ |New Jersey |îØÀ-äÖÅÒÓÉ
+NY |New York |îØÀ-êÏÒË
+NM |New Mexico |îØÀ-íÅËÓÉËÏ
+OH |Ohio |ïÇÁÊÏ
+OK |Oklahoma |ïËÌÁÈÏÍÁ
+DC |Washington DC |ÏËÒÕÇ ëÏÌÕÍÂÉÑ (ÓÏÚÄÁÎ ÓÐÅÃÉÁÌØÎÏ ÐÏÄ ÓÔÏÌÉÃÕ)
+OR |Oregon |ïÒÅÇÏÎ
+PA |Pennsylvania |ðÅÎÓÉÌØ×ÁÎÉÑ
+RI |Rhode Island |òÏÄ-áÊÌÅÎÄ
+ND |North Dakota |óÅ×ÅÒÎÁÑ äÁËÏÔÁ
+NC |North Carolina |óÅ×ÅÒÎÁÑ ëÁÒÏÌÉÎÁ
+TN |Tennessee |ôÅÎÎÅÓÓÉ
+TX |Texas |ôÅÈÁÓ
+FL |Florida |æÌÏÒÉÄÁ
+SD |South Dakota |àÖÎÁÑ äÁËÏÔÁ
+SC |South Carolina |àÖÎÁÑ ëÁÒÏÌÉÎÁ
+UT |Utah |àÔÁ
+(50 rows)
+
+EOF
--- /dev/null
+#! /bin/sh
+
+PATH=..:$PATH
+
+echo "Testing PostgreSQL compilation..."
+if ! test-pgsql-locale; then
+ exit 1
+fi
+
+LC_CTYPE=ru_RU.KOI8-R
+LC_COLLATE=$LC_CTYPE
+export LC_CTYPE LC_COLLATE
+
+echo "Testing LC_CTYPE..."
+if ! test-ctype > koi8-ctype.out; then
+ exit 1
+fi
+diff expected/koi8-ctype.out koi8-ctype.out
+
+echo "Testing LC_COLLATE..."
+perl ../sort-test.pl test-koi8-sort.in > test-koi8-sort.out
+diff expected/test-koi8-sort.out test-koi8-sort.out
+
+### If you have Python - uncomment the following two lines
+#python ../sort-test.py test-koi8-sort.in > test-koi8-sort.out
+#diff expected/test-koi8-sort.out test-koi8-sort.out
+
+
+abort() {
+ [ "$1" ] && echo "$*"
+ exit 1
+}
+
+for f in char varchar text; do
+ if echo $f | grep -q char; then
+ ftype="$f(60)"
+ else
+ ftype="$f"
+ fi
+ echo "Testing PgSQL: sort on $ftype type..."
+
+ destroydb testlocale >/dev/null 2>&1
+ createdb testlocale || abort "createdb failed"
+ psql -d testlocale -c "CREATE TABLE usastates (abbrev char2, name_en char(20), name_ru $ftype);" >/dev/null 2>&1 || abort "createtable failed"
+ psql testlocale < test-koi8.sql.in > test-koi8-$f.sql.out 2>/dev/null || abort "test query failed"
+ diff expected/test-koi8-$f.sql.out test-koi8-$f.sql.out
+done
+echo "Testing PgSQL: select on regexp..."
+psql testlocale < test-koi8-select.sql.in > test-koi8-select.sql.out 2>/dev/null || abort "select query failed"
+diff expected/test-koi8-select.sql.out test-koi8-select.sql.out
+destroydb testlocale || abort "destroydb failed"
+echo "Finished."
--- /dev/null
+SELECT * FROM usastates WHERE name_ru ~* '^Ï.*' ORDER BY name_ru;
--- /dev/null
+Vesta
+vesta
+àÇ
+ÁÌØÑÎÓ
+áÆÒÉËÁ
+óÅ×ÅÒ
+ãÁÐÌÑ
+Bording
+hoarding
--- /dev/null
+COPY usastates FROM stdin USING DELIMITERS '|';
+AK|Alaska |áÌÑÓËÁ
+WA|Washington |÷ÁÛÉÎÇÔÏÎ
+OR|Oregon |ïÒÅÇÏÎ
+CA|California |ëÁÌÉÆÏÒÎÉÑ
+NV|Nevada |îÅ×ÁÄÁ
+ID|Idaho |áÊÄÁÈÏ
+UT|Utah |àÔÁ
+AZ|Arizona |áÒÉÚÏÎÁ
+MT|Montana |íÏÎÔÁÎÁ
+WY|Wyoming |÷ÁÊÏÍÉÎÇ
+CO|Colorado |ëÏÌÏÒÁÄÏ
+NM|New Mexico |îØÀ-íÅËÓÉËÏ
+ND|North Dakota |óÅ×ÅÒÎÁÑ äÁËÏÔÁ
+SD|South Dakota |àÖÎÁÑ äÁËÏÔÁ
+NE|Nebraska |îÅÂÒÁÓËÁ
+KA|Kansas |ëÁÎÚÁÓ
+OK|Oklahoma |ïËÌÁÈÏÍÁ
+TX|Texas |ôÅÈÁÓ
+MN|Minnesota |íÉÎÎÅÓÏÔÁ
+IA|Iowa |áÊÏ×Á
+MO|Missouri |íÉÓÓÕÒÉ
+AR|Arkansas |áÒËÁÎÚÁÓ
+LA|Louisiana |ìÕÉÚÉÁÎÁ
+WI|Wisconsin |÷ÉÓËÏÎÓÉÎ
+IL|Illinois |éÌÌÉÎÏÊÓ
+IN|Indiana |éÎÄÉÁÎÁ
+MS|Mississippi |íÉÓÓÉÓÉÐÉ
+AL|Alabama |áÌÁÂÁÍÁ
+MI|Michigan |íÉÞÉÇÁÎ
+OH|Ohio |ïÇÁÊÏ
+KY|Kentucky |ëÅÎÔÕËËÉ
+TN|Tennessee |ôÅÎÎÅÓÓÉ
+GA|Georgia |äÖÏÒÄÖÉÑ
+FL|Florida |æÌÏÒÉÄÁ
+PA|Pennsylvania |ðÅÎÓÉÌØ×ÁÎÉÑ
+WV|West Virginia |úÁÐÁÄÎÁÑ ÷ÉÒÄÖÉÎÉÑ
+VA|Virginia |փ񀅃냄
+NC|North Carolina|óÅ×ÅÒÎÁÑ ëÁÒÏÌÉÎÁ
+SC|South Carolina|àÖÎÁÑ ëÁÒÏÌÉÎÁ
+NY|New York |îØÀ-êÏÒË
+NJ|New Jersey |îØÀ-äÖÅÒÓÉ
+DE|Delaware |äÅÌÁ×ÜÒ
+MD|Maryland |íÜÒÉÌÅÎÄ
+DC|Washington DC |ÏËÒÕÇ ëÏÌÕÍÂÉÑ (ÓÏÚÄÁÎ ÓÐÅÃÉÁÌØÎÏ ÐÏÄ ÓÔÏÌÉÃÕ)
+VT|Vermont |÷ÅÒÍÏÎÔ
+MA|Massachusetts |íÁÓÓÁÞÕÓÅÔÓ
+CT|Connecticut |ëÏÎÎÅËÔÉËÕÔ
+ME|Maine |íÜÎ
+NH|New Hampshire |îØÀ-çÜÍÐÛÉÒ
+RI|Rhode Island |òÏÄ-áÊÌÅÎÄ
+\.
+SELECT * FROM usastates ORDER BY name_ru;
--- /dev/null
+#!/usr/local/bin/perl -w
+use locale;
+
+open(INFILE, "<$ARGV[0]");
+chop(my(@words) = <INFILE>);
+close(INFILE);
+
+$"="\n";
+my(@result) = sort @words;
+
+print "@result\n";
+
--- /dev/null
+#! /usr/local/bin/python
+
+import sys, string, locale
+locale.setlocale(locale.LC_ALL, "")
+
+if len(sys.argv) <> 2:
+ sys.stderr.write("Usage: sort.py filename\n")
+ sys.exit(1)
+
+infile = open(sys.argv[1], 'r')
+list = infile.readlines()
+infile.close()
+
+for i in range(0, len(list)):
+ list[i] = list[i][:-1] # chop!
+
+list.sort(locale.strcoll)
+print string.join(list, '\n')
--- /dev/null
+
+/*
+
+ test-ctype.c
+
+Written by Oleg BroytMann, phd2@earthling.net
+ with help from Oleg Bartunov, oleg@sai.msu.su
+Copyright (C) 1998 PhiloSoft Design
+
+This is copyrighted but free software. You can use it, modify and distribute
+in original or modified form providing that the author's names and the above
+copyright notice will remain.
+
+Disclaimer, legal notice and absence of warranty.
+ This software provided "as is" without any kind of warranty. In no event
+the author shall be liable for any damage, etc.
+
+*/
+
+#include <stdio.h>
+#include <locale.h>
+#include <ctype.h>
+
+char * flag(int b);
+void describe_char(int c);
+
+#undef LONG_FLAG
+
+char * flag(int b)
+{
+#ifdef LONG_FLAG
+ return b ? "yes" : "no";
+#else
+ return b ? "+" : " ";
+#endif
+}
+
+void describe_char(int c)
+{
+ char cp = c, up = toupper(c), lo = tolower(c);
+ if (!isprint(cp)) cp = ' ';
+ if (!isprint(up)) up = ' ';
+ if (!isprint(lo)) lo = ' ';
+
+ printf("chr#%-4d%2c%6s%6s%6s%6s%6s%6s%6s%6s%6s%6s%6s%4c%4c\n", c, cp, flag(isalnum(c)), flag(isalpha(c)), flag(iscntrl(c)), flag(isdigit(c)), flag(islower(c)), flag(isgraph(c)), flag(isprint(c)), flag(ispunct(c)), flag(isspace(c)), flag(isupper(c)), flag(isxdigit(c)), lo, up);
+}
+
+int main() {
+ short c;
+ char * cur_locale;
+
+ cur_locale = setlocale(LC_ALL, "");
+ if (cur_locale) {
+ fprintf(stderr, "Successfulle set locale to %s\n", cur_locale);
+ } else {
+ fprintf(stderr, "Cannot setup locale. Either your libc does not provide\nlocale support, or your locale data is corrupt, or you have not set\nLANG or LC_CTYPE environment variable to proper value. Program aborted.\n");
+ return 1;
+ }
+
+ printf("char# char alnum alpha cntrl digit lower graph print punct space upper xdigit lo up\n");
+ for (c = 0; c <= 255; c++)
+ describe_char(c);
+
+ return 0;
+}
--- /dev/null
+
+#include <stdio.h>
+#include "postgres.h"
+
+int main() {
+ #ifdef USE_LOCALE
+ printf("PostgreSQL compiled with locale support\n");
+ return 0;
+ #else
+ printf("PostgreSQL compiled without locale support\n");
+ return 1;
+ #endif
+}