[-]
[+]
|
Changed |
postgresql-pl.changes
|
|
[-]
[+]
|
Changed |
postgresql.changes
^
|
|
[-]
[+]
|
Changed |
postgresql-pl.spec
^
|
|
[-]
[+]
|
Changed |
postgresql.spec
^
|
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/HISTORY
^
|
@@ -17,6 +17,100 @@
review, so each item is truly a community effort.
__________________________________________________________________
+ Release 8.4.17
+
+ Release Date: 2013-04-04
+
+ This release contains a variety of fixes from 8.4.16. For information
+ about new features in the 8.4 major release, see the Section called
+ Release 8.4.
+ __________________________________________________________________
+
+Migration to Version 8.4.17
+
+ A dump/restore is not required for those running 8.4.X.
+
+ However, this release corrects several errors in management of GiST
+ indexes. After installing this update, it is advisable to "REINDEX" any
+ GiST indexes that meet one or more of the conditions described below.
+
+ Also, if you are upgrading from a version earlier than 8.4.10, see the
+ release notes for 8.4.10.
+ __________________________________________________________________
+
+Changes
+
+ * Reset OpenSSL randomness state in each postmaster child process
+ (Marko Kreen)
+ This avoids a scenario wherein random numbers generated by
+ "contrib/pgcrypto" functions might be relatively easy for another
+ database user to guess. The risk is only significant when the
+ postmaster is configured with ssl = on but most connections don't
+ use SSL encryption. (CVE-2013-1900)
+ * Fix GiST indexes to not use "fuzzy" geometric comparisons when it's
+ not appropriate to do so (Alexander Korotkov)
+ The core geometric types perform comparisons using "fuzzy"
+ equality, but gist_box_same must do exact comparisons, else GiST
+ indexes using it might become inconsistent. After installing this
+ update, users should "REINDEX" any GiST indexes on box, polygon,
+ circle, or point columns, since all of these use gist_box_same.
+ * Fix erroneous range-union and penalty logic in GiST indexes that
+ use "contrib/btree_gist" for variable-width data types, that is
+ text, bytea, bit, and numeric columns (Tom Lane)
+ These errors could result in inconsistent indexes in which some
+ keys that are present would not be found by searches, and also in
+ useless index bloat. Users are advised to "REINDEX" such indexes
+ after installing this update.
+ * Fix bugs in GiST page splitting code for multi-column indexes (Tom
+ Lane)
+ These errors could result in inconsistent indexes in which some
+ keys that are present would not be found by searches, and also in
+ indexes that are unnecessarily inefficient to search. Users are
+ advised to "REINDEX" multi-column GiST indexes after installing
+ this update.
+ * Fix infinite-loop risk in regular expression compilation (Tom Lane,
+ Don Porter)
+ * Fix potential null-pointer dereference in regular expression
+ compilation (Tom Lane)
+ * Fix to_char() to use ASCII-only case-folding rules where
+ appropriate (Tom Lane)
+ This fixes misbehavior of some template patterns that should be
+ locale-independent, but mishandled "I" and "i" in Turkish locales.
+ * Fix unwanted rejection of timestamp 1999-12-31 24:00:00 (Tom Lane)
+ * Remove useless "picksplit doesn't support secondary split" log
+ messages (Josh Hansen, Tom Lane)
+ This message seems to have been added in expectation of code that
+ was never written, and probably never will be, since GiST's default
+ handling of secondary splits is actually pretty good. So stop
+ nagging end users about it.
+ * Fix possible failure to send a session's last few transaction
+ commit/abort counts to the statistics collector (Tom Lane)
+ * Eliminate memory leaks in PL/Perl's spi_prepare() function (Alex
+ Hunsaker, Tom Lane)
+ * Fix pg_dumpall to handle database names containing "=" correctly
+ (Heikki Linnakangas)
+ * Avoid crash in pg_dump when an incorrect connection string is given
+ (Heikki Linnakangas)
+ * Ignore invalid indexes in pg_dump (Michael Paquier)
+ Dumping invalid indexes can cause problems at restore time, for
+ example if the reason the index creation failed was because it
+ tried to enforce a uniqueness condition not satisfied by the
+ table's data. Also, if the index creation is in fact still in
+ progress, it seems reasonable to consider it to be an uncommitted
+ DDL change, which pg_dump wouldn't be expected to dump anyway.
+ * Fix "contrib/pg_trgm"'s similarity() function to return zero for
+ trigram-less strings (Tom Lane)
+ Previously it returned NaN due to internal division by zero.
+ * Update time zone data files to tzdata release 2013b for DST law
+ changes in Chile, Haiti, Morocco, Paraguay, and some Russian areas.
+ Also, historical zone data corrections for numerous places.
+ Also, update the time zone abbreviation files for recent changes in
+ Russia and elsewhere: CHOT, GET, IRKT, KGT, KRAT, MAGT, MAWT, MSK,
+ NOVT, OMST, TKT, VLAT, WST, YAKT, YEKT now follow their current
+ meanings, and VOLT (Europe/Volgograd) and MIST
+ (Antarctica/Macquarie) are added to the default abbreviations list.
+ __________________________________________________________________
+
Release 8.4.16
Release Date: 2013-02-07
@@ -56,9 +150,10 @@
For safety, ownership of these objects must be reassigned, not
dropped.
* Fix error in vacuum_freeze_table_age implementation (Andres Freund)
- The main consequence of this mistake is that lowering
- vacuum_freeze_min_age would cause full-table vacuuming scans to
- occur much more frequently than intended.
+ In installations that have existed for more than
+ vacuum_freeze_min_age transactions, this mistake prevented
+ autovacuum from using partial-table scans, so that a full-table
+ scan would always happen instead.
* Prevent misbehavior when a RowExpr or XmlExpr is parse-analyzed
twice (Andres Freund, Tom Lane)
This mistake could be user-visible in contexts such as CREATE TABLE
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/INSTALL
^
|
@@ -173,7 +173,7 @@
keys), then use the "-o" option when running pg_dumpall.
To make the backup, you can use the pg_dumpall command from the
version you are currently running. For best results, however, try
- to use the pg_dumpall command from PostgreSQL 8.4.16, since this
+ to use the pg_dumpall command from PostgreSQL 8.4.17, since this
version contains bug fixes and improvements over older versions.
While this advice might seem idiosyncratic since you haven't
installed the new version yet, it is advisable to follow it if you
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/configure
^
|
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for PostgreSQL 8.4.16.
+# Generated by GNU Autoconf 2.61 for PostgreSQL 8.4.17.
#
# Report bugs to <pgsql-bugs@postgresql.org>.
#
@@ -576,8 +576,8 @@
# Identity of this package.
PACKAGE_NAME='PostgreSQL'
PACKAGE_TARNAME='postgresql'
-PACKAGE_VERSION='8.4.16'
-PACKAGE_STRING='PostgreSQL 8.4.16'
+PACKAGE_VERSION='8.4.17'
+PACKAGE_STRING='PostgreSQL 8.4.17'
PACKAGE_BUGREPORT='pgsql-bugs@postgresql.org'
ac_unique_file="src/backend/access/common/heaptuple.c"
@@ -1289,7 +1289,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures PostgreSQL 8.4.16 to adapt to many kinds of systems.
+\`configure' configures PostgreSQL 8.4.17 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1354,7 +1354,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of PostgreSQL 8.4.16:";;
+ short | recursive ) echo "Configuration of PostgreSQL 8.4.17:";;
esac
cat <<\_ACEOF
@@ -1499,7 +1499,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-PostgreSQL configure 8.4.16
+PostgreSQL configure 8.4.17
generated by GNU Autoconf 2.61
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1515,7 +1515,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by PostgreSQL $as_me 8.4.16, which was
+It was created by PostgreSQL $as_me 8.4.17, which was
generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@
@@ -27926,7 +27926,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by PostgreSQL $as_me 8.4.16, which was
+This file was extended by PostgreSQL $as_me 8.4.17, which was
generated by GNU Autoconf 2.61. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -27983,7 +27983,7 @@
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-PostgreSQL config.status 8.4.16
+PostgreSQL config.status 8.4.17
configured by $0, generated by GNU Autoconf 2.61,
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/configure.in
^
|
@@ -17,7 +17,7 @@
dnl
m4_pattern_forbid(^PGAC_)dnl to catch undefined macros
-AC_INIT([PostgreSQL], [8.4.16], [pgsql-bugs@postgresql.org])
+AC_INIT([PostgreSQL], [8.4.17], [pgsql-bugs@postgresql.org])
m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.61], [], [m4_fatal([Autoconf version 2.61 is required.
Untested combinations of 'autoconf' and PostgreSQL versions are not
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/contrib/btree_gist/btree_utils_var.c
^
|
@@ -92,14 +92,12 @@
static int32
gbt_var_node_cp_len(const GBT_VARKEY *node, const gbtree_vinfo *tinfo)
{
-
GBT_VARKEY_R r = gbt_var_key_readable(node);
int32 i = 0;
int32 l = 0;
int32 t1len = VARSIZE(r.lower) - VARHDRSZ;
int32 t2len = VARSIZE(r.upper) - VARHDRSZ;
int32 ml = Min(t1len, t2len);
-
char *p1 = VARDATA(r.lower);
char *p2 = VARDATA(r.upper);
@@ -110,7 +108,6 @@
{
if (tinfo->eml > 1 && l == 0)
{
-
if ((l = pg_mblen(p1)) != pg_mblen(p2))
{
return i;
@@ -233,14 +230,13 @@
void
gbt_var_bin_union(Datum *u, GBT_VARKEY *e, const gbtree_vinfo *tinfo)
{
-
- GBT_VARKEY *nk = NULL;
- GBT_VARKEY *tmp = NULL;
- GBT_VARKEY_R nr;
GBT_VARKEY_R eo = gbt_var_key_readable(e);
+ GBT_VARKEY_R nr;
if (eo.lower == eo.upper) /* leaf */
{
+ GBT_VARKEY *tmp;
+
tmp = gbt_var_leaf2node(e, tinfo);
if (tmp != e)
eo = gbt_var_key_readable(tmp);
@@ -248,25 +244,26 @@
if (DatumGetPointer(*u))
{
-
GBT_VARKEY_R ro = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(*u));
+ bool update = false;
+
+ nr.lower = ro.lower;
+ nr.upper = ro.upper;
if ((*tinfo->f_cmp) ((bytea *) ro.lower, (bytea *) eo.lower) > 0)
{
nr.lower = eo.lower;
- nr.upper = ro.upper;
- nk = gbt_var_key_copy(&nr, TRUE);
+ update = true;
}
if ((*tinfo->f_cmp) ((bytea *) ro.upper, (bytea *) eo.upper) < 0)
{
nr.upper = eo.upper;
- nr.lower = ro.lower;
- nk = gbt_var_key_copy(&nr, TRUE);
+ update = true;
}
- if (nk)
- *u = PointerGetDatum(nk);
+ if (update)
+ *u = PointerGetDatum(gbt_var_key_copy(&nr, TRUE));
}
else
{
@@ -378,13 +375,14 @@
GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(n->key);
GBT_VARKEY_R ok,
nk;
- GBT_VARKEY *tmp = NULL;
*res = 0.0;
nk = gbt_var_key_readable(newe);
if (nk.lower == nk.upper) /* leaf */
{
+ GBT_VARKEY *tmp;
+
tmp = gbt_var_leaf2node(newe, tinfo);
if (tmp != newe)
nk = gbt_var_key_readable(tmp);
@@ -401,7 +399,7 @@
))
{
Datum d = PointerGetDatum(0);
- double dres = 0.0;
+ double dres;
int32 ol,
ul;
@@ -412,20 +410,18 @@
if (ul < ol)
{
- dres = (ol - ul); /* lost of common prefix len */
+ dres = (ol - ul); /* reduction of common prefix len */
}
else
{
GBT_VARKEY_R uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(d));
+ unsigned char tmp[4];
- char tmp[4];
-
- tmp[0] = ((VARSIZE(ok.lower) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(ok.lower)[ul]);
- tmp[1] = ((VARSIZE(uk.lower) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(uk.lower)[ul]);
- tmp[2] = ((VARSIZE(ok.upper) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(ok.upper)[ul]);
- tmp[3] = ((VARSIZE(uk.upper) - VARHDRSZ) == ul) ? (CHAR_MIN) : (VARDATA(uk.upper)[ul]);
- dres = (tmp[0] - tmp[1]) +
- (tmp[3] - tmp[2]);
+ tmp[0] = (unsigned char) (((VARSIZE(ok.lower) - VARHDRSZ) <= ul) ? 0 : (VARDATA(ok.lower)[ul]));
+ tmp[1] = (unsigned char) (((VARSIZE(uk.lower) - VARHDRSZ) <= ul) ? 0 : (VARDATA(uk.lower)[ul]));
+ tmp[2] = (unsigned char) (((VARSIZE(ok.upper) - VARHDRSZ) <= ul) ? 0 : (VARDATA(ok.upper)[ul]));
+ tmp[3] = (unsigned char) (((VARSIZE(uk.upper) - VARHDRSZ) <= ul) ? 0 : (VARDATA(uk.upper)[ul]));
+ dres = Abs(tmp[0] - tmp[1]) + Abs(tmp[3] - tmp[2]);
dres /= 256.0;
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/contrib/pg_trgm/expected/pg_trgm.out
^
|
@@ -59,6 +59,12 @@
1
(1 row)
+select similarity('---', '####---');
+ similarity
+------------
+ 0
+(1 row)
+
CREATE TABLE test_trgm(t text);
\copy test_trgm from 'data/trgm.data
select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t;
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/contrib/pg_trgm/sql/pg_trgm.sql
^
|
@@ -19,6 +19,8 @@
select similarity('wow','WOWa ');
select similarity('wow',' WOW ');
+select similarity('---', '####---');
+
CREATE TABLE test_trgm(t text);
\copy test_trgm from 'data/trgm.data
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/contrib/pg_trgm/trgm_op.c
^
|
@@ -311,6 +311,10 @@
len1 = ARRNELEM(trg1);
len2 = ARRNELEM(trg2);
+ /* explicit test is needed to avoid 0/0 division when both lengths are 0 */
+ if (len1 <= 0 || len2 <= 0)
+ return (float4) 0.0;
+
while (ptr1 - GETARR(trg1) < len1 && ptr2 - GETARR(trg2) < len2)
{
int res = CMPTRGM(ptr1, ptr2);
@@ -328,9 +332,9 @@
}
#ifdef DIVUNION
- return ((((float4) count) / ((float4) (len1 + len2 - count))));
+ return ((float4) count) / ((float4) (len1 + len2 - count));
#else
- return (((float) count) / ((float) ((len1 > len2) ? len1 : len2)));
+ return ((float4) count) / ((float4) ((len1 > len2) ? len1 : len2));
#endif
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/bug.template
^
|
@@ -27,7 +27,7 @@
Operating System (example: Linux 2.4.18) :
- PostgreSQL version (example: PostgreSQL 8.4.16): PostgreSQL 8.4.16
+ PostgreSQL version (example: PostgreSQL 8.4.17): PostgreSQL 8.4.17
Compiler used (example: gcc 3.3.5) :
|
|
Changed |
postgresql-8.4.17.tar.bz2/doc/man.tar.gz
^
|
|
Changed |
postgresql-8.4.17.tar.bz2/doc/postgres.tar.gz
^
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/src/sgml/config.sgml
^
|
@@ -1324,10 +1324,10 @@
<variablelist>
<varlistentry id="guc-fsync" xreflabel="fsync">
+ <term><varname>fsync</varname> (<type>boolean</type>)</term>
<indexterm>
<primary><varname>fsync</> configuration parameter</primary>
</indexterm>
- <term><varname>fsync</varname> (<type>boolean</type>)</term>
<listitem>
<para>
If this parameter is on, the <productname>PostgreSQL</> server
@@ -1474,10 +1474,10 @@
</varlistentry>
<varlistentry id="guc-full-page-writes" xreflabel="full_page_writes">
+ <term><varname>full_page_writes</varname> (<type>boolean</type>)</term>
<indexterm>
<primary><varname>full_page_writes</> configuration parameter</primary>
</indexterm>
- <term><varname>full_page_writes</varname> (<type>boolean</type>)</term>
<listitem>
<para>
When this parameter is on, the <productname>PostgreSQL</> server
@@ -2093,6 +2093,7 @@
<variablelist>
<varlistentry id="guc-geqo" xreflabel="geqo">
+ <term><varname>geqo</varname> (<type>boolean</type>)</term>
<indexterm>
<primary>genetic query optimization</primary>
</indexterm>
@@ -2103,7 +2104,6 @@
<indexterm>
<primary><varname>geqo</> configuration parameter</primary>
</indexterm>
- <term><varname>geqo</varname> (<type>boolean</type>)</term>
<listitem>
<para>
Enables or disables genetic query optimization.
@@ -3975,13 +3975,13 @@
</varlistentry>
<varlistentry id="guc-default-transaction-isolation" xreflabel="default_transaction_isolation">
+ <term><varname>default_transaction_isolation</varname> (<type>enum</type>)</term>
<indexterm>
<primary>transaction isolation level</primary>
</indexterm>
<indexterm>
<primary><varname>default_transaction_isolation</> configuration parameter</primary>
</indexterm>
- <term><varname>default_transaction_isolation</varname> (<type>enum</type>)</term>
<listitem>
<para>
Each SQL transaction has an isolation level, which can be
@@ -4001,14 +4001,13 @@
</varlistentry>
<varlistentry id="guc-default-transaction-read-only" xreflabel="default_transaction_read_only">
+ <term><varname>default_transaction_read_only</varname> (<type>boolean</type>)</term>
<indexterm>
<primary>read-only transaction</primary>
</indexterm>
<indexterm>
<primary><varname>default_transaction_read_only</> configuration parameter</primary>
</indexterm>
-
- <term><varname>default_transaction_read_only</varname> (<type>boolean</type>)</term>
<listitem>
<para>
A read-only SQL transaction cannot alter non-temporary tables.
@@ -4265,6 +4264,7 @@
</varlistentry>
<varlistentry id="guc-extra-float-digits" xreflabel="extra_float_digits">
+ <term><varname>extra_float_digits</varname> (<type>integer</type>)</term>
<indexterm>
<primary>significant digits</primary>
</indexterm>
@@ -4275,8 +4275,6 @@
<indexterm>
<primary><varname>extra_float_digits</> configuration parameter</primary>
</indexterm>
-
- <term><varname>extra_float_digits</varname> (<type>integer</type>)</term>
<listitem>
<para>
This parameter adjusts the number of digits displayed for
@@ -4546,6 +4544,7 @@
<variablelist>
<varlistentry id="guc-deadlock-timeout" xreflabel="deadlock_timeout">
+ <term><varname>deadlock_timeout</varname> (<type>integer</type>)</term>
<indexterm>
<primary>deadlock</primary>
<secondary>timeout during</secondary>
@@ -4557,8 +4556,6 @@
<indexterm>
<primary><varname>deadlock_timeout</> configuration parameter</primary>
</indexterm>
-
- <term><varname>deadlock_timeout</varname> (<type>integer</type>)</term>
<listitem>
<para>
This is the amount of time, in milliseconds, to wait on a lock
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/src/sgml/docguide.sgml
^
|
@@ -235,8 +235,9 @@
<para>
It's possible that the ports do not update the main catalog file
- in <filename>/usr/local/share/sgml/catalog.ports</filename> or order
- isn't proper . Be sure to have the following lines in beginning of file:
+ in <filename>/usr/local/share/sgml/catalog.ports</filename> or that the
+ order isn't proper. Be sure to have the following lines in the beginning
+ of the file:
<programlisting>
CATALOG "openjade/catalog"
CATALOG "iso8879/catalog"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/src/sgml/func.sgml
^
|
@@ -1422,12 +1422,12 @@
<row>
<entry>
<literal><function>decode</function>(<parameter>string</parameter> <type>text</type>,
- <parameter>type</parameter> <type>text</type>)</literal>
+ <parameter>format</parameter> <type>text</type>)</literal>
</entry>
<entry><type>bytea</type></entry>
<entry>
- Decode binary data from <parameter>string</parameter> previously
- encoded with <function>encode</>. Parameter type is same as in <function>encode</>.
+ Decode binary data from textual representation in <parameter>string</>.
+ Options for <parameter>format</> are same as in <function>encode</>.
</entry>
<entry><literal>decode('MTIzAAE=', 'base64')</literal></entry>
<entry><literal>123\000\001</literal></entry>
@@ -1436,13 +1436,14 @@
<row>
<entry>
<literal><function>encode</function>(<parameter>data</parameter> <type>bytea</type>,
- <parameter>type</parameter> <type>text</type>)</literal>
+ <parameter>format</parameter> <type>text</type>)</literal>
</entry>
<entry><type>text</type></entry>
<entry>
- Encode binary data to different representation. Supported
- types are: <literal>base64</>, <literal>hex</>, <literal>escape</>.
- <literal>Escape</> merely outputs null bytes as <literal>\000</> and
+ Encode binary data into a textual representation. Supported
+ formats are: <literal>base64</>, <literal>hex</>, <literal>escape</>.
+ <literal>escape</> converts zero bytes and high-bit-set bytes to
+ octal sequences (<literal>\</><replaceable>nnn</>) and
doubles backslashes.
</entry>
<entry><literal>encode(E'123\\000\\001', 'base64')</literal></entry>
@@ -2780,12 +2781,12 @@
<row>
<entry>
<literal><function>decode</function>(<parameter>string</parameter> <type>text</type>,
- <parameter>type</parameter> <type>text</type>)</literal>
+ <parameter>format</parameter> <type>text</type>)</literal>
</entry>
<entry><type>bytea</type></entry>
<entry>
- Decode binary string from <parameter>string</parameter> previously
- encoded with <function>encode</>. Parameter type is same as in <function>encode</>.
+ Decode binary data from textual representation in <parameter>string</>.
+ Options for <parameter>format</> are same as in <function>encode</>.
</entry>
<entry><literal>decode(E'123\\000456', 'escape')</literal></entry>
<entry><literal>123\000456</literal></entry>
@@ -2793,13 +2794,16 @@
<row>
<entry>
- <literal><function>encode</function>(<parameter>string</parameter> <type>bytea</type>,
- <parameter>type</parameter> <type>text</type>)</literal>
+ <literal><function>encode</function>(<parameter>data</parameter> <type>bytea</type>,
+ <parameter>format</parameter> <type>text</type>)</literal>
</entry>
<entry><type>text</type></entry>
<entry>
- Encode binary string to <acronym>ASCII</acronym>-only representation. Supported
- types are: <literal>base64</>, <literal>hex</>, <literal>escape</>.
+ Encode binary data into a textual representation. Supported
+ formats are: <literal>base64</>, <literal>hex</>, <literal>escape</>.
+ <literal>escape</> converts zero bytes and high-bit-set bytes to
+ octal sequences (<literal>\</><replaceable>nnn</>) and
+ doubles backslashes.
</entry>
<entry><literal>encode(E'123\\000456'::bytea, 'escape')</literal></entry>
<entry><literal>123\000456</literal></entry>
@@ -6471,16 +6475,19 @@
<listitem>
<para>
The number of the week of the year that the day is in. By definition
- (<acronym>ISO</acronym> 8601), the first week of a year
- contains January 4 of that year. (The <acronym>ISO</acronym>-8601
- week starts on Monday.) In other words, the first Thursday of
- a year is in week 1 of that year.
+ (<acronym>ISO</acronym> 8601), weeks start on Mondays and the first
+ week of a year contains January 4 of that year. In other words, the
+ first Thursday of a year is in week 1 of that year.
</para>
<para>
- Because of this, it is possible for early January dates to be part of the
- 52nd or 53rd week of the previous year. For example, <literal>2005-01-01</>
- is part of the 53rd week of year 2004, and <literal>2006-01-01</> is part of
- the 52nd week of year 2005.
+ In the ISO definition, it is possible for early-January dates to be
+ part of the 52nd or 53rd week of the previous year, and for
+ late-December dates to be part of the first week of the next year.
+ For example, <literal>2005-01-01</> is part of the 53rd week of year
+ 2004, and <literal>2006-01-01</> is part of the 52nd week of year
+ 2005, while <literal>2012-12-31</> is part of the first week of 2013.
+ It's recommended to use the <literal>isoyear</> field together with
+ <literal>week</> to get consistent results.
</para>
<screen>
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/src/sgml/libpq.sgml
^
|
@@ -2063,11 +2063,11 @@
</varlistentry>
<varlistentry id="libpq-pg-diag-sqlstate">
+ <term><symbol>PG_DIAG_SQLSTATE</></term>
<indexterm>
<primary>error codes</primary>
<secondary>libpq</secondary>
</indexterm>
- <term><symbol>PG_DIAG_SQLSTATE</></term>
<listitem>
<para>
The SQLSTATE code for the error. The SQLSTATE code identifies
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/src/sgml/release-8.4.sgml
^
|
@@ -1,6 +1,235 @@
<!-- doc/src/sgml/release-8.4.sgml -->
<!-- See header comment in release.sgml about typical markup -->
+ <sect1 id="release-8-4-17">
+ <title>Release 8.4.17</title>
+
+ <note>
+ <title>Release Date</title>
+ <simpara>2013-04-04</simpara>
+ </note>
+
+ <para>
+ This release contains a variety of fixes from 8.4.16.
+ For information about new features in the 8.4 major release, see
+ <xref linkend="release-8-4">.
+ </para>
+
+ <sect2>
+ <title>Migration to Version 8.4.17</title>
+
+ <para>
+ A dump/restore is not required for those running 8.4.X.
+ </para>
+
+ <para>
+ However, this release corrects several errors in management of GiST
+ indexes. After installing this update, it is advisable to
+ <command>REINDEX</> any GiST indexes that meet one or more of the
+ conditions described below.
+ </para>
+
+ <para>
+ Also, if you are upgrading from a version earlier than 8.4.10,
+ see the release notes for 8.4.10.
+ </para>
+
+ </sect2>
+
+ <sect2>
+ <title>Changes</title>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>
+ Reset OpenSSL randomness state in each postmaster child process
+ (Marko Kreen)
+ </para>
+
+ <para>
+ This avoids a scenario wherein random numbers generated by
+ <filename>contrib/pgcrypto</> functions might be relatively easy for
+ another database user to guess. The risk is only significant when
+ the postmaster is configured with <varname>ssl</> = <literal>on</>
+ but most connections don't use SSL encryption. (CVE-2013-1900)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix GiST indexes to not use <quote>fuzzy</> geometric comparisons when
+ it's not appropriate to do so (Alexander Korotkov)
+ </para>
+
+ <para>
+ The core geometric types perform comparisons using <quote>fuzzy</>
+ equality, but <function>gist_box_same</> must do exact comparisons,
+ else GiST indexes using it might become inconsistent. After installing
+ this update, users should <command>REINDEX</> any GiST indexes on
+ <type>box</>, <type>polygon</>, <type>circle</>, or <type>point</>
+ columns, since all of these use <function>gist_box_same</>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix erroneous range-union and penalty logic in GiST indexes that use
+ <filename>contrib/btree_gist</> for variable-width data types, that is
+ <type>text</>, <type>bytea</>, <type>bit</>, and <type>numeric</>
+ columns (Tom Lane)
+ </para>
+
+ <para>
+ These errors could result in inconsistent indexes in which some keys
+ that are present would not be found by searches, and also in useless
+ index bloat. Users are advised to <command>REINDEX</> such indexes
+ after installing this update.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix bugs in GiST page splitting code for multi-column indexes
+ (Tom Lane)
+ </para>
+
+ <para>
+ These errors could result in inconsistent indexes in which some keys
+ that are present would not be found by searches, and also in indexes
+ that are unnecessarily inefficient to search. Users are advised to
+ <command>REINDEX</> multi-column GiST indexes after installing this
+ update.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix infinite-loop risk in regular expression compilation (Tom Lane,
+ Don Porter)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix potential null-pointer dereference in regular expression compilation
+ (Tom Lane)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix <function>to_char()</> to use ASCII-only case-folding rules where
+ appropriate (Tom Lane)
+ </para>
+
+ <para>
+ This fixes misbehavior of some template patterns that should be
+ locale-independent, but mishandled <quote><literal>I</></quote> and
+ <quote><literal>i</></quote> in Turkish locales.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix unwanted rejection of timestamp <literal>1999-12-31 24:00:00</>
+ (Tom Lane)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Remove useless <quote>picksplit doesn't support secondary split</> log
+ messages (Josh Hansen, Tom Lane)
+ </para>
+
+ <para>
+ This message seems to have been added in expectation of code that was
+ never written, and probably never will be, since GiST's default
+ handling of secondary splits is actually pretty good. So stop nagging
+ end users about it.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix possible failure to send a session's last few transaction
+ commit/abort counts to the statistics collector (Tom Lane)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Eliminate memory leaks in PL/Perl's <function>spi_prepare()</> function
+ (Alex Hunsaker, Tom Lane)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix <application>pg_dumpall</> to handle database names containing
+ <quote><literal>=</></quote> correctly (Heikki Linnakangas)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Avoid crash in <application>pg_dump</> when an incorrect connection
+ string is given (Heikki Linnakangas)
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Ignore invalid indexes in <application>pg_dump</> (Michael Paquier)
+ </para>
+
+ <para>
+ Dumping invalid indexes can cause problems at restore time, for example
+ if the reason the index creation failed was because it tried to enforce
+ a uniqueness condition not satisfied by the table's data. Also, if the
+ index creation is in fact still in progress, it seems reasonable to
+ consider it to be an uncommitted DDL change, which
+ <application>pg_dump</> wouldn't be expected to dump anyway.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Fix <filename>contrib/pg_trgm</>'s <function>similarity()</> function
+ to return zero for trigram-less strings (Tom Lane)
+ </para>
+
+ <para>
+ Previously it returned <literal>NaN</> due to internal division by zero.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Update time zone data files to <application>tzdata</> release 2013b
+ for DST law changes in Chile, Haiti, Morocco, Paraguay, and some
+ Russian areas. Also, historical zone data corrections for numerous
+ places.
+ </para>
+
+ <para>
+ Also, update the time zone abbreviation files for recent changes in
+ Russia and elsewhere: <literal>CHOT</>, <literal>GET</>,
+ <literal>IRKT</>, <literal>KGT</>, <literal>KRAT</>, <literal>MAGT</>,
+ <literal>MAWT</>, <literal>MSK</>, <literal>NOVT</>, <literal>OMST</>,
+ <literal>TKT</>, <literal>VLAT</>, <literal>WST</>, <literal>YAKT</>,
+ <literal>YEKT</> now follow their current meanings, and
+ <literal>VOLT</> (Europe/Volgograd) and <literal>MIST</>
+ (Antarctica/Macquarie) are added to the default abbreviations list.
+ </para>
+ </listitem>
+
+ </itemizedlist>
+
+ </sect2>
+ </sect1>
+
<sect1 id="release-8-4-16">
<title>Release 8.4.16</title>
@@ -98,10 +327,10 @@
</para>
<para>
- The main consequence of this mistake is that lowering <link
+ In installations that have existed for more than <link
linkend="guc-vacuum-freeze-min-age"><varname>vacuum_freeze_min_age</></link>
- would cause full-table vacuuming scans to occur much more frequently
- than intended.
+ transactions, this mistake prevented autovacuum from using partial-table
+ scans, so that a full-table scan would always happen instead.
</para>
</listitem>
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/doc/src/sgml/xml2.sgml
^
|
@@ -21,11 +21,11 @@
That functionality covers XML syntax checking and XPath queries,
which is what this module does, and more, but the API is
not at all compatible. It is planned that this module will be
- removed in PostgreSQL 8.4 in favor of the newer standard API, so
+ removed in a future version of PostgreSQL in favor of the newer standard API, so
you are encouraged to try converting your applications. If you
find that some of the functionality of this module is not
available in an adequate form with the newer API, please explain
- your issue to pgsql-hackers@postgresql.org so that the deficiency
+ your issue to <email>pgsql-hackers@postgresql.org</email> so that the deficiency
can be addressed.
</para>
</sect2>
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/access/gist/gist.c
^
|
@@ -945,18 +945,12 @@
IndexTuple *lvectup,
*rvectup;
GistSplitVector v;
- GistEntryVector *entryvec;
int i;
SplitedPageLayout *res = NULL;
- /* generate the item array */
- entryvec = palloc(GEVHDRSZ + (len + 1) * sizeof(GISTENTRY));
- entryvec->n = len + 1;
-
memset(v.spl_lisnull, TRUE, sizeof(bool) * giststate->tupdesc->natts);
memset(v.spl_risnull, TRUE, sizeof(bool) * giststate->tupdesc->natts);
- gistSplitByKey(r, page, itup, len, giststate,
- &v, entryvec, 0);
+ gistSplitByKey(r, page, itup, len, giststate, &v, 0);
/* form left and right vector */
lvectup = (IndexTuple *) palloc(sizeof(IndexTuple) * (len + 1));
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/access/gist/gistproc.c
^
|
@@ -533,6 +533,13 @@
/*
* Equality method
+ *
+ * This is used for boxes, circles, and polygons, all of which store
+ * boxes as GiST index entries.
+ *
+ * Returns true only when boxes are exactly the same. We can't use fuzzy
+ * comparisons here without breaking index consistency; therefore, this isn't
+ * equivalent to box_same().
*/
Datum
gist_box_same(PG_FUNCTION_ARGS)
@@ -542,11 +549,10 @@
bool *result = (bool *) PG_GETARG_POINTER(2);
if (b1 && b2)
- *result = DatumGetBool(DirectFunctionCall2(box_same,
- PointerGetDatum(b1),
- PointerGetDatum(b2)));
+ *result = (b1->low.x == b2->low.x && b1->low.y == b2->low.y &&
+ b1->high.x == b2->high.x && b1->high.y == b2->high.y);
else
- *result = (b1 == NULL && b2 == NULL) ? TRUE : FALSE;
+ *result = (b1 == NULL && b2 == NULL);
PG_RETURN_POINTER(result);
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/access/gist/gistsplit.c
^
|
@@ -1,7 +1,18 @@
/*-------------------------------------------------------------------------
*
* gistsplit.c
- * Split page algorithm
+ * Multi-column page splitting algorithm
+ *
+ * This file is concerned with making good page-split decisions in multi-column
+ * GiST indexes. The opclass-specific picksplit functions can only be expected
+ * to produce answers based on a single column. We first run the picksplit
+ * function for column 1; then, if there are more columns, we check if any of
+ * the tuples are "don't cares" so far as the column 1 split is concerned
+ * (that is, they could go to either side for no additional penalty). If so,
+ * we try to redistribute those tuples on the basis of the next column.
+ * Repeat till we're out of columns.
+ *
+ * gistSplitByKey() is the entry point to this file.
*
*
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
@@ -19,21 +30,22 @@
typedef struct
{
- Datum *attr;
- int len;
OffsetNumber *entries;
+ int len;
+ Datum *attr;
bool *isnull;
- bool *equiv;
+ bool *dontcare;
} GistSplitUnion;
/*
- * Forms unions of subkeys after page split, but
- * uses only tuples aren't in groups of equalent tuples
+ * Form unions of subkeys in itvec[] entries listed in gsvp->entries[],
+ * ignoring any tuples that are marked in gsvp->dontcare[]. Subroutine for
+ * gistunionsubkey.
*/
static void
gistunionsubkeyvec(GISTSTATE *giststate, IndexTuple *itvec,
- GistSplitUnion *gsvp, int startkey)
+ GistSplitUnion *gsvp)
{
IndexTuple *cleanedItVec;
int i,
@@ -43,128 +55,158 @@
for (i = 0; i < gsvp->len; i++)
{
- if (gsvp->equiv && gsvp->equiv[gsvp->entries[i]])
+ if (gsvp->dontcare && gsvp->dontcare[gsvp->entries[i]])
continue;
cleanedItVec[cleanedLen++] = itvec[gsvp->entries[i] - 1];
}
- gistMakeUnionItVec(giststate, cleanedItVec, cleanedLen, startkey,
- gsvp->attr, gsvp->isnull);
+ if (!gistMakeUnionItVec(giststate, cleanedItVec, cleanedLen,
+ gsvp->attr, gsvp->isnull))
+ elog(ERROR, "invalid GiST tuple not expected");
pfree(cleanedItVec);
}
/*
- * unions subkeys for after user picksplit over attno-1 column
+ * Recompute unions of left- and right-side subkeys after a page split,
+ * ignoring any tuples that are marked in spl->spl_dontcare[].
+ *
+ * Note: we always recompute union keys for all index columns. In some cases
+ * this might represent duplicate work for the leftmost column(s), but it's
+ * not safe to assume that "zero penalty to move a tuple" means "the union
+ * key doesn't change at all". Penalty functions aren't 100% accurate.
*/
static void
-gistunionsubkey(GISTSTATE *giststate, IndexTuple *itvec, GistSplitVector *spl, int attno)
+gistunionsubkey(GISTSTATE *giststate, IndexTuple *itvec, GistSplitVector *spl)
{
GistSplitUnion gsvp;
- gsvp.equiv = spl->spl_equiv;
+ gsvp.dontcare = spl->spl_dontcare;
- gsvp.attr = spl->spl_lattr;
- gsvp.len = spl->splitVector.spl_nleft;
gsvp.entries = spl->splitVector.spl_left;
+ gsvp.len = spl->splitVector.spl_nleft;
+ gsvp.attr = spl->spl_lattr;
gsvp.isnull = spl->spl_lisnull;
- gistunionsubkeyvec(giststate, itvec, &gsvp, attno);
+ gistunionsubkeyvec(giststate, itvec, &gsvp);
- gsvp.attr = spl->spl_rattr;
- gsvp.len = spl->splitVector.spl_nright;
gsvp.entries = spl->splitVector.spl_right;
+ gsvp.len = spl->splitVector.spl_nright;
+ gsvp.attr = spl->spl_rattr;
gsvp.isnull = spl->spl_risnull;
- gistunionsubkeyvec(giststate, itvec, &gsvp, attno);
+ gistunionsubkeyvec(giststate, itvec, &gsvp);
}
/*
- * find group in vector with equivalent value
+ * Find tuples that are "don't cares", that is could be moved to the other
+ * side of the split with zero penalty, so far as the attno column is
+ * concerned.
+ *
+ * Don't-care tuples are marked by setting the corresponding entry in
+ * spl->spl_dontcare[] to "true". Caller must have initialized that array
+ * to zeroes.
+ *
+ * Returns number of don't-cares found.
*/
static int
-gistfindgroup(Relation r, GISTSTATE *giststate, GISTENTRY *valvec, GistSplitVector *spl, int attno)
+findDontCares(Relation r, GISTSTATE *giststate, GISTENTRY *valvec,
+ GistSplitVector *spl, int attno)
{
int i;
GISTENTRY entry;
- int len = 0;
+ int NumDontCare = 0;
/*
- * attno key is always not null (see gistSplitByKey), so we may not check
- * for nulls
+ * First, search the left-side tuples to see if any have zero penalty to
+ * be added to the right-side union key.
+ *
+ * attno column is known all-not-null (see gistSplitByKey), so we need not
+ * check for nulls
*/
- gistentryinit(entry, spl->splitVector.spl_rdatum, r, NULL, (OffsetNumber) 0, FALSE);
+ gistentryinit(entry, spl->splitVector.spl_rdatum, r, NULL,
+ (OffsetNumber) 0, FALSE);
for (i = 0; i < spl->splitVector.spl_nleft; i++)
{
+ int j = spl->splitVector.spl_left[i];
float penalty = gistpenalty(giststate, attno, &entry, false,
- &valvec[spl->splitVector.spl_left[i]], false);
+ &valvec[j], false);
if (penalty == 0.0)
{
- spl->spl_equiv[spl->splitVector.spl_left[i]] = true;
- len++;
+ spl->spl_dontcare[j] = true;
+ NumDontCare++;
}
}
- gistentryinit(entry, spl->splitVector.spl_ldatum, r, NULL, (OffsetNumber) 0, FALSE);
+ /* And conversely for the right-side tuples */
+ gistentryinit(entry, spl->splitVector.spl_ldatum, r, NULL,
+ (OffsetNumber) 0, FALSE);
for (i = 0; i < spl->splitVector.spl_nright; i++)
{
+ int j = spl->splitVector.spl_right[i];
float penalty = gistpenalty(giststate, attno, &entry, false,
- &valvec[spl->splitVector.spl_right[i]], false);
+ &valvec[j], false);
if (penalty == 0.0)
{
- spl->spl_equiv[spl->splitVector.spl_right[i]] = true;
- len++;
+ spl->spl_dontcare[j] = true;
+ NumDontCare++;
}
}
- return len;
+ return NumDontCare;
}
+/*
+ * Remove tuples that are marked don't-cares from the tuple index array a[]
+ * of length *len. This is applied separately to the spl_left and spl_right
+ * arrays.
+ */
static void
-cleanupOffsets(OffsetNumber *a, int *len, bool *equiv, int *LenEquiv)
+removeDontCares(OffsetNumber *a, int *len, const bool *dontcare)
{
- int curlen,
+ int origlen,
+ newlen,
i;
OffsetNumber *curwpos;
- curlen = *len;
+ origlen = newlen = *len;
curwpos = a;
- for (i = 0; i < *len; i++)
+ for (i = 0; i < origlen; i++)
{
- if (equiv[a[i]] == FALSE)
+ OffsetNumber ai = a[i];
+
+ if (dontcare[ai] == FALSE)
{
- *curwpos = a[i];
+ /* re-emit item into a[] */
+ *curwpos = ai;
curwpos++;
}
else
- {
- /* corner case: we shouldn't make void array */
- if (curlen == 1)
- {
- equiv[a[i]] = FALSE; /* mark item as non-equivalent */
- i--; /* redo the same */
- *LenEquiv -= 1;
- continue;
- }
- else
- curlen--;
- }
+ newlen--;
}
- *len = curlen;
+ *len = newlen;
}
+/*
+ * Place a single don't-care tuple into either the left or right side of the
+ * split, according to which has least penalty for merging the tuple into
+ * the previously-computed union keys. We need consider only columns starting
+ * at attno.
+ */
static void
-placeOne(Relation r, GISTSTATE *giststate, GistSplitVector *v, IndexTuple itup, OffsetNumber off, int attno)
+placeOne(Relation r, GISTSTATE *giststate, GistSplitVector *v,
+ IndexTuple itup, OffsetNumber off, int attno)
{
GISTENTRY identry[INDEX_MAX_KEYS];
bool isnull[INDEX_MAX_KEYS];
bool toLeft = true;
- gistDeCompressAtt(giststate, r, itup, NULL, (OffsetNumber) 0, identry, isnull);
+ gistDeCompressAtt(giststate, r, itup, NULL, (OffsetNumber) 0,
+ identry, isnull);
for (; attno < giststate->tupdesc->natts; attno++)
{
@@ -173,9 +215,11 @@
GISTENTRY entry;
gistentryinit(entry, v->spl_lattr[attno], r, NULL, 0, FALSE);
- lpenalty = gistpenalty(giststate, attno, &entry, v->spl_lisnull[attno], identry + attno, isnull[attno]);
+ lpenalty = gistpenalty(giststate, attno, &entry, v->spl_lisnull[attno],
+ identry + attno, isnull[attno]);
gistentryinit(entry, v->spl_rattr[attno], r, NULL, 0, FALSE);
- rpenalty = gistpenalty(giststate, attno, &entry, v->spl_risnull[attno], identry + attno, isnull[attno]);
+ rpenalty = gistpenalty(giststate, attno, &entry, v->spl_risnull[attno],
+ identry + attno, isnull[attno]);
if (lpenalty != rpenalty)
{
@@ -199,13 +243,21 @@
} while(0)
/*
- * adjust left and right unions according to splits by previous
- * split by firsts columns. This function is called only in case
- * when pickSplit doesn't support subspplit.
+ * Clean up when we did a secondary split but the user-defined PickSplit
+ * method didn't support it (leaving spl_ldatum_exists or spl_rdatum_exists
+ * true).
+ *
+ * We consider whether to swap the left and right outputs of the secondary
+ * split; this can be worthwhile if the penalty for merging those tuples into
+ * the previously chosen sets is less that way.
+ *
+ * In any case we must update the union datums for the current column by
+ * adding in the previous union keys (oldL/oldR), since the user-defined
+ * PickSplit method didn't do so.
*/
-
static void
-supportSecondarySplit(Relation r, GISTSTATE *giststate, int attno, GIST_SPLITVEC *sv, Datum oldL, Datum oldR)
+supportSecondarySplit(Relation r, GISTSTATE *giststate, int attno,
+ GIST_SPLITVEC *sv, Datum oldL, Datum oldR)
{
bool leaveOnLeft = true,
tmpBool;
@@ -231,7 +283,6 @@
if (penalty1 > penalty2)
leaveOnLeft = false;
-
}
else
{
@@ -240,10 +291,15 @@
penalty2;
/*
- * there is only one previously defined union, so we just choose swap
- * or not by lowest penalty
+ * There is only one previously defined union, so we just choose swap
+ * or not by lowest penalty for that side. We can only get here if a
+ * secondary split happened to have all NULLs in its column in the
+ * tuples that the outer recursion level had assigned to one side.
+ * (Note that the null checks in gistSplitByKey don't prevent the
+ * case, because they'll only be checking tuples that were considered
+ * don't-cares at the outer recursion level, not the tuples that went
+ * into determining the passed-down left and right union keys.)
*/
-
penalty1 = gistpenalty(giststate, attno, entry1, false, &entrySL, false);
penalty2 = gistpenalty(giststate, attno, entry1, false, &entrySR, false);
@@ -281,10 +337,9 @@
}
/*
- * Trivial picksplit implementaion. Function called only
- * if user-defined picksplit puts all keys to the one page.
- * That is a bug of user-defined picksplit but we'd like
- * to "fix" that.
+ * Trivial picksplit implementation. Function called only
+ * if user-defined picksplit puts all keys on the same side of the split.
+ * That is a bug of user-defined picksplit but we don't want to fail.
*/
static void
genericPickSplit(GISTSTATE *giststate, GistEntryVector *entryvec, GIST_SPLITVEC *v, int attno)
@@ -317,9 +372,8 @@
}
/*
- * Form unions of each page
+ * Form union datums for each side
*/
-
evec = palloc(sizeof(GISTENTRY) * entryvec->n + GEVHDRSZ);
evec->n = v->spl_nleft;
@@ -338,12 +392,23 @@
}
/*
- * Calls user picksplit method for attno columns to split vector to
- * two vectors. May use attno+n columns data to
- * get better split.
- * Returns TRUE and v->spl_equiv = NULL if left and right unions of attno columns are the same,
- * so caller may find better split
- * Returns TRUE and v->spl_equiv != NULL if there is tuples which may be freely moved
+ * Calls user picksplit method for attno column to split tuples into
+ * two vectors.
+ *
+ * Returns FALSE if split is complete (there are no more index columns, or
+ * there is no need to consider them because split is optimal already).
+ *
+ * Returns TRUE and v->spl_dontcare = NULL if the picksplit result is
+ * degenerate (all tuples seem to be don't-cares), so we should just
+ * disregard this column and split on the next column(s) instead.
+ *
+ * Returns TRUE and v->spl_dontcare != NULL if there are don't-care tuples
+ * that could be relocated based on the next column(s). The don't-care
+ * tuples have been removed from the split and must be reinserted by caller.
+ * There is at least one non-don't-care tuple on each side of the split,
+ * and union keys for all columns are updated to include just those tuples.
+ *
+ * A TRUE result implies there is at least one more index column.
*/
static bool
gistUserPicksplit(Relation r, GistEntryVector *entryvec, int attno, GistSplitVector *v,
@@ -352,21 +417,28 @@
GIST_SPLITVEC *sv = &v->splitVector;
/*
- * now let the user-defined picksplit function set up the split vector; in
- * entryvec there is no null value!!
+ * Prepare spl_ldatum/spl_rdatum/spl_ldatum_exists/spl_rdatum_exists in
+ * case we are doing a secondary split (see comments in gist.h).
*/
-
sv->spl_ldatum_exists = (v->spl_lisnull[attno]) ? false : true;
sv->spl_rdatum_exists = (v->spl_risnull[attno]) ? false : true;
sv->spl_ldatum = v->spl_lattr[attno];
sv->spl_rdatum = v->spl_rattr[attno];
+ /*
+ * Let the opclass-specific PickSplit method do its thing. Note that at
+ * this point we know there are no null keys in the entryvec.
+ */
FunctionCall2(&giststate->picksplitFn[attno],
PointerGetDatum(entryvec),
PointerGetDatum(sv));
if (sv->spl_nleft == 0 || sv->spl_nright == 0)
{
+ /*
+ * User-defined picksplit failed to create an actual split, ie it put
+ * everything on the same side. Complain but cope.
+ */
ereport(DEBUG1,
(errcode(ERRCODE_INTERNAL_ERROR),
errmsg("picksplit method for column %d of index \"%s\" failed",
@@ -374,107 +446,130 @@
errhint("The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command.")));
/*
- * Reinit GIST_SPLITVEC. Although that fields are not used by
- * genericPickSplit(), let us set up it for further processing
+ * Reinit GIST_SPLITVEC. Although these fields are not used by
+ * genericPickSplit(), set them up for further processing
*/
sv->spl_ldatum_exists = (v->spl_lisnull[attno]) ? false : true;
sv->spl_rdatum_exists = (v->spl_risnull[attno]) ? false : true;
sv->spl_ldatum = v->spl_lattr[attno];
sv->spl_rdatum = v->spl_rattr[attno];
+ /* Do a generic split */
genericPickSplit(giststate, entryvec, sv, attno);
-
- if (sv->spl_ldatum_exists || sv->spl_rdatum_exists)
- supportSecondarySplit(r, giststate, attno, sv, v->spl_lattr[attno], v->spl_rattr[attno]);
}
else
{
- /* compatibility with old code */
+ /* hack for compatibility with old picksplit API */
if (sv->spl_left[sv->spl_nleft - 1] == InvalidOffsetNumber)
sv->spl_left[sv->spl_nleft - 1] = (OffsetNumber) (entryvec->n - 1);
if (sv->spl_right[sv->spl_nright - 1] == InvalidOffsetNumber)
sv->spl_right[sv->spl_nright - 1] = (OffsetNumber) (entryvec->n - 1);
-
- if (sv->spl_ldatum_exists || sv->spl_rdatum_exists)
- {
- elog(LOG, "picksplit method for column %d of index \"%s\" doesn't support secondary split",
- attno + 1, RelationGetRelationName(r));
-
- supportSecondarySplit(r, giststate, attno, sv, v->spl_lattr[attno], v->spl_rattr[attno]);
- }
}
+ /* Clean up if PickSplit didn't take care of a secondary split */
+ if (sv->spl_ldatum_exists || sv->spl_rdatum_exists)
+ supportSecondarySplit(r, giststate, attno, sv,
+ v->spl_lattr[attno], v->spl_rattr[attno]);
+
+ /* emit union datums computed by PickSplit back to v arrays */
v->spl_lattr[attno] = sv->spl_ldatum;
v->spl_rattr[attno] = sv->spl_rdatum;
v->spl_lisnull[attno] = false;
v->spl_risnull[attno] = false;
/*
- * if index is multikey, then we must to try get smaller bounding box for
- * subkey(s)
+ * If index columns remain, then consider whether we can improve the split
+ * by using them.
*/
- v->spl_equiv = NULL;
+ v->spl_dontcare = NULL;
- if (giststate->tupdesc->natts > 1 && attno + 1 != giststate->tupdesc->natts)
+ if (attno + 1 < giststate->tupdesc->natts)
{
- if (gistKeyIsEQ(giststate, attno, sv->spl_ldatum, sv->spl_rdatum))
- {
- /*
- * Left and right key's unions are equial, so we can get better
- * split by following columns. Note, unions for attno columns are
- * already done.
- */
+ int NumDontCare;
+ /*
+ * Make a quick check to see if left and right union keys are equal;
+ * if so, the split is certainly degenerate, so tell caller to
+ * re-split with the next column.
+ */
+ if (gistKeyIsEQ(giststate, attno, sv->spl_ldatum, sv->spl_rdatum))
return true;
- }
- else
- {
- int LenEquiv;
- v->spl_equiv = (bool *) palloc0(sizeof(bool) * (entryvec->n + 1));
+ /*
+ * Locate don't-care tuples, if any. If there are none, the split is
+ * optimal, so just fall out and return false.
+ */
+ v->spl_dontcare = (bool *) palloc0(sizeof(bool) * (entryvec->n + 1));
+
+ NumDontCare = findDontCares(r, giststate, entryvec->vector, v, attno);
- LenEquiv = gistfindgroup(r, giststate, entryvec->vector, v, attno);
+ if (NumDontCare > 0)
+ {
+ /*
+ * Remove don't-cares from spl_left[] and spl_right[].
+ */
+ removeDontCares(sv->spl_left, &sv->spl_nleft, v->spl_dontcare);
+ removeDontCares(sv->spl_right, &sv->spl_nright, v->spl_dontcare);
/*
- * if possible, we should distribute equivalent tuples
+ * If all tuples on either side were don't-cares, the split is
+ * degenerate, and we're best off to ignore it and split on the
+ * next column. (We used to try to press on with a secondary
+ * split by forcing a random tuple on each side to be treated as
+ * non-don't-care, but it seems unlikely that that technique
+ * really gives a better result. Note that we don't want to try a
+ * secondary split with empty left or right primary split sides,
+ * because then there is no union key on that side for the
+ * PickSplit function to try to expand, so it can have no good
+ * figure of merit for what it's doing. Also note that this check
+ * ensures we can't produce a bogus one-side-only split in the
+ * NumDontCare == 1 special case below.)
*/
- if (LenEquiv == 0)
+ if (sv->spl_nleft == 0 || sv->spl_nright == 0)
{
- gistunionsubkey(giststate, itup, v, attno + 1);
+ v->spl_dontcare = NULL;
+ return true;
}
- else
+
+ /*
+ * Recompute union keys, considering only non-don't-care tuples.
+ * NOTE: this will set union keys for remaining index columns,
+ * which will cause later calls of gistUserPicksplit to pass those
+ * values down to user-defined PickSplit methods with
+ * spl_ldatum_exists/spl_rdatum_exists set true.
+ */
+ gistunionsubkey(giststate, itup, v);
+
+ if (NumDontCare == 1)
{
- cleanupOffsets(sv->spl_left, &sv->spl_nleft, v->spl_equiv, &LenEquiv);
- cleanupOffsets(sv->spl_right, &sv->spl_nright, v->spl_equiv, &LenEquiv);
+ /*
+ * If there's only one don't-care tuple then we can't do a
+ * PickSplit on it, so just choose whether to send it left or
+ * right by comparing penalties. We needed the
+ * gistunionsubkey step anyway so that we have appropriate
+ * union keys for figuring the penalties.
+ */
+ OffsetNumber toMove;
- gistunionsubkey(giststate, itup, v, attno + 1);
- if (LenEquiv == 1)
+ /* find it ... */
+ for (toMove = FirstOffsetNumber; toMove < entryvec->n; toMove++)
{
- /*
- * In case with one tuple we just choose left-right by
- * penalty. It's simplify user-defined pickSplit
- */
- OffsetNumber toMove = InvalidOffsetNumber;
-
- for (toMove = FirstOffsetNumber; toMove < entryvec->n; toMove++)
- if (v->spl_equiv[toMove])
- break;
- Assert(toMove < entryvec->n);
-
- placeOne(r, giststate, v, itup[toMove - 1], toMove, attno + 1);
-
- /*
- * redo gistunionsubkey(): it will not degradate
- * performance, because it's very rarely
- */
- v->spl_equiv = NULL;
- gistunionsubkey(giststate, itup, v, attno + 1);
-
- return false;
+ if (v->spl_dontcare[toMove])
+ break;
}
- else if (LenEquiv > 1)
- return true;
+ Assert(toMove < entryvec->n);
+
+ /* ... and assign it to cheaper side */
+ placeOne(r, giststate, v, itup[toMove - 1], toMove, attno + 1);
+
+ /*
+ * At this point the union keys are wrong, but we don't care
+ * because we're done splitting. The outermost recursion
+ * level of gistSplitByKey will fix things before returning.
+ */
}
+ else
+ return true;
}
}
@@ -482,7 +577,7 @@
}
/*
- * simple split page
+ * simply split page in half
*/
static void
gistSplitHalf(GIST_SPLITVEC *v, int len)
@@ -497,6 +592,8 @@
v->spl_right[v->spl_nright++] = i;
else
v->spl_left[v->spl_nleft++] = i;
+
+ /* we need not compute union keys, caller took care of it */
}
/*
@@ -541,27 +638,51 @@
v->splitVector.spl_left[v->splitVector.spl_nleft++] = i;
v->spl_leftvalid = true;
- gsvp.equiv = NULL;
+ gsvp.dontcare = NULL;
gsvp.attr = v->spl_lattr;
gsvp.len = v->splitVector.spl_nleft;
gsvp.entries = v->splitVector.spl_left;
gsvp.isnull = v->spl_lisnull;
- gistunionsubkeyvec(giststate, itup, &gsvp, 0);
+ gistunionsubkeyvec(giststate, itup, &gsvp);
}
}
/*
- * trys to split page by attno key, in a case of null
- * values move its to separate page.
+ * gistSplitByKey: main entry point for page-splitting algorithm
+ *
+ * r: index relation
+ * page: page being split
+ * itup: array of IndexTuples to be processed
+ * len: number of IndexTuples to be processed (must be at least 2)
+ * giststate: additional info about index
+ * v: working state and output area
+ * attno: column we are working on (zero-based index)
+ *
+ * Outside caller must initialize v->spl_lisnull and v->spl_risnull arrays
+ * to all-TRUE. On return, spl_left/spl_nleft contain indexes of tuples
+ * to go left, spl_right/spl_nright contain indexes of tuples to go right,
+ * spl_lattr/spl_lisnull contain left-side union key values, and
+ * spl_rattr/spl_risnull contain right-side union key values. Other fields
+ * in this struct are workspace for this file.
+ *
+ * Outside caller must pass zero for attno. The function may internally
+ * recurse to the next column by passing attno+1.
*/
void
-gistSplitByKey(Relation r, Page page, IndexTuple *itup, int len, GISTSTATE *giststate,
- GistSplitVector *v, GistEntryVector *entryvec, int attno)
+gistSplitByKey(Relation r, Page page, IndexTuple *itup, int len,
+ GISTSTATE *giststate, GistSplitVector *v, int attno)
{
- int i;
- static OffsetNumber offNullTuples[MaxOffsetNumber];
+ GistEntryVector *entryvec;
+ OffsetNumber *offNullTuples;
int nOffNullTuples = 0;
+ int i;
+
+ /* generate the item array, and identify tuples with null keys */
+ /* note that entryvec->vector[0] goes unused in this code */
+ entryvec = palloc(GEVHDRSZ + (len + 1) * sizeof(GISTENTRY));
+ entryvec->n = len + 1;
+ offNullTuples = (OffsetNumber *) palloc(len * sizeof(OffsetNumber));
for (i = 1; i <= len; i++)
{
@@ -574,7 +695,8 @@
return;
}
- datum = index_getattr(itup[i - 1], attno + 1, giststate->tupdesc, &IsNull);
+ datum = index_getattr(itup[i - 1], attno + 1, giststate->tupdesc,
+ &IsNull);
gistdentryinit(giststate, attno, &(entryvec->vector[i]),
datum, r, page, i,
FALSE, IsNull);
@@ -587,24 +709,24 @@
if (nOffNullTuples == len)
{
/*
- * Corner case: All keys in attno column are null, we should try to
- * split by keys in next column. It all keys in all columns are NULL
- * just split page half by half
+ * Corner case: All keys in attno column are null, so just transfer
+ * our attention to the next column. If there's no next column, just
+ * split page in half.
*/
v->spl_risnull[attno] = v->spl_lisnull[attno] = TRUE;
- if (attno + 1 == r->rd_att->natts)
- gistSplitHalf(&v->splitVector, len);
+ if (attno + 1 < giststate->tupdesc->natts)
+ gistSplitByKey(r, page, itup, len, giststate, v, attno + 1);
else
- gistSplitByKey(r, page, itup, len, giststate, v, entryvec, attno + 1);
+ gistSplitHalf(&v->splitVector, len);
}
else if (nOffNullTuples > 0)
{
int j = 0;
/*
- * We don't want to mix NULLs and not-NULLs keys on one page, so move
- * nulls to right page
+ * We don't want to mix NULL and not-NULL keys on one page, so split
+ * nulls to right page and not-nulls to left.
*/
v->splitVector.spl_right = offNullTuples;
v->splitVector.spl_nright = nOffNullTuples;
@@ -618,65 +740,98 @@
else
v->splitVector.spl_left[v->splitVector.spl_nleft++] = i;
- v->spl_equiv = NULL;
- gistunionsubkey(giststate, itup, v, attno);
+ /* Compute union keys, unless outer recursion level will handle it */
+ if (attno == 0 && giststate->tupdesc->natts == 1)
+ {
+ v->spl_dontcare = NULL;
+ gistunionsubkey(giststate, itup, v);
+ }
}
else
{
/*
- * all keys are not-null
+ * All keys are not-null, so apply user-defined PickSplit method
*/
- entryvec->n = len + 1;
-
- if (gistUserPicksplit(r, entryvec, attno, v, itup, len, giststate) && attno + 1 != r->rd_att->natts)
+ if (gistUserPicksplit(r, entryvec, attno, v, itup, len, giststate))
{
/*
- * Splitting on attno column is not optimized: there is a tuples
- * which can be freely left or right page, we will try to split
- * page by following columns
+ * Splitting on attno column is not optimal, so consider
+ * redistributing don't-care tuples according to the next column
*/
- if (v->spl_equiv == NULL)
+ Assert(attno + 1 < giststate->tupdesc->natts);
+
+ if (v->spl_dontcare == NULL)
{
/*
- * simple case: left and right keys for attno column are
- * equial
+ * This split was actually degenerate, so ignore it altogether
+ * and just split according to the next column.
*/
- gistSplitByKey(r, page, itup, len, giststate, v, entryvec, attno + 1);
+ gistSplitByKey(r, page, itup, len, giststate, v, attno + 1);
}
else
{
- /* we should clean up vector from already distributed tuples */
- IndexTuple *newitup = (IndexTuple *) palloc((len + 1) * sizeof(IndexTuple));
- OffsetNumber *map = (OffsetNumber *) palloc((len + 1) * sizeof(IndexTuple));
+ /*
+ * Form an array of just the don't-care tuples to pass to a
+ * recursive invocation of this function for the next column.
+ */
+ IndexTuple *newitup = (IndexTuple *) palloc(len * sizeof(IndexTuple));
+ OffsetNumber *map = (OffsetNumber *) palloc(len * sizeof(OffsetNumber));
int newlen = 0;
- GIST_SPLITVEC backupSplit = v->splitVector;
+ GIST_SPLITVEC backupSplit;
for (i = 0; i < len; i++)
- if (v->spl_equiv[i + 1])
+ {
+ if (v->spl_dontcare[i + 1])
{
+ newitup[newlen] = itup[i];
map[newlen] = i + 1;
- newitup[newlen++] = itup[i];
+ newlen++;
}
+ }
Assert(newlen > 0);
+ /*
+ * Make a backup copy of v->splitVector, since the recursive
+ * call will overwrite that with its own result.
+ */
+ backupSplit = v->splitVector;
backupSplit.spl_left = (OffsetNumber *) palloc(sizeof(OffsetNumber) * len);
memcpy(backupSplit.spl_left, v->splitVector.spl_left, sizeof(OffsetNumber) * v->splitVector.spl_nleft);
backupSplit.spl_right = (OffsetNumber *) palloc(sizeof(OffsetNumber) * len);
memcpy(backupSplit.spl_right, v->splitVector.spl_right, sizeof(OffsetNumber) * v->splitVector.spl_nright);
- gistSplitByKey(r, page, newitup, newlen, giststate, v, entryvec, attno + 1);
+ /* Recursively decide how to split the don't-care tuples */
+ gistSplitByKey(r, page, newitup, newlen, giststate, v, attno + 1);
- /* merge result of subsplit */
+ /* Merge result of subsplit with non-don't-care tuples */
for (i = 0; i < v->splitVector.spl_nleft; i++)
backupSplit.spl_left[backupSplit.spl_nleft++] = map[v->splitVector.spl_left[i] - 1];
for (i = 0; i < v->splitVector.spl_nright; i++)
backupSplit.spl_right[backupSplit.spl_nright++] = map[v->splitVector.spl_right[i] - 1];
v->splitVector = backupSplit;
- /* reunion left and right datums */
- gistunionsubkey(giststate, itup, v, attno);
}
}
}
+
+ /*
+ * If we're handling a multicolumn index, at the end of the recursion
+ * recompute the left and right union datums for all index columns. This
+ * makes sure we hand back correct union datums in all corner cases,
+ * including when we haven't processed all columns to start with, or when
+ * a secondary split moved "don't care" tuples from one side to the other
+ * (we really shouldn't assume that that didn't change the union datums).
+ *
+ * Note: when we're in an internal recursion (attno > 0), we do not worry
+ * about whether the union datums we return with are sensible, since
+ * calling levels won't care. Also, in a single-column index, we expect
+ * that PickSplit (or the special cases above) produced correct union
+ * datums.
+ */
+ if (attno == 0 && giststate->tupdesc->natts > 1)
+ {
+ v->spl_dontcare = NULL;
+ gistunionsubkey(giststate, itup, v);
+ }
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/access/gist/gistutil.c
^
|
@@ -23,12 +23,6 @@
#include "storage/bufmgr.h"
#include "utils/rel.h"
-/*
- * static *S used for temrorary storage (saves stack and palloc() call)
- */
-
-static Datum attrS[INDEX_MAX_KEYS];
-static bool isnullS[INDEX_MAX_KEYS];
/*
* Write itup vector to page, has no control of free space.
@@ -150,12 +144,13 @@
}
/*
- * Make unions of keys in IndexTuple vector, return FALSE if itvec contains
- * invalid tuple. Resulting Datums aren't compressed.
+ * Make unions of keys in IndexTuple vector (one union datum per index column).
+ * Union Datums are returned into the attr/isnull arrays.
+ * Resulting Datums aren't compressed.
+ * Fails and returns FALSE if itvec contains any invalid tuples.
*/
-
bool
-gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, int startkey,
+gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len,
Datum *attr, bool *isnull)
{
int i;
@@ -164,19 +159,12 @@
evec = (GistEntryVector *) palloc((len + 2) * sizeof(GISTENTRY) + GEVHDRSZ);
- for (i = startkey; i < giststate->tupdesc->natts; i++)
+ for (i = 0; i < giststate->tupdesc->natts; i++)
{
int j;
+ /* Collect non-null datums for this column */
evec->n = 0;
- if (!isnull[i])
- {
- gistentryinit(evec->vector[evec->n], attr[i],
- NULL, NULL, (OffsetNumber) 0,
- FALSE);
- evec->n++;
- }
-
for (j = 0; j < len; j++)
{
Datum datum;
@@ -198,7 +186,7 @@
evec->n++;
}
- /* If this tuple vector was all NULLs, the union is NULL */
+ /* If this column was all NULLs, the union is NULL */
if (evec->n == 0)
{
attr[i] = (Datum) 0;
@@ -208,6 +196,7 @@
{
if (evec->n == 1)
{
+ /* unionFn may expect at least two inputs */
evec->n = 2;
evec->vector[1] = evec->vector[0];
}
@@ -231,12 +220,13 @@
IndexTuple
gistunion(Relation r, IndexTuple *itvec, int len, GISTSTATE *giststate)
{
- memset(isnullS, TRUE, sizeof(bool) * giststate->tupdesc->natts);
+ Datum attr[INDEX_MAX_KEYS];
+ bool isnull[INDEX_MAX_KEYS];
- if (!gistMakeUnionItVec(giststate, itvec, len, 0, attrS, isnullS))
+ if (!gistMakeUnionItVec(giststate, itvec, len, attr, isnull))
return gist_form_invalid_tuple(InvalidBlockNumber);
- return gistFormTuple(giststate, r, attrS, isnullS, false);
+ return gistFormTuple(giststate, r, attr, isnull, false);
}
/*
@@ -248,12 +238,15 @@
GISTENTRY *entry2, bool isnull2,
Datum *dst, bool *dstisnull)
{
-
+ /* we need a GistEntryVector with room for exactly 2 elements */
+ union
+ {
+ GistEntryVector gev;
+ char padding[2 * sizeof(GISTENTRY) + GEVHDRSZ];
+ } storage;
+ GistEntryVector *evec = &storage.gev;
int dstsize;
- static char storage[2 * sizeof(GISTENTRY) + GEVHDRSZ];
- GistEntryVector *evec = (GistEntryVector *) storage;
-
evec->n = 2;
if (isnull1 && isnull2)
@@ -327,6 +320,8 @@
addentries[INDEX_MAX_KEYS];
bool oldisnull[INDEX_MAX_KEYS],
addisnull[INDEX_MAX_KEYS];
+ Datum attr[INDEX_MAX_KEYS];
+ bool isnull[INDEX_MAX_KEYS];
IndexTuple newtup = NULL;
int i;
@@ -344,19 +339,20 @@
gistMakeUnionKey(giststate, i,
oldentries + i, oldisnull[i],
addentries + i, addisnull[i],
- attrS + i, isnullS + i);
+ attr + i, isnull + i);
if (neednew)
/* we already need new key, so we can skip check */
continue;
- if (isnullS[i])
+ if (isnull[i])
/* union of key may be NULL if and only if both keys are NULL */
continue;
if (!addisnull[i])
{
- if (oldisnull[i] || gistKeyIsEQ(giststate, i, oldentries[i].key, attrS[i]) == false)
+ if (oldisnull[i] ||
+ !gistKeyIsEQ(giststate, i, oldentries[i].key, attr[i]))
neednew = true;
}
}
@@ -364,7 +360,7 @@
if (neednew)
{
/* need to update key */
- newtup = gistFormTuple(giststate, r, attrS, isnullS, false);
+ newtup = gistFormTuple(giststate, r, attr, isnull, false);
newtup->t_tid = oldtup->t_tid;
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/po/it.po
^
|
@@ -16,7 +16,7 @@
msgstr ""
"Project-Id-Version: postgres (PostgreSQL) 8.4\n"
"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
-"POT-Creation-Date: 2013-01-29 13:20+0000\n"
+"POT-Creation-Date: 2013-03-13 11:10+0000\n"
"PO-Revision-Date: 2013-01-23 11:20+0100\n"
"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
"Language-Team: Gruppo traduzioni ITPUG <traduzioni@itpug.org>\n"
@@ -3028,22 +3028,22 @@
#: utils/adt/xml.c:1743 utils/adt/xml.c:1750 utils/adt/xml.c:1770
#: utils/adt/xml.c:1777 utils/adt/timestamp.c:226 utils/adt/timestamp.c:264
#: utils/adt/timestamp.c:486 utils/adt/timestamp.c:526
-#: utils/adt/timestamp.c:2525 utils/adt/timestamp.c:2546
-#: utils/adt/timestamp.c:2559 utils/adt/timestamp.c:2568
-#: utils/adt/timestamp.c:2626 utils/adt/timestamp.c:2649
-#: utils/adt/timestamp.c:2662 utils/adt/timestamp.c:2673
-#: utils/adt/timestamp.c:3103 utils/adt/timestamp.c:3233
-#: utils/adt/timestamp.c:3274 utils/adt/timestamp.c:3362
-#: utils/adt/timestamp.c:3409 utils/adt/timestamp.c:3520
-#: utils/adt/timestamp.c:3833 utils/adt/timestamp.c:3970
-#: utils/adt/timestamp.c:3977 utils/adt/timestamp.c:3991
-#: utils/adt/timestamp.c:4001 utils/adt/timestamp.c:4064
-#: utils/adt/timestamp.c:4204 utils/adt/timestamp.c:4214
-#: utils/adt/timestamp.c:4429 utils/adt/timestamp.c:4508
-#: utils/adt/timestamp.c:4515 utils/adt/timestamp.c:4542
-#: utils/adt/timestamp.c:4546 utils/adt/timestamp.c:4603
-#: utils/adt/formatting.c:2961 utils/adt/formatting.c:2993
-#: utils/adt/formatting.c:3061 utils/adt/date.c:901 utils/adt/date.c:948
+#: utils/adt/timestamp.c:2526 utils/adt/timestamp.c:2547
+#: utils/adt/timestamp.c:2560 utils/adt/timestamp.c:2569
+#: utils/adt/timestamp.c:2627 utils/adt/timestamp.c:2650
+#: utils/adt/timestamp.c:2663 utils/adt/timestamp.c:2674
+#: utils/adt/timestamp.c:3104 utils/adt/timestamp.c:3234
+#: utils/adt/timestamp.c:3275 utils/adt/timestamp.c:3363
+#: utils/adt/timestamp.c:3410 utils/adt/timestamp.c:3521
+#: utils/adt/timestamp.c:3834 utils/adt/timestamp.c:3971
+#: utils/adt/timestamp.c:3978 utils/adt/timestamp.c:3992
+#: utils/adt/timestamp.c:4002 utils/adt/timestamp.c:4065
+#: utils/adt/timestamp.c:4205 utils/adt/timestamp.c:4215
+#: utils/adt/timestamp.c:4430 utils/adt/timestamp.c:4509
+#: utils/adt/timestamp.c:4516 utils/adt/timestamp.c:4543
+#: utils/adt/timestamp.c:4547 utils/adt/timestamp.c:4604
+#: utils/adt/formatting.c:3049 utils/adt/formatting.c:3081
+#: utils/adt/formatting.c:3149 utils/adt/date.c:901 utils/adt/date.c:948
#: utils/adt/date.c:1504 utils/adt/date.c:1541 utils/adt/date.c:2414
#: utils/adt/nabstime.c:480 utils/adt/nabstime.c:523 utils/adt/nabstime.c:553
#: utils/adt/nabstime.c:596
@@ -3199,7 +3199,7 @@
#: utils/adt/int.c:709 utils/adt/int.c:851 utils/adt/int.c:959
#: utils/adt/int.c:1048 utils/adt/int.c:1087 utils/adt/int.c:1115
-#: utils/adt/timestamp.c:2865 utils/adt/geo_ops.c:3967 utils/adt/int8.c:606
+#: utils/adt/timestamp.c:2866 utils/adt/geo_ops.c:3967 utils/adt/int8.c:606
#: utils/adt/int8.c:666 utils/adt/int8.c:857 utils/adt/int8.c:965
#: utils/adt/int8.c:1054 utils/adt/int8.c:1162 utils/adt/float.c:763
#: utils/adt/float.c:827 utils/adt/float.c:2475 utils/adt/float.c:2538
@@ -3209,7 +3209,7 @@
msgid "division by zero"
msgstr "divisione per zero"
-#: utils/adt/int.c:1352 utils/adt/timestamp.c:4701 utils/adt/timestamp.c:4782
+#: utils/adt/int.c:1352 utils/adt/timestamp.c:4702 utils/adt/timestamp.c:4783
#: utils/adt/int8.c:1420
msgid "step size cannot equal zero"
msgstr "il valore del passo non può essere uguale a zero"
@@ -3290,8 +3290,8 @@
msgid "timestamp(%d) precision must be between %d and %d"
msgstr "la precisione di timestamp(%d) deve essere compresa fra %d e %d"
-#: utils/adt/timestamp.c:653 utils/adt/timestamp.c:3098
-#: utils/adt/timestamp.c:3228 utils/adt/timestamp.c:3613
+#: utils/adt/timestamp.c:653 utils/adt/timestamp.c:3099
+#: utils/adt/timestamp.c:3229 utils/adt/timestamp.c:3614
msgid "interval out of range"
msgstr "il valore di interval è fuori dall'intervallo consentito"
@@ -3314,54 +3314,54 @@
msgid "interval(%d) precision must be between %d and %d"
msgstr "la precisione di INTERVAL(%d) deve essere compresa fra %d e %d"
-#: utils/adt/timestamp.c:2301
+#: utils/adt/timestamp.c:2302
msgid "cannot subtract infinite timestamps"
msgstr "non è possibile sottrarre valori infiniti di TIMESTAMP"
-#: utils/adt/timestamp.c:3354 utils/adt/timestamp.c:3950
-#: utils/adt/timestamp.c:4009
+#: utils/adt/timestamp.c:3355 utils/adt/timestamp.c:3951
+#: utils/adt/timestamp.c:4010
#, c-format
msgid "timestamp units \"%s\" not supported"
msgstr "unità \"%s\" di timestamp non supportata"
-#: utils/adt/timestamp.c:3368 utils/adt/timestamp.c:4019
+#: utils/adt/timestamp.c:3369 utils/adt/timestamp.c:4020
#, c-format
msgid "timestamp units \"%s\" not recognized"
msgstr "unità \"%s\" di timestamp non riconosciuta"
-#: utils/adt/timestamp.c:3509 utils/adt/timestamp.c:4181
-#: utils/adt/timestamp.c:4222
+#: utils/adt/timestamp.c:3510 utils/adt/timestamp.c:4182
+#: utils/adt/timestamp.c:4223
#, c-format
msgid "timestamp with time zone units \"%s\" not supported"
msgstr "unità \"%s\" di timestamp with time zone non supportata"
-#: utils/adt/timestamp.c:3526 utils/adt/timestamp.c:4231
+#: utils/adt/timestamp.c:3527 utils/adt/timestamp.c:4232
#, c-format
msgid "timestamp with time zone units \"%s\" not recognized"
msgstr "unità \"%s\" di timestamp with time zone non riconosciuta"
-#: utils/adt/timestamp.c:3606 utils/adt/timestamp.c:4337
+#: utils/adt/timestamp.c:3607 utils/adt/timestamp.c:4338
#, c-format
msgid "interval units \"%s\" not supported"
msgstr "unità \"%s\" di interval non supportata"
-#: utils/adt/timestamp.c:3622 utils/adt/timestamp.c:4364
+#: utils/adt/timestamp.c:3623 utils/adt/timestamp.c:4365
#, c-format
msgid "interval units \"%s\" not recognized"
msgstr "unità \"%s\" di interval non riconosciuta"
-#: utils/adt/timestamp.c:4434 utils/adt/timestamp.c:4607
+#: utils/adt/timestamp.c:4435 utils/adt/timestamp.c:4608
#, c-format
msgid "could not convert to time zone \"%s\""
msgstr "conversione al fuso orario \"%s\" fallita"
-#: utils/adt/timestamp.c:4441 utils/adt/timestamp.c:4614 utils/adt/date.c:2619
+#: utils/adt/timestamp.c:4442 utils/adt/timestamp.c:4615 utils/adt/date.c:2619
#: utils/adt/datetime.c:928 utils/adt/datetime.c:1663
#, c-format
msgid "time zone \"%s\" not recognized"
msgstr "fuso orario \"%s\" non riconosciuto"
-#: utils/adt/timestamp.c:4466 utils/adt/timestamp.c:4640
+#: utils/adt/timestamp.c:4467 utils/adt/timestamp.c:4641
#, c-format
msgid "interval time zone \"%s\" must not specify month"
msgstr "il fuso orario dell'intervallo \"%s\" non può specificare i mesi"
@@ -3698,98 +3698,98 @@
msgid "\"%s\" is not a number"
msgstr "\"%s\" non è un numero"
-#: utils/adt/formatting.c:1790
+#: utils/adt/formatting.c:1885
msgid "invalid combination of date conventions"
msgstr "la combinazione di convenzioni di date non è valida"
-#: utils/adt/formatting.c:1791
+#: utils/adt/formatting.c:1886
msgid "Do not mix Gregorian and ISO week date conventions in a formatting template."
msgstr "Non è possibile usare la convenzione gregoriana e ISO per settimane in un modello di formattazione."
-#: utils/adt/formatting.c:1808
+#: utils/adt/formatting.c:1903
#, c-format
msgid "conflicting values for \"%s\" field in formatting string"
msgstr "sono presenti valori contraddittori per il campo \"%s\" nella stringa di formattazione"
-#: utils/adt/formatting.c:1810
+#: utils/adt/formatting.c:1905
msgid "This value contradicts a previous setting for the same field type."
msgstr "Questo valore contraddice una impostazione precedente per lo stesso tipo di campo"
-#: utils/adt/formatting.c:1871
+#: utils/adt/formatting.c:1966
#, c-format
msgid "source string too short for \"%s\" formatting field"
msgstr "la stringa di origine è troppo corta per il campo di formattazione \"%s\""
-#: utils/adt/formatting.c:1873
+#: utils/adt/formatting.c:1968
#, c-format
msgid "Field requires %d characters, but only %d remain."
msgstr "Il campo necessita di %d caratteri ma ne restano solo %d."
-#: utils/adt/formatting.c:1876 utils/adt/formatting.c:1890
+#: utils/adt/formatting.c:1971 utils/adt/formatting.c:1985
msgid "If your source string is not fixed-width, try using the \"FM\" modifier."
msgstr "Se la stringa di partenza non ha lunghezza fissa, prova ad usare il modificatore \"FM\"."
-#: utils/adt/formatting.c:1886 utils/adt/formatting.c:1899
-#: utils/adt/formatting.c:2029
+#: utils/adt/formatting.c:1981 utils/adt/formatting.c:1994
+#: utils/adt/formatting.c:2124
#, c-format
msgid "invalid value \"%s\" for \"%s\""
msgstr "valore \"%s\" per \"%s\" non valido"
-#: utils/adt/formatting.c:1888
+#: utils/adt/formatting.c:1983
#, c-format
msgid "Field requires %d characters, but only %d could be parsed."
msgstr "Il campo necessita di %d caratteri, ma è stato possibile analizzarne solo %d."
-#: utils/adt/formatting.c:1901
+#: utils/adt/formatting.c:1996
msgid "Value must be an integer."
msgstr "Il valore deve essere un integer."
-#: utils/adt/formatting.c:1906
+#: utils/adt/formatting.c:2001
#, c-format
msgid "value for \"%s\" in source string is out of range"
msgstr "il valore \"%s\" nella stringa di origine è fuori dall'intervallo consentito"
-#: utils/adt/formatting.c:1908
+#: utils/adt/formatting.c:2003
#, c-format
msgid "Value must be in the range %d to %d."
msgstr "Il valore deve essere compreso fra %d e %d."
-#: utils/adt/formatting.c:2031
+#: utils/adt/formatting.c:2126
msgid "The given value did not match any of the allowed values for this field."
msgstr "Il valore fornito non corrisponde a nessuno di quelli consentiti per questo campo."
-#: utils/adt/formatting.c:2593
+#: utils/adt/formatting.c:2681
msgid "\"TZ\"/\"tz\" format patterns are not supported in to_date"
msgstr "I pattern di formato \"TZ\"/\"tz\" non sono supportati nella funzione to_date"
-#: utils/adt/formatting.c:2694
+#: utils/adt/formatting.c:2782
msgid "invalid input string for \"Y,YYY\""
msgstr "stringa di input non valida per \"Y,YYY\""
-#: utils/adt/formatting.c:3085 utils/adt/date.c:167
+#: utils/adt/formatting.c:3173 utils/adt/date.c:167
#, c-format
msgid "date out of range: \"%s\""
msgstr "data fuori dall'intervallo consentito: \"%s\""
-#: utils/adt/formatting.c:3214
+#: utils/adt/formatting.c:3302
#, c-format
msgid "hour \"%d\" is invalid for the 12-hour clock"
msgstr "l'ora \"%d\" non è valida su un orologio a 12 ore"
-#: utils/adt/formatting.c:3216
+#: utils/adt/formatting.c:3304
msgid "Use the 24-hour clock, or give an hour between 1 and 12."
msgstr "Usa l'orologio a 24 ore o fornisci un'ora compresa fra 1 e 12."
-#: utils/adt/formatting.c:3254
+#: utils/adt/formatting.c:3342
#, c-format
msgid "inconsistent use of year %04d and \"BC\""
msgstr "l'uso dell'anno %04d e di \"BC\" non è consistente"
-#: utils/adt/formatting.c:3301
+#: utils/adt/formatting.c:3389
msgid "cannot calculate day of year without year information"
msgstr "non è possibile calcolare il giorno dell'anno senza informazioni sull'anno"
-#: utils/adt/formatting.c:4166
+#: utils/adt/formatting.c:4254
msgid "\"RN\" not supported"
msgstr "\"RN\" non è supportato"
@@ -4763,19 +4763,19 @@
msgid "must be member of role \"%s\""
msgstr "occorre far parte del ruolo \"%s\""
-#: utils/adt/enum.c:44 utils/adt/enum.c:55 utils/adt/enum.c:108
-#: utils/adt/enum.c:119
+#: utils/adt/enum.c:45 utils/adt/enum.c:56 utils/adt/enum.c:113
+#: utils/adt/enum.c:124
#, c-format
msgid "invalid input value for enum %s: \"%s\""
msgstr "la sintassi per l'enumerazione %s non è valida: \"%s\""
-#: utils/adt/enum.c:80 utils/adt/enum.c:146
+#: utils/adt/enum.c:81 utils/adt/enum.c:151
#, c-format
msgid "invalid internal value for enum: %u"
msgstr "il valore interno per l'enumerazione non è valido: %u"
-#: utils/adt/enum.c:266 utils/adt/enum.c:307 utils/adt/enum.c:356
-#: utils/adt/enum.c:376
+#: utils/adt/enum.c:271 utils/adt/enum.c:312 utils/adt/enum.c:361
+#: utils/adt/enum.c:381
msgid "could not determine actual enum type"
msgstr "determinazione del tipo reale di enumerazione fallita"
@@ -5164,7 +5164,7 @@
msgstr "apertura del file dictionary \"%s\" fallita: %m"
#: tsearch/spell.c:444 tsearch/spell.c:461 tsearch/spell.c:478
-#: tsearch/spell.c:495 tsearch/spell.c:517 gram.y:10787 gram.y:10804
+#: tsearch/spell.c:495 tsearch/spell.c:517 gram.y:10810 gram.y:10827
msgid "syntax error"
msgstr "errore di sintassi"
@@ -5633,7 +5633,7 @@
msgstr "Non si possono indicizzare valori più grandi di una pagina di buffer."
#: access/hash/hashutil.c:169 access/nbtree/nbtpage.c:432
-#: access/gist/gistutil.c:644
+#: access/gist/gistutil.c:640
#, c-format
msgid "index \"%s\" contains unexpected zero page at block %u"
msgstr "l'indice \"%s\" contiene una pagina inaspettata completamente a zero al blocco %u"
@@ -5641,12 +5641,12 @@
#: access/hash/hashutil.c:172 access/hash/hashutil.c:183
#: access/hash/hashutil.c:195 access/hash/hashutil.c:216
#: access/nbtree/nbtpage.c:435 access/nbtree/nbtpage.c:446
-#: access/gist/gistutil.c:647 access/gist/gistutil.c:658
+#: access/gist/gistutil.c:643 access/gist/gistutil.c:654
msgid "Please REINDEX it."
msgstr "Si richiede l'esecuzione di REINDEX."
#: access/hash/hashutil.c:180 access/hash/hashutil.c:192
-#: access/nbtree/nbtpage.c:443 access/gist/gistutil.c:655
+#: access/nbtree/nbtpage.c:443 access/gist/gistutil.c:651
#, c-format
msgid "index \"%s\" contains corrupted page at block %u"
msgstr "l'indice \"%s\" contiene una pagina corrotta al blocco %u"
@@ -6747,7 +6747,7 @@
#: access/transam/xlog.c:7055
#, c-format
msgid "unexpected timeline ID %u (after %u) in checkpoint record"
-msgstr "l'ID della timeline %u (dopo %u) non era prevista nel record di checkpoint"
+msgstr "timeline ID %u imprevista (dopo %u) nel record di checkpoint"
#: access/transam/xlog.c:7085
#, c-format
@@ -6895,12 +6895,12 @@
msgid "\"%s\" is not an index"
msgstr "\"%s\" non è un indice"
-#: access/gist/gistsplit.c:372
+#: access/gist/gistsplit.c:444
#, c-format
msgid "picksplit method for column %d of index \"%s\" failed"
msgstr "il metodo picksplit per la colonna %d dell'indice \"%s\" è fallito"
-#: access/gist/gistsplit.c:374
+#: access/gist/gistsplit.c:446
msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command."
msgstr "L'indice non è ottimale. Per ottimizzarlo si contatti uno sviluppatore o si usi la colonna ponendola in seconda posizione nel comando CREATE INDEX."
@@ -6913,7 +6913,7 @@
msgid "Incomplete insertion detected during crash replay."
msgstr "Inserimento non completo rilevato durante la ripetizione del crash"
-#: access/gist/gistutil.c:428
+#: access/gist/gistutil.c:424
#, c-format
msgid "index \"%s\" needs VACUUM or REINDEX to finish crash recovery"
msgstr "l'indice \"%s\" richiede VACUUM o REINDEX per completare il recupero dal crash"
@@ -12514,7 +12514,7 @@
msgid "cross-database references are not implemented: %s"
msgstr "i riferimenti tra database diversi non sono implementati: %s"
-#: catalog/namespace.c:2082 gram.y:3434 gram.y:9931 parser/parse_expr.c:620
+#: catalog/namespace.c:2082 gram.y:3434 gram.y:9954 parser/parse_expr.c:620
#: parser/parse_target.c:919
#, c-format
msgid "improper qualified name (too many dotted names): %s"
@@ -13334,7 +13334,7 @@
msgid "time zone interval must be HOUR or HOUR TO MINUTE"
msgstr "l'intervallo della time zone deve essere HOUR o HOUR TO MINUTE"
-#: gram.y:1326 gram.y:7744 gram.y:10037
+#: gram.y:1326 gram.y:7744 gram.y:10060
msgid "interval precision specified twice"
msgstr "intervallo di precisione specificato due volte"
@@ -13415,55 +13415,55 @@
msgid "UNIQUE predicate is not yet implemented"
msgstr "il predicato UNIQUE non è stato ancora implementato"
-#: gram.y:9414 gram.y:9429
+#: gram.y:9437 gram.y:9452
msgid "frame start cannot be UNBOUNDED FOLLOWING"
msgstr "l'inizio della finestra non può essere UNBOUNDED FOLLOWING"
-#: gram.y:9419 gram.y:9434
+#: gram.y:9442 gram.y:9457
msgid "frame start at CURRENT ROW is not implemented"
msgstr "l'inizio della finestra alla CURRENT ROW non è implementato"
-#: gram.y:9439
+#: gram.y:9462
msgid "frame end cannot be UNBOUNDED PRECEDING"
msgstr "la fine della finestra non può essere UNBOUNDED PRECEDING"
-#: gram.y:10559
+#: gram.y:10582
msgid "OLD used in query that is not in a rule"
msgstr "OLD usato in una query che non è in una regola"
-#: gram.y:10569
+#: gram.y:10592
msgid "NEW used in query that is not in a rule"
msgstr "NEW usato in una query che non è in una regola"
-#: gram.y:10617 gram.y:10824
+#: gram.y:10640 gram.y:10847
msgid "improper use of \"*\""
msgstr "uso improprio di \"*\""
-#: gram.y:10756
+#: gram.y:10779
msgid "wrong number of parameters on left side of OVERLAPS expression"
msgstr "numero errato di parametri a sinistra dell'espressione OVERLAPS"
-#: gram.y:10763
+#: gram.y:10786
msgid "wrong number of parameters on right side of OVERLAPS expression"
msgstr "numero errato di parametri a destra dell'espressione OVERLAPS"
-#: gram.y:10886
+#: gram.y:10909
msgid "multiple ORDER BY clauses not allowed"
msgstr "non è possibile avere più di una clausola ORDER BY"
-#: gram.y:10897
+#: gram.y:10920
msgid "multiple OFFSET clauses not allowed"
msgstr "non è possibile avere più di una clausola OFFSET"
-#: gram.y:10906
+#: gram.y:10929
msgid "multiple LIMIT clauses not allowed"
msgstr "non è possibile avere più di una clausola LIMIT"
-#: gram.y:10915
+#: gram.y:10938
msgid "multiple WITH clauses not allowed"
msgstr "non è possibile avere più di una clausola WITH"
-#: gram.y:11070
+#: gram.y:11093
msgid "OUT and INOUT arguments aren't allowed in TABLE functions"
msgstr "gli argomenti OUT e INOUT non sono permessi nelle funzioni TABLE"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/po/ru.po
^
|
@@ -233,7 +233,7 @@
#, c-format
msgid "autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\""
msgstr ""
-" автоочистка: найдена устаревшая врем. таблица \"%s\".\"%s\" в базе \"%s\""
+"автоочистка: найдена устаревшая врем. таблица \"%s\".\"%s\" в базе \"%s\""
#: postmaster/autovacuum.c:2290
#, c-format
@@ -2432,7 +2432,9 @@
#: utils/misc/guc.c:4684
#, c-format
msgid "cannot set parameter \"%s\" within security-definer function"
-msgstr "параметр \"%s\" нельзя задать в функции, настраивающей безопасность."
+msgstr ""
+"параметр \"%s\" нельзя задать в функции с контекстом безопасности "
+"определившего"
#: utils/misc/guc.c:4692 utils/init/miscinit.c:443
#, c-format
@@ -3773,7 +3775,7 @@
#: utils/adt/timestamp.c:4466 utils/adt/timestamp.c:4640
#, c-format
msgid "interval time zone \"%s\" must not specify month"
-msgstr "в значении interval с часовым поясом \"%s\" не должно быть месяца"
+msgstr "интервал \"%s\", задающий часовой пояс, не должен содержать месяцев"
#: utils/adt/selfuncs.c:4566
msgid "case insensitive matching not supported on type bytea"
@@ -5651,7 +5653,7 @@
#: tsearch/ts_utils.c:53
#, c-format
msgid "invalid text search configuration file name \"%s\""
-msgstr "неверное имя файла конфигурации текстового поиска \"%s\": %m"
+msgstr "неверное имя файла конфигурации текстового поиска \"%s\""
#: tsearch/ts_utils.c:91
#, c-format
@@ -6495,7 +6497,7 @@
#: access/transam/xlog.c:1183
#, c-format
msgid "could not write archive status file \"%s\": %m"
-msgstr "не удалось записать в файл состояния архива \"%s\": %m"
+msgstr "не удалось записать файл состояния архива \"%s\": %m"
#: access/transam/xlog.c:1638 access/transam/xlog.c:3508
#, c-format
@@ -7392,8 +7394,7 @@
#: access/transam/xlog.c:7055
#, c-format
msgid "unexpected timeline ID %u (after %u) in checkpoint record"
-msgstr ""
-"неожиданный ID линии времени %u (после %u) в записи точки восстановления"
+msgstr "неожиданный ID линии времени %u (после %u) в записи контрольной точки"
#: access/transam/xlog.c:7085
#, c-format
@@ -9272,7 +9273,7 @@
#: commands/vacuumlazy.c:833
#, c-format
msgid "\"%s\": removed %.0f row versions in %u pages"
-msgstr "\"%s\": удалено версий строк: %0.f, обработано страниц: %u"
+msgstr "\"%s\": удалено версий строк: %.0f, обработано страниц: %u"
#: commands/vacuumlazy.c:838
#, c-format
@@ -11093,17 +11094,17 @@
#: executor/execMain.c:761
#, c-format
msgid "cannot lock rows in sequence \"%s\""
-msgstr "заблокировать строки в последовательности \"%s\" нельзя"
+msgstr "блокировать строки в последовательности \"%s\" нельзя"
#: executor/execMain.c:771
#, c-format
msgid "cannot lock rows in view \"%s\""
-msgstr "заблокировать строки в представлении \"%s\" нельзя"
+msgstr "блокировать строки в представлении \"%s\" нельзя"
#: executor/execMain.c:777
#, c-format
msgid "cannot lock rows in relation \"%s\""
-msgstr "заблокировать строки в отношении \"%s\" нельзя"
+msgstr "блокировать строки в отношении \"%s\" нельзя"
#: executor/execMain.c:981
msgid ""
@@ -12951,7 +12952,7 @@
"A function returning \"internal\" must have at least one \"internal\" "
"argument."
msgstr ""
-"Функция, возвращающая \"internal\" должна иметь минимум один аргумент "
+"Функция, возвращающая \"internal\", должна иметь минимум один аргумент "
"\"internal\"."
#: catalog/pg_aggregate.c:199
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/postmaster/fork_process.c
^
|
@@ -15,6 +15,9 @@
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
+#ifdef USE_SSL
+#include <openssl/rand.h>
+#endif
#ifndef WIN32
/*
@@ -60,6 +63,12 @@
setitimer(ITIMER_PROF, &prof_itimer, NULL);
#endif
+ /*
+ * Make sure processes do not share OpenSSL randomness state.
+ */
+#ifdef USE_SSL
+ RAND_cleanup();
+#endif
}
return result;
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/postmaster/pgstat.c
^
|
@@ -675,8 +675,8 @@
int i;
/* Don't expend a clock check if nothing to do */
- if ((pgStatTabList == NULL || pgStatTabList->tsa_used == 0)
- && !have_function_stats)
+ if ((pgStatTabList == NULL || pgStatTabList->tsa_used == 0) &&
+ !have_function_stats && !force)
return;
/*
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/regex/regc_nfa.c
^
|
@@ -456,6 +456,56 @@
}
/*
+ * hasnonemptyout - Does state have a non-EMPTY out arc?
+ */
+static int
+hasnonemptyout(struct state * s)
+{
+ struct arc *a;
+
+ for (a = s->outs; a != NULL; a = a->outchain)
+ {
+ if (a->type != EMPTY)
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * nonemptyouts - count non-EMPTY out arcs of a state
+ */
+static int
+nonemptyouts(struct state * s)
+{
+ int n = 0;
+ struct arc *a;
+
+ for (a = s->outs; a != NULL; a = a->outchain)
+ {
+ if (a->type != EMPTY)
+ n++;
+ }
+ return n;
+}
+
+/*
+ * nonemptyins - count non-EMPTY in arcs of a state
+ */
+static int
+nonemptyins(struct state * s)
+{
+ int n = 0;
+ struct arc *a;
+
+ for (a = s->ins; a != NULL; a = a->inchain)
+ {
+ if (a->type != EMPTY)
+ n++;
+ }
+ return n;
+}
+
+/*
* findarc - find arc, if any, from given source with given type and color
* If there is more than one such arc, the result is random.
*/
@@ -511,19 +561,25 @@
}
/*
- * copyins - copy all in arcs of a state to another state
+ * copyins - copy in arcs of a state to another state
+ *
+ * Either all arcs, or only non-empty ones as determined by all value.
*/
static void
copyins(struct nfa * nfa,
struct state * oldState,
- struct state * newState)
+ struct state * newState,
+ int all)
{
struct arc *a;
assert(oldState != newState);
for (a = oldState->ins; a != NULL; a = a->inchain)
- cparc(nfa, a, a->from, newState);
+ {
+ if (all || a->type != EMPTY)
+ cparc(nfa, a, a->from, newState);
+ }
}
/*
@@ -546,19 +602,25 @@
}
/*
- * copyouts - copy all out arcs of a state to another state
+ * copyouts - copy out arcs of a state to another state
+ *
+ * Either all arcs, or only non-empty ones as determined by all value.
*/
static void
copyouts(struct nfa * nfa,
struct state * oldState,
- struct state * newState)
+ struct state * newState,
+ int all)
{
struct arc *a;
assert(oldState != newState);
for (a = oldState->outs; a != NULL; a = a->outchain)
- cparc(nfa, a, newState, a->to);
+ {
+ if (all || a->type != EMPTY)
+ cparc(nfa, a, newState, a->to);
+ }
}
/*
@@ -881,7 +943,7 @@
if (NISERR())
return 0;
assert(to != from); /* con is not an inarc */
- copyins(nfa, from, s); /* duplicate inarcs */
+ copyins(nfa, from, s, 1); /* duplicate inarcs */
cparc(nfa, con, s, to); /* move constraint arc */
freearc(nfa, con);
from = s;
@@ -1027,7 +1089,7 @@
s = newstate(nfa);
if (NISERR())
return 0;
- copyouts(nfa, to, s); /* duplicate outarcs */
+ copyouts(nfa, to, s, 1); /* duplicate outarcs */
cparc(nfa, con, from, s); /* move constraint */
freearc(nfa, con);
to = s;
@@ -1134,91 +1196,205 @@
FILE *f) /* for debug output; NULL none */
{
struct state *s;
+ struct state *s2;
struct state *nexts;
struct arc *a;
struct arc *nexta;
- int progress;
- /* find and eliminate empties until there are no more */
- do
+ /*
+ * First, get rid of any states whose sole out-arc is an EMPTY, since
+ * they're basically just aliases for their successor. The parsing
+ * algorithm creates enough of these that it's worth special-casing this.
+ */
+ for (s = nfa->states; s != NULL && !NISERR(); s = nexts)
{
- progress = 0;
- for (s = nfa->states; s != NULL && !NISERR() &&
- s->no != FREESTATE; s = nexts)
+ nexts = s->next;
+ if (s->flag || s->nouts != 1)
+ continue;
+ a = s->outs;
+ assert(a != NULL && a->outchain == NULL);
+ if (a->type != EMPTY)
+ continue;
+ if (s != a->to)
+ moveins(nfa, s, a->to);
+ dropstate(nfa, s);
+ }
+
+ /*
+ * Similarly, get rid of any state with a single EMPTY in-arc, by folding
+ * it into its predecessor.
+ */
+ for (s = nfa->states; s != NULL && !NISERR(); s = nexts)
+ {
+ nexts = s->next;
+ /* while we're at it, ensure tmp fields are clear for next step */
+ assert(s->tmp == NULL);
+ if (s->flag || s->nins != 1)
+ continue;
+ a = s->ins;
+ assert(a != NULL && a->inchain == NULL);
+ if (a->type != EMPTY)
+ continue;
+ if (s != a->from)
+ moveouts(nfa, s, a->from);
+ dropstate(nfa, s);
+ }
+
+ /*
+ * For each remaining NFA state, find all other states that are reachable
+ * from it by a chain of one or more EMPTY arcs. Then generate new arcs
+ * that eliminate the need for each such chain.
+ *
+ * If we just do this straightforwardly, the algorithm gets slow in
+ * complex graphs, because the same arcs get copied to all intermediate
+ * states of an EMPTY chain, and then uselessly pushed repeatedly to the
+ * chain's final state; we waste a lot of time in newarc's duplicate
+ * checking. To improve matters, we decree that any state with only EMPTY
+ * out-arcs is "doomed" and will not be part of the final NFA. That can be
+ * ensured by not adding any new out-arcs to such a state. Having ensured
+ * that, we need not update the state's in-arcs list either; all arcs that
+ * might have gotten pushed forward to it will just get pushed directly to
+ * successor states. This eliminates most of the useless duplicate arcs.
+ */
+ for (s = nfa->states; s != NULL && !NISERR(); s = s->next)
+ {
+ for (s2 = emptyreachable(s, s); s2 != s && !NISERR(); s2 = nexts)
{
- nexts = s->next;
- for (a = s->outs; a != NULL && !NISERR(); a = nexta)
- {
- nexta = a->outchain;
- if (a->type == EMPTY && unempty(nfa, a))
- progress = 1;
- assert(nexta == NULL || s->no != FREESTATE);
- }
+ /*
+ * If s2 is doomed, we decide that (1) we will always push arcs
+ * forward to it, not pull them back to s; and (2) we can optimize
+ * away the push-forward, per comment above. So do nothing.
+ */
+ if (s2->flag || hasnonemptyout(s2))
+ replaceempty(nfa, s, s2);
+
+ /* Reset the tmp fields as we walk back */
+ nexts = s2->tmp;
+ s2->tmp = NULL;
}
- if (progress && f != NULL)
- dumpnfa(nfa, f);
- } while (progress && !NISERR());
+ s->tmp = NULL;
+ }
+
+ if (NISERR())
+ return;
+
+ /*
+ * Now remove all the EMPTY arcs, since we don't need them anymore.
+ */
+ for (s = nfa->states; s != NULL; s = s->next)
+ {
+ for (a = s->outs; a != NULL; a = nexta)
+ {
+ nexta = a->outchain;
+ if (a->type == EMPTY)
+ freearc(nfa, a);
+ }
+ }
+
+ /*
+ * And remove any states that have become useless. (This cleanup is not
+ * very thorough, and would be even less so if we tried to combine it with
+ * the previous step; but cleanup() will take care of anything we miss.)
+ */
+ for (s = nfa->states; s != NULL; s = nexts)
+ {
+ nexts = s->next;
+ if ((s->nins == 0 || s->nouts == 0) && !s->flag)
+ dropstate(nfa, s);
+ }
+
+ if (f != NULL)
+ dumpnfa(nfa, f);
}
/*
- * unempty - optimize out an EMPTY arc, if possible
+ * emptyreachable - recursively find all states reachable from s by EMPTY arcs
+ *
+ * The return value is the last such state found. Its tmp field links back
+ * to the next-to-last such state, and so on back to s, so that all these
+ * states can be located without searching the whole NFA.
*
- * Actually, as it stands this function always succeeds, but the return
- * value is kept with an eye on possible future changes.
+ * The maximum recursion depth here is equal to the length of the longest
+ * loop-free chain of EMPTY arcs, which is surely no more than the size of
+ * the NFA, and in practice will be a lot less than that.
*/
-static int /* 0 couldn't, 1 could */
-unempty(struct nfa * nfa,
- struct arc * a)
+static struct state *
+emptyreachable(struct state * s, struct state * lastfound)
{
- struct state *from = a->from;
- struct state *to = a->to;
- int usefrom; /* work on from, as opposed to to? */
-
- assert(a->type == EMPTY);
- assert(from != nfa->pre && to != nfa->post);
+ struct arc *a;
- if (from == to)
- { /* vacuous loop */
- freearc(nfa, a);
- return 1;
+ s->tmp = lastfound;
+ lastfound = s;
+ for (a = s->outs; a != NULL; a = a->outchain)
+ {
+ if (a->type == EMPTY && a->to->tmp == NULL)
+ lastfound = emptyreachable(a->to, lastfound);
}
+ return lastfound;
+}
+
+/*
+ * replaceempty - replace an EMPTY arc chain with some non-empty arcs
+ *
+ * The EMPTY arc(s) should be deleted later, but we can't do it here because
+ * they may still be needed to identify other arc chains during fixempties().
+ */
+static void
+replaceempty(struct nfa * nfa,
+ struct state * from,
+ struct state * to)
+{
+ int fromouts;
+ int toins;
+
+ assert(from != to);
+
+ /*
+ * Create replacement arcs that bypass the need for the EMPTY chain. We
+ * can do this either by pushing arcs forward (linking directly from
+ * "from"'s predecessors to "to") or by pulling them back (linking
+ * directly from "from" to "to"'s successors). In general, we choose
+ * whichever way creates greater fan-out or fan-in, so as to improve the
+ * odds of reducing the other state to zero in-arcs or out-arcs and
+ * thereby being able to delete it. However, if "from" is doomed (has no
+ * non-EMPTY out-arcs), we must keep it so, so always push forward in that
+ * case.
+ *
+ * The fan-out/fan-in comparison should count only non-EMPTY arcs. If
+ * "from" is doomed, we can skip counting "to"'s arcs, since we want to
+ * force taking the copyins path in that case.
+ */
+ fromouts = nonemptyouts(from);
+ toins = (fromouts == 0) ? 1 : nonemptyins(to);
- /* decide which end to work on */
- usefrom = 1; /* default: attack from */
- if (from->nouts > to->nins)
- usefrom = 0;
- else if (from->nouts == to->nins)
+ if (fromouts > toins)
{
- /* decide on secondary issue: move/copy fewest arcs */
- if (from->nins > to->nouts)
- usefrom = 0;
+ copyouts(nfa, to, from, 0);
+ return;
+ }
+ if (fromouts < toins)
+ {
+ copyins(nfa, from, to, 0);
+ return;
}
- freearc(nfa, a);
- if (usefrom)
+ /*
+ * fromouts == toins. Decide on secondary issue: copy fewest arcs.
+ *
+ * Doesn't seem to be worth the trouble to exclude empties from these
+ * comparisons; that takes extra time and doesn't seem to improve the
+ * resulting graph much.
+ */
+ if (from->nins > to->nouts)
{
- if (from->nouts == 0)
- {
- /* was the state's only outarc */
- moveins(nfa, from, to);
- freestate(nfa, from);
- }
- else
- copyins(nfa, from, to);
+ copyouts(nfa, to, from, 0);
+ return;
}
else
{
- if (to->nins == 0)
- {
- /* was the state's only inarc */
- moveouts(nfa, to, from);
- freestate(nfa, to);
- }
- else
- copyouts(nfa, to, from);
+ copyins(nfa, from, to, 0);
+ return;
}
-
- return 1;
}
/*
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/regex/regcomp.c
^
|
@@ -122,12 +122,15 @@
static void newarc(struct nfa *, int, pcolor, struct state *, struct state *);
static struct arc *allocarc(struct nfa *, struct state *);
static void freearc(struct nfa *, struct arc *);
+static int hasnonemptyout(struct state *);
+static int nonemptyouts(struct state *);
+static int nonemptyins(struct state *);
static struct arc *findarc(struct state *, int, pcolor);
static void cparc(struct nfa *, struct arc *, struct state *, struct state *);
static void moveins(struct nfa *, struct state *, struct state *);
-static void copyins(struct nfa *, struct state *, struct state *);
+static void copyins(struct nfa *, struct state *, struct state *, int);
static void moveouts(struct nfa *, struct state *, struct state *);
-static void copyouts(struct nfa *, struct state *, struct state *);
+static void copyouts(struct nfa *, struct state *, struct state *, int);
static void cloneouts(struct nfa *, struct state *, struct state *, struct state *, int);
static void delsub(struct nfa *, struct state *, struct state *);
static void deltraverse(struct nfa *, struct state *, struct state *);
@@ -146,7 +149,8 @@
#define COMPATIBLE 3 /* compatible but not satisfied yet */
static int combine(struct arc *, struct arc *);
static void fixempties(struct nfa *, FILE *);
-static int unempty(struct nfa *, struct arc *);
+static struct state *emptyreachable(struct state *, struct state *);
+static void replaceempty(struct nfa *, struct state *, struct state *);
static void cleanup(struct nfa *);
static void markreachable(struct nfa *, struct state *, struct state *, struct state *);
static void markcanreach(struct nfa *, struct state *, struct state *, struct state *);
@@ -575,7 +579,7 @@
for (s = slist; s != NULL; s = s2)
{
s2 = newstate(nfa);
- copyouts(nfa, s, s2);
+ copyouts(nfa, s, s2, 1);
for (a = s->ins; a != NULL; a = b)
{
b = a->inchain;
@@ -704,6 +708,7 @@
/* NB, recursion in parseqatom() may swallow rest of branch */
parseqatom(v, stopper, type, lp, right, t);
+ NOERRN();
}
if (!seencontent)
@@ -1138,6 +1143,7 @@
EMPTYARC(atom->end, rp);
t->right = subre(v, '=', 0, atom->end, rp);
}
+ NOERR();
assert(SEE('|') || SEE(stopper) || SEE(EOS));
t->flags |= COMBINE(t->flags, t->right->flags);
top->flags |= COMBINE(top->flags, t->flags);
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/utils/adt/formatting.c
^
|
@@ -1646,6 +1646,87 @@
return result;
}
+/*
+ * ASCII-only lower function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+asc_tolower(const char *buff, size_t nbytes)
+{
+ char *result;
+ char *p;
+
+ if (!buff)
+ return NULL;
+
+ result = pnstrdup(buff, nbytes);
+
+ for (p = result; *p; p++)
+ *p = pg_tolower((unsigned char) *p);
+
+ return result;
+}
+
+/*
+ * ASCII-only upper function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+asc_toupper(const char *buff, size_t nbytes)
+{
+ char *result;
+ char *p;
+
+ if (!buff)
+ return NULL;
+
+ result = pnstrdup(buff, nbytes);
+
+ for (p = result; *p; p++)
+ *p = pg_toupper((unsigned char) *p);
+
+ return result;
+}
+
+/*
+ * ASCII-only initcap function
+ *
+ * We pass the number of bytes so we can pass varlena and char*
+ * to this function. The result is a palloc'd, null-terminated string.
+ */
+char *
+asc_initcap(const char *buff, size_t nbytes)
+{
+ char *result;
+ char *p;
+ int wasalnum = false;
+
+ if (!buff)
+ return NULL;
+
+ result = pnstrdup(buff, nbytes);
+
+ for (p = result; *p; p++)
+ {
+ char c;
+
+ if (wasalnum)
+ *p = c = pg_tolower((unsigned char) *p);
+ else
+ *p = c = pg_toupper((unsigned char) *p);
+ /* we don't trust isalnum() here */
+ wasalnum = ((c >= 'A' && c <= 'Z') ||
+ (c >= 'a' && c <= 'z') ||
+ (c >= '0' && c <= '9'));
+ }
+
+ return result;
+}
+
/* convenience routines for when the input is null-terminated */
static char *
@@ -1666,6 +1747,20 @@
return str_initcap(buff, strlen(buff));
}
+static char *
+asc_tolower_z(const char *buff)
+{
+ return asc_tolower(buff, strlen(buff));
+}
+
+static char *
+asc_toupper_z(const char *buff)
+{
+ return asc_toupper(buff, strlen(buff));
+}
+
+/* asc_initcap_z is not currently needed */
+
/* ----------
* Skip TM / th in FROM_CHAR
@@ -2149,7 +2244,8 @@
INVALID_FOR_INTERVAL;
if (tmtcTzn(in))
{
- char *p = str_tolower_z(tmtcTzn(in));
+ /* We assume here that timezone names aren't localized */
+ char *p = asc_tolower_z(tmtcTzn(in));
strcpy(s, p);
pfree(p);
@@ -2196,7 +2292,7 @@
strcpy(s, str_toupper_z(localized_full_months[tm->tm_mon - 1]));
else
sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
- str_toupper_z(months_full[tm->tm_mon - 1]));
+ asc_toupper_z(months_full[tm->tm_mon - 1]));
s += strlen(s);
break;
case DCH_Month:
@@ -2206,7 +2302,8 @@
if (S_TM(n->suffix))
strcpy(s, str_initcap_z(localized_full_months[tm->tm_mon - 1]));
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9, months_full[tm->tm_mon - 1]);
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ months_full[tm->tm_mon - 1]);
s += strlen(s);
break;
case DCH_month:
@@ -2216,10 +2313,8 @@
if (S_TM(n->suffix))
strcpy(s, str_tolower_z(localized_full_months[tm->tm_mon - 1]));
else
- {
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9, months_full[tm->tm_mon - 1]);
- *s = pg_tolower((unsigned char) *s);
- }
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ asc_tolower_z(months_full[tm->tm_mon - 1]));
s += strlen(s);
break;
case DCH_MON:
@@ -2229,7 +2324,7 @@
if (S_TM(n->suffix))
strcpy(s, str_toupper_z(localized_abbrev_months[tm->tm_mon - 1]));
else
- strcpy(s, str_toupper_z(months[tm->tm_mon - 1]));
+ strcpy(s, asc_toupper_z(months[tm->tm_mon - 1]));
s += strlen(s);
break;
case DCH_Mon:
@@ -2249,10 +2344,7 @@
if (S_TM(n->suffix))
strcpy(s, str_tolower_z(localized_abbrev_months[tm->tm_mon - 1]));
else
- {
- strcpy(s, months[tm->tm_mon - 1]);
- *s = pg_tolower((unsigned char) *s);
- }
+ strcpy(s, asc_tolower_z(months[tm->tm_mon - 1]));
s += strlen(s);
break;
case DCH_MM:
@@ -2267,7 +2359,7 @@
strcpy(s, str_toupper_z(localized_full_days[tm->tm_wday]));
else
sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
- str_toupper_z(days[tm->tm_wday]));
+ asc_toupper_z(days[tm->tm_wday]));
s += strlen(s);
break;
case DCH_Day:
@@ -2275,7 +2367,8 @@
if (S_TM(n->suffix))
strcpy(s, str_initcap_z(localized_full_days[tm->tm_wday]));
else
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9, days[tm->tm_wday]);
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ days[tm->tm_wday]);
s += strlen(s);
break;
case DCH_day:
@@ -2283,10 +2376,8 @@
if (S_TM(n->suffix))
strcpy(s, str_tolower_z(localized_full_days[tm->tm_wday]));
else
- {
- sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9, days[tm->tm_wday]);
- *s = pg_tolower((unsigned char) *s);
- }
+ sprintf(s, "%*s", S_FM(n->suffix) ? 0 : -9,
+ asc_tolower_z(days[tm->tm_wday]));
s += strlen(s);
break;
case DCH_DY:
@@ -2294,7 +2385,7 @@
if (S_TM(n->suffix))
strcpy(s, str_toupper_z(localized_abbrev_days[tm->tm_wday]));
else
- strcpy(s, str_toupper_z(days_short[tm->tm_wday]));
+ strcpy(s, asc_toupper_z(days_short[tm->tm_wday]));
s += strlen(s);
break;
case DCH_Dy:
@@ -2310,10 +2401,7 @@
if (S_TM(n->suffix))
strcpy(s, str_tolower_z(localized_abbrev_days[tm->tm_wday]));
else
- {
- strcpy(s, days_short[tm->tm_wday]);
- *s = pg_tolower((unsigned char) *s);
- }
+ strcpy(s, asc_tolower_z(days_short[tm->tm_wday]));
s += strlen(s);
break;
case DCH_DDD:
@@ -4414,12 +4502,12 @@
case NUM_rn:
if (IS_FILLMODE(Np->Num))
{
- strcpy(Np->inout_p, str_tolower_z(Np->number_p));
+ strcpy(Np->inout_p, asc_tolower_z(Np->number_p));
Np->inout_p += strlen(Np->inout_p) - 1;
}
else
{
- sprintf(Np->inout_p, "%15s", str_tolower_z(Np->number_p));
+ sprintf(Np->inout_p, "%15s", asc_tolower_z(Np->number_p));
Np->inout_p += strlen(Np->inout_p) - 1;
}
break;
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/backend/utils/adt/timestamp.c
^
|
@@ -1559,8 +1559,9 @@
return -1;
}
/* check for just-barely overflow (okay except time-of-day wraps) */
- if ((*result < 0 && date >= 0) ||
- (*result >= 0 && date < 0))
+ /* caution: we want to allow 1999-12-31 24:00:00 */
+ if ((*result < 0 && date > 0) ||
+ (*result > 0 && date < -1))
{
*result = 0; /* keep compiler quiet */
return -1;
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/initdb/po/ru.po
^
|
@@ -591,6 +591,7 @@
msgstr ""
"Файлы, относящиеся к этой СУБД, будут принадлежать пользователю \"%s\".\n"
"От его имени также будет запускаться процесс сервера.\n"
+"\n"
#: initdb.c:2862
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_config/po/pt_BR.po
^
|
@@ -110,7 +110,7 @@
#: pg_config.c:425
#, c-format
msgid " --mandir show location of manual pages\n"
-msgstr " --bindir mostra local das páginas de manual\n"
+msgstr " --mandir mostra local das páginas de manual\n"
#: pg_config.c:426
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_controldata/po/it.po
^
|
@@ -23,7 +23,7 @@
msgstr ""
"Project-Id-Version: pg_controldata (PostgreSQL) 8.4\n"
"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
-"POT-Creation-Date: 2013-01-29 13:24+0000\n"
+"POT-Creation-Date: 2013-03-13 11:15+0000\n"
"PO-Revision-Date: 2012-12-03 18:44+0100\n"
"Last-Translator: Daniele Varrazzo <daniele.varrazzo@gmail.com>\n"
"Language-Team: Gruppo traduzioni ITPUG <traduzioni@itpug.org>\n"
@@ -191,7 +191,7 @@
#: pg_controldata.c:181
#, c-format
msgid "Latest checkpoint's REDO location: %X/%X\n"
-msgstr "Ultima posizione REDO checkpoint: %X/%X\n"
+msgstr "Locazione di REDO dell'ultimo checkpoint: %X/%X\n"
#: pg_controldata.c:184
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_controldata/po/ru.po
^
|
@@ -58,7 +58,6 @@
"Параметры:\n"
" --help показать эту справку и выйти\n"
" --version показать версию и выйти\n"
-"\n"
#: pg_controldata.c:36
#, c-format
@@ -85,11 +84,11 @@
#: pg_controldata.c:50
msgid "shut down"
-msgstr "остановлен"
+msgstr "выключен"
#: pg_controldata.c:52
msgid "shutting down"
-msgstr "останавливается"
+msgstr "выключение"
#: pg_controldata.c:54
msgid "in crash recovery"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_ctl/po/pt_BR.po
^
|
@@ -144,6 +144,7 @@
msgstr ""
"AVISO: modo cópia de segurança online está ativo\n"
"Desligamento não completará até que pg_stop_backup() seja chamado.\n"
+"\n"
#: pg_ctl.c:759 pg_ctl.c:836
msgid "waiting for server to shut down..."
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_ctl/po/ru.po
^
|
@@ -160,7 +160,7 @@
#: pg_ctl.c:752
msgid "server shutting down\n"
-msgstr "сервер завершает работу\n"
+msgstr "сервер останавливается\n"
#: pg_ctl.c:759 pg_ctl.c:836
msgid ""
@@ -284,7 +284,6 @@
msgid "%s: could not unregister service \"%s\": error code %d\n"
msgstr ""
"%s: ошибка при удалении службы \"%s\": код ошибки %d\n"
-"\n"
#: pg_ctl.c:1227
msgid "Waiting for server startup...\n"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_dump/pg_backup_db.c
^
|
@@ -255,7 +255,8 @@
/* check to see that the backend connection was successfully made */
if (PQstatus(AH->connection) == CONNECTION_BAD)
die_horribly(AH, modulename, "connection to database \"%s\" failed: %s",
- PQdb(AH->connection), PQerrorMessage(AH->connection));
+ PQdb(AH->connection) ? PQdb(AH->connection) : "",
+ PQerrorMessage(AH->connection));
/* check for version mismatch */
_check_database_version(AH);
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_dump/pg_dump.c
^
|
@@ -3750,6 +3750,7 @@
"ON (d.refclassid = c.tableoid "
"AND d.refobjid = c.oid) "
"WHERE i.indrelid = '%u'::pg_catalog.oid "
+ "AND i.indisvalid "
"ORDER BY indexname",
tbinfo->dobj.catId.oid);
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_dump/pg_dumpall.c
^
|
@@ -48,6 +48,7 @@
static void dumpDatabases(PGconn *conn);
static void dumpTimestamp(char *msg);
static void doShellQuoting(PQExpBuffer buf, const char *str);
+static void doConnStrQuoting(PQExpBuffer buf, const char *str);
static int runPgDump(const char *dbname);
static PGconn *connectDatabase(const char *dbname, const char *pghost, const char *pgport,
@@ -1485,6 +1486,7 @@
static int
runPgDump(const char *dbname)
{
+ PQExpBuffer connstr = createPQExpBuffer();
PQExpBuffer cmd = createPQExpBuffer();
int ret;
@@ -1500,7 +1502,17 @@
else
appendPQExpBuffer(cmd, " -Fp ");
- doShellQuoting(cmd, dbname);
+ /*
+ * Construct a connection string from the database name, like
+ * dbname='<database name>'. pg_dump would usually also accept the
+ * database name as is, but if it contains any = characters, it would
+ * incorrectly treat it as a connection string.
+ */
+ appendPQExpBuffer(connstr, "dbname='");
+ doConnStrQuoting(connstr, dbname);
+ appendPQExpBuffer(connstr, "'");
+
+ doShellQuoting(cmd, connstr->data);
appendPQExpBuffer(cmd, "%s", SYSTEMQUOTE);
@@ -1513,6 +1525,7 @@
ret = system(cmd->data);
destroyPQExpBuffer(cmd);
+ destroyPQExpBuffer(connstr);
return ret;
}
@@ -1709,6 +1722,25 @@
/*
+ * Append the given string to the buffer, with suitable quoting for passing
+ * the string as a value, in a keyword/pair value in a libpq connection
+ * string
+ */
+static void
+doConnStrQuoting(PQExpBuffer buf, const char *str)
+{
+ while (*str)
+ {
+ /* ' and \ must be escaped by to \' and \\ */
+ if (*str == '\'' || *str == '\\')
+ appendPQExpBufferChar(buf, '\\');
+
+ appendPQExpBufferChar(buf, *str);
+ str++;
+ }
+}
+
+/*
* Append the given string to the shell command being built in the buffer,
* with suitable shell-style quoting.
*/
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_dump/po/pt_BR.po
^
|
@@ -335,7 +335,7 @@
"Connection options:\n"
msgstr ""
"\n"
-"Opções de conexão: \n"
+"Opções de conexão:\n"
#: pg_dump.c:827 pg_restore.c:442 pg_dumpall.c:557
#, c-format
@@ -1841,7 +1841,7 @@
" -L, --use-list=FILENAME use table of contents from this file for\n"
" selecting/ordering output\n"
msgstr ""
-" -L, --user-list=ARQUIVO usa tabela de conteúdo deste arquivo para\n"
+" -L, --use-list=ARQUIVO usa tabela de conteúdo deste arquivo para\n"
" selecionar/ordenar saída\n"
#: pg_restore.c:420
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/pg_dump/po/ru.po
^
|
@@ -1448,7 +1448,7 @@
#: pg_backup_db.c:54
msgid "could not get server_version from libpq\n"
-msgstr "%s: не удалось получить версию сервера из libpq\n"
+msgstr "не удалось получить версию сервера из libpq\n"
#: pg_backup_db.c:65 pg_dumpall.c:1615
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/psql/po/de.po
^
|
@@ -8,7 +8,7 @@
"Project-Id-Version: PostgreSQL 8.4\n"
"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
"POT-Creation-Date: 2012-09-17 19:45+0000\n"
-"PO-Revision-Date: 2012-09-18 21:31-0400\n"
+"PO-Revision-Date: 2013-03-31 00:08-0400\n"
"Last-Translator: Peter Eisentraut <peter_e@gmx.net>\n"
"Language-Team: German <peter_e@gmx.net>\n"
"Language: de\n"
@@ -493,9 +493,7 @@
msgid ""
"psql is the PostgreSQL interactive terminal.\n"
"\n"
-msgstr ""
-"psql ist das interaktive PostgreSQL-Terminal.\n"
-"\n"
+msgstr "psql ist das interaktive PostgreSQL-Terminal.\n\n"
#: help.c:87
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/psql/po/pt_BR.po
^
|
@@ -196,9 +196,7 @@
#: command.c:1399
#, c-format
msgid "SSL connection (unknown cipher)\n"
-msgstr ""
-"conexão SSL (cifra desconhecida)\n"
-"\n"
+msgstr "conexão SSL (cifra desconhecida)\n"
#: command.c:1420
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/psql/po/ru.po
^
|
@@ -530,7 +530,9 @@
msgid ""
" psql [OPTION]... [DBNAME [USERNAME]]\n"
"\n"
-msgstr " psql [ПАРАМЕТР]... [БД [ПОЛЬЗОВАТЕЛЬ]]\n"
+msgstr ""
+" psql [ПАРАМЕТР]... [БД [ПОЛЬЗОВАТЕЛЬ]]\n"
+"\n"
#: help.c:90
#, c-format
@@ -1165,8 +1167,8 @@
" connect to new database (currently \"%s\")\n"
msgstr ""
" \\c[onnect] [БД|- ПОЛЬЗОВАТЕЛЬ|- СЕРВЕР|- ПОРТ|-]\n"
-" подключиться к другой базе данных (текущая: \"%s"
-"\")\n"
+" подключиться к другой базе данных\n"
+" (текущая: \"%s\")\n"
#: help.c:248
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/scripts/po/de.po
^
|
@@ -1,5 +1,5 @@
# German message translation file for "scripts".
-# Peter Eisentraut <peter_e@gmx.net>, 2003 - 2009.
+# Peter Eisentraut <peter_e@gmx.net>, 2003 - 2013.
#
# Use these quotes: »%s«
#
@@ -8,7 +8,7 @@
"Project-Id-Version: PostgreSQL 8.4\n"
"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
"POT-Creation-Date: 2009-03-01 07:22+0000\n"
-"PO-Revision-Date: 2012-05-03 22:11+0300\n"
+"PO-Revision-Date: 2013-03-08 00:22-0500\n"
"Last-Translator: Peter Eisentraut <peter_e@gmx.net>\n"
"Language-Team: German <peter_e@gmx.net>\n"
"MIME-Version: 1.0\n"
@@ -850,7 +850,7 @@
#: reindexdb.c:319
#, c-format
msgid " -i, --index=INDEX recreate specific index only\n"
-msgstr " -t, --table=TABELLE erneuere nur einen bestimmten Index\n"
+msgstr " -i, --index=INDEX erneuere nur einen bestimmten Index\n"
#: reindexdb.c:321
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/scripts/po/pt_BR.po
^
|
@@ -525,7 +525,9 @@
msgid ""
"%s removes a procedural language from a database.\n"
"\n"
-msgstr "%s remove uma linguagem procedural do banco de dados.\n"
+msgstr ""
+"%s remove uma linguagem procedural do banco de dados.\n"
+"\n"
#: droplang.c:335
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/bin/scripts/po/ru.po
^
|
@@ -210,7 +210,7 @@
"By default, a database with the same name as the current user is created.\n"
msgstr ""
"\n"
-"По умолчанию именем базы данных становится имя текущего пользователя.\n"
+"По умолчанию именем базы данных считается имя текущего пользователя.\n"
#: createdb.c:265 createlang.c:229 createuser.c:329 dropdb.c:153
#: droplang.c:346 dropuser.c:152 clusterdb.c:254 vacuumdb.c:283
@@ -336,7 +336,7 @@
#: createuser.c:169
msgid "Enter name of role to add: "
-msgstr "Введите имя новой роли:"
+msgstr "Введите имя новой роли: "
#: createuser.c:176
msgid "Enter password for new role: "
@@ -850,7 +850,7 @@
#: reindexdb.c:319
#, c-format
msgid " -i, --index=INDEX recreate specific index only\n"
-msgstr " -I, --index=ИНДЕКС восстановить только указанный индекс\n"
+msgstr " -i, --index=ИНДЕКС пересоздать только указанный индекс\n"
#: reindexdb.c:321
#, c-format
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/include/access/gist.h
^
|
@@ -82,11 +82,30 @@
/*
* This is the Split Vector to be returned by the PickSplit method.
- * PickSplit should check spl_(r|l)datum_exists. If it is 'true',
- * that corresponding spl_(r|l)datum already defined and
- * PickSplit should use that value. PickSplit should always set
- * spl_(r|l)datum_exists to false: GiST will check value to
- * control supportng this feature by PickSplit...
+ * PickSplit should fill the indexes of tuples to go to the left side into
+ * spl_left[], and those to go to the right into spl_right[] (note the method
+ * is responsible for palloc'ing both of these arrays!). The tuple counts
+ * go into spl_nleft/spl_nright, and spl_ldatum/spl_rdatum must be set to
+ * the union keys for each side.
+ *
+ * If spl_ldatum_exists and spl_rdatum_exists are true, then we are performing
+ * a "secondary split" using a non-first index column. In this case some
+ * decisions have already been made about a page split, and the set of tuples
+ * being passed to PickSplit is just the tuples about which we are undecided.
+ * spl_ldatum/spl_rdatum then contain the union keys for the tuples already
+ * chosen to go left or right. Ideally the PickSplit method should take those
+ * keys into account while deciding what to do with the remaining tuples, ie
+ * it should try to "build out" from those unions so as to minimally expand
+ * them. If it does so, it should union the given tuples' keys into the
+ * existing spl_ldatum/spl_rdatum values rather than just setting those values
+ * from scratch, and then set spl_ldatum_exists/spl_rdatum_exists to false to
+ * show it has done this.
+ *
+ * If the PickSplit method fails to clear spl_ldatum_exists/spl_rdatum_exists,
+ * the core GiST code will make its own decision about how to merge the
+ * secondary-split results with the previously-chosen tuples, and will then
+ * recompute the union keys from scratch. This is a workable though often not
+ * optimal approach.
*/
typedef struct GIST_SPLITVEC
{
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/include/access/gist_private.h
^
|
@@ -188,22 +188,23 @@
struct GISTInsertStack *next;
} GISTInsertStack;
+/* Working state and results for multi-column split logic in gistsplit.c */
typedef struct GistSplitVector
{
- GIST_SPLITVEC splitVector; /* to/from PickSplit method */
+ GIST_SPLITVEC splitVector; /* passed to/from user PickSplit method */
Datum spl_lattr[INDEX_MAX_KEYS]; /* Union of subkeys in
- * spl_left */
+ * splitVector.spl_left */
bool spl_lisnull[INDEX_MAX_KEYS];
bool spl_leftvalid;
Datum spl_rattr[INDEX_MAX_KEYS]; /* Union of subkeys in
- * spl_right */
+ * splitVector.spl_right */
bool spl_risnull[INDEX_MAX_KEYS];
bool spl_rightvalid;
- bool *spl_equiv; /* equivalent tuples which can be freely
- * distributed between left and right pages */
+ bool *spl_dontcare; /* flags tuples which could go to either side
+ * of the split for zero penalty */
} GistSplitVector;
typedef struct
@@ -314,7 +315,7 @@
extern float gistpenalty(GISTSTATE *giststate, int attno,
GISTENTRY *key1, bool isNull1,
GISTENTRY *key2, bool isNull2);
-extern bool gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len, int startkey,
+extern bool gistMakeUnionItVec(GISTSTATE *giststate, IndexTuple *itvec, int len,
Datum *attr, bool *isnull);
extern bool gistKeyIsEQ(GISTSTATE *giststate, int attno, Datum a, Datum b);
extern void gistDeCompressAtt(GISTSTATE *giststate, Relation r, IndexTuple tuple, Page p,
@@ -334,7 +335,7 @@
/* gistsplit.c */
extern void gistSplitByKey(Relation r, Page page, IndexTuple *itup,
int len, GISTSTATE *giststate,
- GistSplitVector *v, GistEntryVector *entryvec,
+ GistSplitVector *v,
int attno);
#endif /* GIST_PRIVATE_H */
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/include/pg_config.h.win32
^
|
@@ -563,16 +563,16 @@
#define PACKAGE_NAME "PostgreSQL"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "PostgreSQL 8.4.16"
+#define PACKAGE_STRING "PostgreSQL 8.4.17"
/* Define to the version of this package. */
-#define PACKAGE_VERSION "8.4.16"
+#define PACKAGE_VERSION "8.4.17"
/* PostgreSQL version as a string */
-#define PG_VERSION "8.4.16"
+#define PG_VERSION "8.4.17"
/* PostgreSQL version as a number */
-#define PG_VERSION_NUM 80416
+#define PG_VERSION_NUM 80417
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "postgresql"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/include/utils/formatting.h
^
|
@@ -25,6 +25,10 @@
extern char *str_toupper(const char *buff, size_t nbytes);
extern char *str_initcap(const char *buff, size_t nbytes);
+extern char *asc_tolower(const char *buff, size_t nbytes);
+extern char *asc_toupper(const char *buff, size_t nbytes);
+extern char *asc_initcap(const char *buff, size_t nbytes);
+
extern Datum timestamp_to_char(PG_FUNCTION_ARGS);
extern Datum timestamptz_to_char(PG_FUNCTION_ARGS);
extern Datum interval_to_char(PG_FUNCTION_ARGS);
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/interfaces/ecpg/pgtypeslib/timestamp.c
^
|
@@ -76,8 +76,9 @@
if ((*result - time) / USECS_PER_DAY != dDate)
return -1;
/* check for just-barely overflow (okay except time-of-day wraps) */
- if ((*result < 0 && dDate >= 0) ||
- (*result >= 0 && dDate < 0))
+ /* caution: we want to allow 1999-12-31 24:00:00 */
+ if ((*result < 0 && dDate > 0) ||
+ (*result > 0 && dDate < -1))
return -1;
#else
*result = dDate * SECS_PER_DAY + time;
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/interfaces/libpq/libpq-dist.rc
^
|
@@ -1,8 +1,8 @@
#include <winver.h>
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 8,4,16,13035
- PRODUCTVERSION 8,4,16,13035
+ FILEVERSION 8,4,17,13091
+ PRODUCTVERSION 8,4,17,13091
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS VOS__WINDOWS32
@@ -15,13 +15,13 @@
BEGIN
VALUE "CompanyName", "\0"
VALUE "FileDescription", "PostgreSQL Access Library\0"
- VALUE "FileVersion", "8.4.16\0"
+ VALUE "FileVersion", "8.4.17\0"
VALUE "InternalName", "libpq\0"
VALUE "LegalCopyright", "Copyright (C) 2012\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "libpq.dll\0"
VALUE "ProductName", "PostgreSQL\0"
- VALUE "ProductVersion", "8.4.16\0"
+ VALUE "ProductVersion", "8.4.17\0"
END
END
BLOCK "VarFileInfo"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/interfaces/libpq/libpq.rc.in
^
|
@@ -1,8 +1,8 @@
#include <winver.h>
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 8,4,16,0
- PRODUCTVERSION 8,4,16,0
+ FILEVERSION 8,4,17,0
+ PRODUCTVERSION 8,4,17,0
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS VOS__WINDOWS32
@@ -15,13 +15,13 @@
BEGIN
VALUE "CompanyName", "\0"
VALUE "FileDescription", "PostgreSQL Access Library\0"
- VALUE "FileVersion", "8.4.16\0"
+ VALUE "FileVersion", "8.4.17\0"
VALUE "InternalName", "libpq\0"
VALUE "LegalCopyright", "Copyright (C) 2012\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "libpq.dll\0"
VALUE "ProductName", "PostgreSQL\0"
- VALUE "ProductVersion", "8.4.16\0"
+ VALUE "ProductVersion", "8.4.17\0"
END
END
BLOCK "VarFileInfo"
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/interfaces/libpq/po/de.po
^
|
@@ -1,5 +1,5 @@
# German message translation file for libpq
-# Peter Eisentraut <peter_e@gmx.net>, 2001 - 2012.
+# Peter Eisentraut <peter_e@gmx.net>, 2001 - 2013.
#
# Use these quotes: »%s«
#
@@ -8,7 +8,7 @@
"Project-Id-Version: PostgreSQL 8.4\n"
"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
"POT-Creation-Date: 2012-12-01 23:10+0000\n"
-"PO-Revision-Date: 2012-12-02 00:59-0500\n"
+"PO-Revision-Date: 2013-03-04 22:15-0500\n"
"Last-Translator: Peter Eisentraut <peter_e@gmx.net>\n"
"Language-Team: German <peter_e@gmx.net>\n"
"Language: de\n"
@@ -224,7 +224,7 @@
#: fe-connect.c:2652
#, c-format
msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n"
-msgstr "ungÜltige LDAP-URL »%s«: Schema muss ldap:// sein\n"
+msgstr "ungültige LDAP-URL »%s«: Schema muss ldap:// sein\n"
#: fe-connect.c:2667
#, c-format
@@ -490,7 +490,7 @@
"\tbefore or while processing the request.\n"
msgstr ""
"Server beendete die Verbindung unerwartet\n"
-"\tDas heißt wahrscheinlich, daß der Server abnormal beendete\n"
+"\tDas heißt wahrscheinlich, dass der Server abnormal beendete\n"
"\tbevor oder während die Anweisung bearbeitet wurde.\n"
#: fe-misc.c:940
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/interfaces/libpq/po/ru.po
^
|
@@ -25,8 +25,8 @@
msgstr ""
"Project-Id-Version: PostgreSQL 8.4\n"
"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
-"POT-Creation-Date: 2012-12-03 17:10+0000\n"
-"PO-Revision-Date: 2012-12-03 21:52+0400\n"
+"POT-Creation-Date: 2013-03-08 06:22+0000\n"
+"PO-Revision-Date: 2013-03-13 14:26+0400\n"
"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
"Language-Team: Russian <pgtranslation-translators@pgfoundry.org>\n"
"Language: ru\n"
@@ -138,7 +138,7 @@
"\tconnections on Unix domain socket \"%s\"?\n"
msgstr ""
"не удалось подключиться к серверу: %s\n"
-"\tВозможно, он работает локально и принимает\n"
+"\tОн действительно работает локально и принимает\n"
"\tсоединения через доменный сокет \"%s\"?\n"
#: fe-connect.c:768
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/pl/plperl/plperl.c
^
|
@@ -175,6 +175,7 @@
typedef struct plperl_query_desc
{
char qname[24];
+ MemoryContext plan_cxt; /* context holding this struct */
void *plan;
int nargs;
Oid *argtypes;
@@ -2387,31 +2388,55 @@
SV *
plperl_spi_prepare(char *query, int argc, SV **argv)
{
- plperl_query_desc *qdesc;
- plperl_query_entry *hash_entry;
- bool found;
- void *plan;
- int i;
-
+ void *volatile plan = NULL;
+ volatile MemoryContext plan_cxt = NULL;
+ plperl_query_desc *volatile qdesc = NULL;
+ plperl_query_entry *volatile hash_entry = NULL;
MemoryContext oldcontext = CurrentMemoryContext;
ResourceOwner oldowner = CurrentResourceOwner;
+ MemoryContext work_cxt;
+ bool found;
+ int i;
BeginInternalSubTransaction(NULL);
MemoryContextSwitchTo(oldcontext);
- /************************************************************
- * Allocate the new querydesc structure
- ************************************************************/
- qdesc = (plperl_query_desc *) malloc(sizeof(plperl_query_desc));
- MemSet(qdesc, 0, sizeof(plperl_query_desc));
- snprintf(qdesc->qname, sizeof(qdesc->qname), "%lx", (long) qdesc);
- qdesc->nargs = argc;
- qdesc->argtypes = (Oid *) malloc(argc * sizeof(Oid));
- qdesc->arginfuncs = (FmgrInfo *) malloc(argc * sizeof(FmgrInfo));
- qdesc->argtypioparams = (Oid *) malloc(argc * sizeof(Oid));
-
PG_TRY();
{
+ CHECK_FOR_INTERRUPTS();
+
+ /************************************************************
+ * Allocate the new querydesc structure
+ *
+ * The qdesc struct, as well as all its subsidiary data, lives in its
+ * plan_cxt. But note that the SPIPlan does not.
+ ************************************************************/
+ plan_cxt = AllocSetContextCreate(TopMemoryContext,
+ "PL/Perl spi_prepare query",
+ ALLOCSET_SMALL_MINSIZE,
+ ALLOCSET_SMALL_INITSIZE,
+ ALLOCSET_SMALL_MAXSIZE);
+ MemoryContextSwitchTo(plan_cxt);
+ qdesc = (plperl_query_desc *) palloc0(sizeof(plperl_query_desc));
+ snprintf(qdesc->qname, sizeof(qdesc->qname), "%lx", (long) qdesc);
+ qdesc->plan_cxt = plan_cxt;
+ qdesc->nargs = argc;
+ qdesc->argtypes = (Oid *) palloc(argc * sizeof(Oid));
+ qdesc->arginfuncs = (FmgrInfo *) palloc(argc * sizeof(FmgrInfo));
+ qdesc->argtypioparams = (Oid *) palloc(argc * sizeof(Oid));
+ MemoryContextSwitchTo(oldcontext);
+
+ /************************************************************
+ * Do the following work in a short-lived context so that we don't
+ * leak a lot of memory in the PL/Perl function's SPI Proc context.
+ ************************************************************/
+ work_cxt = AllocSetContextCreate(CurrentMemoryContext,
+ "PL/Perl spi_prepare workspace",
+ ALLOCSET_DEFAULT_MINSIZE,
+ ALLOCSET_DEFAULT_INITSIZE,
+ ALLOCSET_DEFAULT_MAXSIZE);
+ MemoryContextSwitchTo(work_cxt);
+
/************************************************************
* Resolve argument type names and then look them up by oid
* in the system cache, and remember the required information
@@ -2429,7 +2454,7 @@
getTypeInputInfo(typId, &typInput, &typIOParam);
qdesc->argtypes[i] = typId;
- perm_fmgr_info(typInput, &(qdesc->arginfuncs[i]));
+ fmgr_info_cxt(typInput, &(qdesc->arginfuncs[i]), plan_cxt);
qdesc->argtypioparams[i] = typIOParam;
}
@@ -2454,6 +2479,17 @@
/* Release the procCxt copy to avoid within-function memory leak */
SPI_freeplan(plan);
+ /************************************************************
+ * Insert a hashtable entry for the plan.
+ ************************************************************/
+ hash_entry = hash_search(plperl_active_interp->query_hash,
+ qdesc->qname,
+ HASH_ENTER, &found);
+ hash_entry->query_data = qdesc;
+
+ /* Get rid of workspace */
+ MemoryContextDelete(work_cxt);
+
/* Commit the inner transaction, return to outer xact context */
ReleaseCurrentSubTransaction();
MemoryContextSwitchTo(oldcontext);
@@ -2469,16 +2505,21 @@
{
ErrorData *edata;
- free(qdesc->argtypes);
- free(qdesc->arginfuncs);
- free(qdesc->argtypioparams);
- free(qdesc);
-
/* Save error info */
MemoryContextSwitchTo(oldcontext);
edata = CopyErrorData();
FlushErrorState();
+ /* Drop anything we managed to allocate */
+ if (hash_entry)
+ hash_search(plperl_active_interp->query_hash,
+ qdesc->qname,
+ HASH_REMOVE, NULL);
+ if (plan_cxt)
+ MemoryContextDelete(plan_cxt);
+ if (plan)
+ SPI_freeplan(plan);
+
/* Abort the inner transaction */
RollbackAndReleaseCurrentSubTransaction();
MemoryContextSwitchTo(oldcontext);
@@ -2500,14 +2541,8 @@
PG_END_TRY();
/************************************************************
- * Insert a hashtable entry for the plan and return
- * the key to the caller.
+ * Return the query's hash key to the caller.
************************************************************/
-
- hash_entry = hash_search(plperl_active_interp->query_hash, qdesc->qname,
- HASH_ENTER, &found);
- hash_entry->query_data = qdesc;
-
return newSVstring(qdesc->qname);
}
@@ -2540,16 +2575,14 @@
/************************************************************
* Fetch the saved plan descriptor, see if it's o.k.
************************************************************/
-
hash_entry = hash_search(plperl_active_interp->query_hash, query,
HASH_FIND, NULL);
if (hash_entry == NULL)
elog(ERROR, "spi_exec_prepared: Invalid prepared query passed");
qdesc = hash_entry->query_data;
-
if (qdesc == NULL)
- elog(ERROR, "spi_exec_prepared: panic - plperl query_hash value vanished");
+ elog(ERROR, "spi_exec_prepared: plperl query_hash value vanished");
if (qdesc->nargs != argc)
elog(ERROR, "spi_exec_prepared: expected %d argument(s), %d passed",
@@ -2685,12 +2718,11 @@
hash_entry = hash_search(plperl_active_interp->query_hash, query,
HASH_FIND, NULL);
if (hash_entry == NULL)
- elog(ERROR, "spi_exec_prepared: Invalid prepared query passed");
+ elog(ERROR, "spi_query_prepared: Invalid prepared query passed");
qdesc = hash_entry->query_data;
-
if (qdesc == NULL)
- elog(ERROR, "spi_query_prepared: panic - plperl query_hash value vanished");
+ elog(ERROR, "spi_query_prepared: plperl query_hash value vanished");
if (qdesc->nargs != argc)
elog(ERROR, "spi_query_prepared: expected %d argument(s), %d passed",
@@ -2799,12 +2831,12 @@
hash_entry = hash_search(plperl_active_interp->query_hash, query,
HASH_FIND, NULL);
if (hash_entry == NULL)
- elog(ERROR, "spi_exec_prepared: Invalid prepared query passed");
+ elog(ERROR, "spi_freeplan: Invalid prepared query passed");
qdesc = hash_entry->query_data;
-
if (qdesc == NULL)
- elog(ERROR, "spi_exec_freeplan: panic - plperl query_hash value vanished");
+ elog(ERROR, "spi_freeplan: plperl query_hash value vanished");
+ plan = qdesc->plan;
/*
* free all memory before SPI_freeplan, so if it dies, nothing will be
@@ -2813,11 +2845,7 @@
hash_search(plperl_active_interp->query_hash, query,
HASH_REMOVE, NULL);
- plan = qdesc->plan;
- free(qdesc->argtypes);
- free(qdesc->arginfuncs);
- free(qdesc->argtypioparams);
- free(qdesc);
+ MemoryContextDelete(qdesc->plan_cxt);
SPI_freeplan(plan);
}
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/port/win32ver.rc
^
|
@@ -2,8 +2,8 @@
#include "pg_config.h"
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 8,4,16,0
- PRODUCTVERSION 8,4,16,0
+ FILEVERSION 8,4,17,0
+ PRODUCTVERSION 8,4,17,0
FILEFLAGSMASK 0x17L
FILEFLAGS 0x0L
FILEOS VOS_NT_WINDOWS32
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/africa
^
|
@@ -6,7 +6,7 @@
# go ahead and edit the file (and please send any changes to
# tz@iana.org for general use in the future).
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2013-02-21):
#
# A good source for time zone historical data outside the U.S. is
# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
@@ -25,6 +25,10 @@
# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
# I found in the UCLA library.
#
+# For data circa 1899, a common source is:
+# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94
+# <http://www.jstor.org/stable/1774359>.
+#
# A reliable and entertaining source about time zones is
# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
#
@@ -116,8 +120,12 @@
1:00 - WAT
# Botswana
+# From Paul Eggert (2013-02-21):
+# Milne says they were regulated by the Cape Town Signal in 1899;
+# assume they switched to 2:00 when Cape Town did.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Gaborone 1:43:40 - LMT 1885
+ 1:30 - SAST 1903 Mar
2:00 - CAT 1943 Sep 19 2:00
2:00 1:00 CAST 1944 Mar 19 2:00
2:00 - CAT
@@ -189,6 +197,11 @@
# Egypt
+# Milne says Cairo used 2:05:08.9, the local mean time of the Abbasizeh
+# observatory; round to nearest. Milne also says that the official time for
+# Egypt was mean noon at the Great Pyramid, 2:04:30.5, but apparently this
+# did not apply to Cairo, Alexandria, or Port Said.
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Egypt 1940 only - Jul 15 0:00 1:00 S
Rule Egypt 1940 only - Oct 1 0:00 0 -
@@ -329,7 +342,7 @@
Rule Egypt 2010 only - Sep lastThu 23:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Africa/Cairo 2:05:00 - LMT 1900 Oct
+Zone Africa/Cairo 2:05:09 - LMT 1900 Oct
2:00 Egypt EE%sT
# Equatorial Guinea
@@ -833,6 +846,41 @@
# 3:00 am Friday, July 20, 2012 and will again be advanced by 60 minutes
# August 20, 2012 from 2:00 am.
+# From Paul Eggert (2013-03-06):
+# Morocco's daylight-saving transitions due to Ramadan seem to be
+# announced a bit in advance. On 2012-07-11 the Moroccan government
+# announced that year's Ramadan daylight-saving transitions would be
+# 2012-07-20 and 2012-08-20; see
+# <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>.
+#
+# To estimate what the Moroccan government will do in future years,
+# transition dates for 2013 through 2021 were determined by running
+# the following program under GNU Emacs 24.3:
+#
+# (let ((islamic-year 1434))
+# (while (< islamic-year 1444)
+# (let ((a
+# (calendar-gregorian-from-absolute
+# (calendar-islamic-to-absolute (list 9 1 islamic-year))))
+# (b
+# (calendar-gregorian-from-absolute
+# (calendar-islamic-to-absolute (list 10 1 islamic-year)))))
+# (insert
+# (format
+# (concat "Rule\tMorocco\t%d\tonly\t-\t%s\t %2d\t 3:00\t0\t-\n"
+# "Rule\tMorocco\t%d\tonly\t-\t%s\t %2d\t 2:00\t1:00\tS\n")
+# (car (cdr (cdr a))) (calendar-month-name (car a) t) (car (cdr a))
+# (car (cdr (cdr b))) (calendar-month-name (car b) t) (car (cdr b)))))
+# (setq islamic-year (+ 1 islamic-year))))
+#
+# with the results hand-edited for 2020-2022, when the normal spring-forward
+# date falls during the estimated Ramadan.
+#
+# From 2023 through 2038 Ramadan is not predicted to overlap with
+# daylight saving time. Starting in 2039 there will be overlap again,
+# but 32-bit time_t values roll around in 2038 so for now do not worry
+# about dates after 2038.
+
# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Morocco 1939 only - Sep 12 0:00 1:00 S
@@ -858,10 +906,28 @@
Rule Morocco 2010 only - Aug 8 0:00 0 -
Rule Morocco 2011 only - Apr 3 0:00 1:00 S
Rule Morocco 2011 only - Jul 31 0 0 -
-Rule Morocco 2012 max - Apr lastSun 2:00 1:00 S
+Rule Morocco 2012 2019 - Apr lastSun 2:00 1:00 S
Rule Morocco 2012 max - Sep lastSun 3:00 0 -
Rule Morocco 2012 only - Jul 20 3:00 0 -
Rule Morocco 2012 only - Aug 20 2:00 1:00 S
+Rule Morocco 2013 only - Jul 9 3:00 0 -
+Rule Morocco 2013 only - Aug 8 2:00 1:00 S
+Rule Morocco 2014 only - Jun 29 3:00 0 -
+Rule Morocco 2014 only - Jul 29 2:00 1:00 S
+Rule Morocco 2015 only - Jun 18 3:00 0 -
+Rule Morocco 2015 only - Jul 18 2:00 1:00 S
+Rule Morocco 2016 only - Jun 7 3:00 0 -
+Rule Morocco 2016 only - Jul 7 2:00 1:00 S
+Rule Morocco 2017 only - May 27 3:00 0 -
+Rule Morocco 2017 only - Jun 26 2:00 1:00 S
+Rule Morocco 2018 only - May 16 3:00 0 -
+Rule Morocco 2018 only - Jun 15 2:00 1:00 S
+Rule Morocco 2019 only - May 6 3:00 0 -
+Rule Morocco 2019 only - Jun 5 2:00 1:00 S
+Rule Morocco 2020 only - May 24 2:00 1:00 S
+Rule Morocco 2021 only - May 13 2:00 1:00 S
+Rule Morocco 2022 only - May 3 2:00 1:00 S
+Rule Morocco 2023 max - Apr lastSun 2:00 1:00 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/antarctica
^
|
@@ -50,10 +50,8 @@
Rule ChileAQ 2010 only - Apr Sun>=1 3:00u 0 -
Rule ChileAQ 2011 only - May Sun>=2 3:00u 0 -
Rule ChileAQ 2011 only - Aug Sun>=16 4:00u 1:00 S
-Rule ChileAQ 2012 only - Apr Sun>=23 3:00u 0 -
-Rule ChileAQ 2012 only - Sep Sun>=2 4:00u 1:00 S
-Rule ChileAQ 2013 max - Mar Sun>=9 3:00u 0 -
-Rule ChileAQ 2013 max - Oct Sun>=9 4:00u 1:00 S
+Rule ChileAQ 2012 max - Apr Sun>=23 3:00u 0 -
+Rule ChileAQ 2012 max - Sep Sun>=2 4:00u 1:00 S
# These rules are stolen from the `australasia' file.
Rule AusAQ 1917 only - Jan 1 0:01 1:00 -
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/asia
^
|
@@ -6,7 +6,7 @@
# go ahead and edit the file (and please send any changes to
# tz@iana.org for general use in the future).
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2013-02-21):
#
# A good source for time zone historical data outside the U.S. is
# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
@@ -25,6 +25,10 @@
# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
# I found in the UCLA library.
#
+# For data circa 1899, a common source is:
+# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94
+# <http://www.jstor.org/stable/1774359>.
+#
# A reliable and entertaining source about time zones is
# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
#
@@ -279,9 +283,12 @@
8:00 - BNT
# Burma / Myanmar
+
+# Milne says 6:24:40 was the meridian of the time ball observatory at Rangoon.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Rangoon 6:24:40 - LMT 1880 # or Yangon
- 6:24:36 - RMT 1920 # Rangoon Mean Time?
+ 6:24:40 - RMT 1920 # Rangoon Mean Time?
6:30 - BURT 1942 May # Burma Time
9:00 - JST 1945 May 3
6:30 - MMT # Myanmar Time
@@ -384,7 +391,8 @@
8:00 PRC C%sT
# Zhongyuan Time ("Central plain Time")
# most of China
-Zone Asia/Shanghai 8:05:52 - LMT 1928
+# Milne gives 8:05:56.7; round to nearest.
+Zone Asia/Shanghai 8:05:57 - LMT 1928
8:00 Shang C%sT 1949
8:00 PRC C%sT
# Long-shu Time (probably due to Long and Shu being two names of that area)
@@ -481,6 +489,10 @@
8:00 PRC C%sT
+# Hong Kong (Xianggang)
+
+# Milne gives 7:36:41.7; round this.
+
# From Lee Yiu Chung (2009-10-24):
# I found there are some mistakes for the...DST rule for Hong
# Kong. [According] to the DST record from Hong Kong Observatory (actually,
@@ -547,7 +559,6 @@
# The Japanese surrender of Hong Kong was signed 1945-09-15.
# For lack of anything better, use start of those days as the transition times.
-# Hong Kong (Xianggang)
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule HK 1941 only - Apr 1 3:30 1:00 S
Rule HK 1941 only - Sep 30 3:30 0 -
@@ -569,7 +580,7 @@
Rule HK 1979 only - May Sun>=8 3:30 1:00 S
Rule HK 1979 only - Oct Sun>=16 3:30 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Hong_Kong 7:36:36 - LMT 1904 Oct 30
+Zone Asia/Hong_Kong 7:36:42 - LMT 1904 Oct 30
8:00 HK HK%sT 1941 Dec 25
9:00 - JST 1945 Sep 15
8:00 HK HK%sT
@@ -646,6 +657,9 @@
###############################################################################
# Cyprus
+#
+# Milne says the Eastern Telegraph Company used 2:14:00. Stick with LMT.
+#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Cyprus 1975 only - Apr 13 0:00 1:00 S
Rule Cyprus 1975 only - Oct 12 0:00 0 -
@@ -1804,8 +1818,11 @@
5:45 - NPT # Nepal Time
# Oman
+
+# Milne says 3:54:24 was the meridian of the Muscat Tidal Observatory.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Muscat 3:54:20 - LMT 1920
+Zone Asia/Muscat 3:54:24 - LMT 1920
4:00 - GST
# Pakistan
@@ -2400,6 +2417,13 @@
# no information
# Sri Lanka
+
+# From Paul Eggert (2013-02-21):
+# Milne says "Madras mean time use from May 1, 1898. Prior to this Colombo
+# mean time, 5h. 4m. 21.9s. F., was used." But 5:04:21.9 differs considerably
+# from Colombo's meridian 5:19:24, so for now ignore Milne and stick with
+# Shanks and Pottenger.
+
# From Paul Eggert (1996-09-03):
# "Sri Lanka advances clock by an hour to avoid blackout"
# (www.virtual-pc.com/lankaweb/news/items/240596-2.html, 1996-05-24,
@@ -2699,6 +2723,12 @@
# Vietnam
+# From Paul Eggert (2013-02-21):
+# Milne gives 7:16:56 for the meridian of Saigon in 1899, as being
+# used in Lower Laos, Cambodia, and Annam. But this is quite a ways
+# from Saigon's location. For now, ignore this and stick with Shanks
+# and Pottenger.
+
# From Arthur David Olson (2008-03-18):
# The English-language name of Vietnam's most populous city is "Ho Chi Min City";
# we use Ho_Chi_Minh below to avoid a name of more than 14 characters.
@@ -2712,6 +2742,10 @@
7:00 - ICT
# Yemen
+
+# Milne says 2:59:54 was the meridian of the saluting battery at Aden,
+# and that Yemen was at 1:55:56, the meridian of the Hagia Sophia.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Aden 3:00:48 - LMT 1950
+Zone Asia/Aden 2:59:54 - LMT 1950
3:00 - AST
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/australasia
^
|
@@ -246,6 +246,9 @@
6:30 - CCT # Cocos Islands Time
# Fiji
+
+# Milne gives 11:55:44 for Suva.
+
# From Alexander Krivenyshev (2009-11-10):
# According to Fiji Broadcasting Corporation, Fiji plans to re-introduce DST
# from November 29th 2009 to April 25th 2010.
@@ -339,7 +342,7 @@
Rule Fiji 2011 only - Mar Sun>=1 3:00 0 -
Rule Fiji 2012 max - Jan Sun>=18 3:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Pacific/Fiji 11:53:40 - LMT 1915 Oct 26 # Suva
+Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
12:00 Fiji FJ%sT # Fiji Time
# French Polynesia
@@ -782,7 +785,7 @@
# go ahead and edit the file (and please send any changes to
# tz@iana.org for general use in the future).
-# From Paul Eggert (2006-03-22):
+# From Paul Eggert (2013-02-21):
# A good source for time zone historical data outside the U.S. is
# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
# San Diego: ACS Publications, Inc. (2003).
@@ -800,6 +803,10 @@
# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
# I found in the UCLA library.
#
+# For data circa 1899, a common source is:
+# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94
+# <http://www.jstor.org/stable/1774359>.
+#
# A reliable and entertaining source about time zones is
# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
#
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/europe
^
|
@@ -30,6 +30,12 @@
# William Willett, The Waste of Daylight, 19th edition
# </a> (1914-03)
#
+# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94
+# <http://www.jstor.org/stable/1774359>. He writes:
+# "It is requested that corrections and additions to these tables
+# may be sent to Mr. John Milne, Royal Geographical Society,
+# Savile Row, London." Nowadays please email them to tz@iana.org.
+#
# Brazil's Departamento Servico da Hora (DSH),
# <a href="http://pcdsh01.on.br/HISTHV.htm">
# History of Summer Time
@@ -666,6 +672,8 @@
# Austria
+# Milne says Vienna time was 1:05:21.
+
# From Paul Eggert (2006-03-22): Shanks & Pottenger give 1918-06-16 and
# 1945-11-18, but the Austrian Federal Office of Metrology and
# Surveying (BEV) gives 1918-09-16 and for Vienna gives the "alleged"
@@ -683,7 +691,7 @@
Rule Austria 1980 only - Apr 6 0:00 1:00 S
Rule Austria 1980 only - Sep 28 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Europe/Vienna 1:05:20 - LMT 1893 Apr
+Zone Europe/Vienna 1:05:21 - LMT 1893 Apr
1:00 C-Eur CE%sT 1920
1:00 Austria CE%sT 1940 Apr 1 2:00s
1:00 C-Eur CE%sT 1945 Apr 2 2:00s
@@ -1239,6 +1247,21 @@
1:00 Germany CE%sT 1980
1:00 EU CE%sT
+# From Tobias Conradi (2011-09-12):
+# Busingen <http://www.buesingen.de>, surrounded by the Swiss canton
+# Schaffhausen, did not start observing DST in 1980 as the rest of DE
+# (West Germany at that time) and DD (East Germany at that time) did.
+# DD merged into DE, the area is currently covered by code DE in ISO 3166-1,
+# which in turn is covered by the zone Europe/Berlin.
+#
+# Source for the time in Busingen 1980:
+# http://www.srf.ch/player/video?id=c012c029-03b7-4c2b-9164-aa5902cd58d3
+
+# From Arthur David Olson (2012-03-03):
+# Busingen and Zurich have shared clocks since 1970.
+
+Link Europe/Zurich Europe/Busingen
+
# Georgia
# Please see the "asia" file for Asia/Tbilisi.
# Herodotus (Histories, IV.45) says Georgia north of the Phasis (now Rioni)
@@ -2043,6 +2066,70 @@
# Russia
+# From Alexander Krivenyshev (2011-09-15):
+# Based on last Russian Government Decree # 725 on August 31, 2011
+# (Government document
+# <a href="http://www.government.ru/gov/results/16355/print/">
+# http://www.government.ru/gov/results/16355/print/
+# </a>
+# in Russian)
+# there are few corrections have to be made for some Russian time zones...
+# All updated Russian Time Zones were placed in table and translated to English
+# by WorldTimeZone.com at the link below:
+# <a href="http://www.worldtimezone.com/dst_news/dst_news_russia36.htm">
+# http://www.worldtimezone.com/dst_news/dst_news_russia36.htm
+# </a>
+
+# From Sanjeev Gupta (2011-09-27):
+# Scans of [Decree #23 of January 8, 1992] are available at:
+# <a href="http://government.consultant.ru/page.aspx?1223966">
+# http://government.consultant.ru/page.aspx?1223966
+# They are in Cyrillic letters (presumably Russian).
+
+# From Arthur David Olson (2012-05-09):
+# Regarding the instant when clocks in time-zone-shifting parts of Russia
+# changed in September 2011:
+#
+# One source is
+# < a href="http://government.ru/gov/results/16355/>
+# http://government.ru/gov/results/16355/
+# </a>
+# which, according to translate.google.com, begins "Decree of August 31,
+# 2011 No 725" and contains no other dates or "effective date" information.
+#
+# Another source is
+# <a href="http://www.rg.ru/2011/09/06/chas-zona-dok.html">
+# http://www.rg.ru/2011/09/06/chas-zona-dok.html
+# </a>
+# which, according to translate.google.com, begins "Resolution of the
+# Government of the Russian Federation on August 31, 2011 N 725" and also
+# contains "Date first official publication: September 6, 2011 Posted on:
+# in the 'RG' - Federal Issue number 5573 September 6, 2011" but which
+# does not contain any "effective date" information.
+#
+# Another source is
+# <a href="http://en.wikipedia.org/wiki/Oymyakonsky_District#cite_note-RuTime-7">
+# http://en.wikipedia.org/wiki/Oymyakonsky_District#cite_note-RuTime-7
+# </a>
+# which, in note 8, contains "Resolution #725 of August 31, 2011...
+# Effective as of after 7 days following the day of the official publication"
+# but which does not contain any reference to September 6, 2011.
+#
+# The Wikipedia article refers to
+# <a href="http://base.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=118896">
+# http://base.consultant.ru/cons/cgi/online.cgi?req=doc;base=LAW;n=118896
+# </a>
+# which seems to copy the text of the government.ru page.
+#
+# Tobias Conradi combines Wikipedia's
+# "as of after 7 days following the day of the official publication"
+# with www.rg.ru's "Date of first official publication: September 6, 2011" to get
+# September 13, 2011 as the cutover date (unusually, a Tuesday, as Tobias Conradi notes).
+#
+# None of the sources indicates a time of day for changing clocks.
+#
+# Go with 2011-09-13 0:00s.
+
# From Paul Eggert (2006-03-22):
# Except for Moscow after 1919-07-01, I invented the time zone abbreviations.
# Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991,
@@ -2270,14 +2357,32 @@
# [parts of] Respublika Sakha (Yakutiya).
# From Oscar van Vlijmen (2009-11-29):
-# The Sakha districts are: Bulunskij, Verkhoyanskij, Tomponskij, Ust'-Majskij,
-# Ust'-Yanskij.
+# The Sakha districts are: Bulunskij, Verkhoyanskij, ... Ust'-Yanskij.
Zone Asia/Vladivostok 8:47:44 - LMT 1922 Nov 15
9:00 - VLAT 1930 Jun 21 # Vladivostok Time
10:00 Russia VLA%sT 1991 Mar 31 2:00s
9:00 Russia VLA%sST 1992 Jan 19 2:00s
10:00 Russia VLA%sT 2011 Mar 27 2:00s
11:00 - VLAT
+
+# From Arthur David Olson (2012-05-09):
+# Tomponskij and Ust'-Majskij switched from Vladivostok time to Yakutsk time
+# in 2011.
+#
+# From Paul Eggert (2012-11-25):
+# Shanks and Pottenger (2003) has Khandyga on Yakutsk time.
+# Make a wild guess that it switched to Vladivostok time in 2004.
+# This transition is no doubt wrong, but we have no better info.
+#
+Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
+ 8:00 - YAKT 1930 Jun 21 # Yakutsk Time
+ 9:00 Russia YAK%sT 1991 Mar 31 2:00s
+ 8:00 Russia YAK%sT 1992 Jan 19 2:00s
+ 9:00 Russia YAK%sT 2004
+ 10:00 Russia VLA%sT 2011 Mar 27 2:00s
+ 11:00 - VLAT 2011 Sep 13 0:00s # Decree 725?
+ 10:00 - YAKT
+
#
# Sakhalinskaya oblast'.
# The Zone name should be Yuzhno-Sakhalinsk, but that's too long.
@@ -2296,14 +2401,26 @@
# From Oscar van Vlijmen (2009-11-29):
# The Sakha districts are: Abyjskij, Allaikhovskij, Verkhhhnekolymskij, Momskij,
-# Nizhnekolymskij, Ojmyakonskij, Srednekolymskij.
+# Nizhnekolymskij, ... Srednekolymskij.
Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
10:00 - MAGT 1930 Jun 21 # Magadan Time
11:00 Russia MAG%sT 1991 Mar 31 2:00s
10:00 Russia MAG%sT 1992 Jan 19 2:00s
11:00 Russia MAG%sT 2011 Mar 27 2:00s
12:00 - MAGT
-#
+
+# From Arthur David Olson (2012-05-09):
+# Ojmyakonskij and the Kuril Islands switched from
+# Magadan time to Vladivostok time in 2011.
+Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
+ 8:00 - YAKT 1930 Jun 21 # Yakutsk Time
+ 9:00 Russia YAKT 1981 Apr 1
+ 11:00 Russia MAG%sT 1991 Mar 31 2:00s
+ 10:00 Russia MAG%sT 1992 Jan 19 2:00s
+ 11:00 Russia MAG%sT 2011 Mar 27 2:00s
+ 12:00 - MAGT 2011 Sep 13 0:00s # Decree 725?
+ 11:00 - VLAT
+
# From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Kamchatskaya oblast', Koryakskij avtonomnyj okrug.
#
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/northamerica
^
|
@@ -1019,6 +1019,9 @@
# William Willett, The Waste of Daylight, 19th edition
# </a> (1914-03)
#
+# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94
+# <http://www.jstor.org/stable/1774359>.
+#
# See the `europe' file for Greenland.
# Canada
@@ -2554,6 +2557,8 @@
# Bahamas
#
+# For 1899 Milne gives -5:09:29.5; round that.
+#
# From Sue Williams (2006-12-07):
# The Bahamas announced about a month ago that they plan to change their DST
# rules to sync with the U.S. starting in 2007....
@@ -2563,11 +2568,14 @@
Rule Bahamas 1964 1975 - Oct lastSun 2:00 0 S
Rule Bahamas 1964 1975 - Apr lastSun 2:00 1:00 D
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Nassau -5:09:24 - LMT 1912 Mar 2
+Zone America/Nassau -5:09:30 - LMT 1912 Mar 2
-5:00 Bahamas E%sT 1976
-5:00 US E%sT
# Barbados
+
+# For 1899 Milne gives -3:58:29.2; round that.
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Barb 1977 only - Jun 12 2:00 1:00 D
Rule Barb 1977 1978 - Oct Sun>=1 2:00 0 S
@@ -2575,8 +2583,8 @@
Rule Barb 1979 only - Sep 30 2:00 0 S
Rule Barb 1980 only - Sep 25 2:00 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Barbados -3:58:28 - LMT 1924 # Bridgetown
- -3:58:28 - BMT 1932 # Bridgetown Mean Time
+Zone America/Barbados -3:58:29 - LMT 1924 # Bridgetown
+ -3:58:29 - BMT 1932 # Bridgetown Mean Time
-4:00 Barb A%sT
# Belize
@@ -2594,6 +2602,9 @@
# Bermuda
+# For 1899 Milne gives -4:19:18.3 as the meridian of the clock tower,
+# Bermuda dockyard, Ireland I; round that.
+
# From Dan Jones, reporting in The Royal Gazette (2006-06-26):
# Next year, however, clocks in the US will go forward on the second Sunday
@@ -2603,7 +2614,7 @@
# http://www.theroyalgazette.com/apps/pbcs.dll/article?AID=/20060529/NEWS/105290135
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Atlantic/Bermuda -4:19:04 - LMT 1930 Jan 1 2:00 # Hamilton
+Zone Atlantic/Bermuda -4:19:18 - LMT 1930 Jan 1 2:00 # Hamilton
-4:00 - AST 1974 Apr 28 2:00
-4:00 Bahamas A%sT 1976
-4:00 US A%sT
@@ -2615,6 +2626,9 @@
-5:00 - EST
# Costa Rica
+
+# Milne gives -5:36:13.3 as San Jose mean time; round to nearest.
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule CR 1979 1980 - Feb lastSun 0:00 1:00 D
Rule CR 1979 1980 - Jun Sun>=1 0:00 0 S
@@ -2625,14 +2639,19 @@
Rule CR 1992 only - Mar 15 0:00 0 S
# There are too many San Joses elsewhere, so we'll use `Costa Rica'.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose
- -5:36:20 - SJMT 1921 Jan 15 # San Jose Mean Time
+Zone America/Costa_Rica -5:36:13 - LMT 1890 # San Jose
+ -5:36:13 - SJMT 1921 Jan 15 # San Jose Mean Time
-6:00 CR C%sT
# Coco
# no information; probably like America/Costa_Rica
# Cuba
+# From Paul Eggert (2013-02-21):
+# Milne gives -5:28:50.45 for the observatory at Havana, -5:29:23.57
+# for the port, and -5:30 for meteorological observations.
+# For now, stick with Shanks & Pottenger.
+
# From Arthur David Olson (1999-03-29):
# The 1999-03-28 exhibition baseball game held in Havana, Cuba, between
# the Cuban National Team and the Baltimore Orioles was carried live on
@@ -2981,24 +3000,21 @@
# apparently using the same start and end date as USA/Canada.
# So this means they have already changed their time.
#
-# (Sources in French):
-# <a href="http://www.alterpresse.org/spip.php?article12510">
# http://www.alterpresse.org/spip.php?article12510
-# </a>
-# <a href="http://radiovision2000haiti.net/home/?p=13253">
# http://radiovision2000haiti.net/home/?p=13253
-# </a>
#
-# Our coverage:
-# <a href="http://www.timeanddate.com/news/time/haiti-dst-2012.html">
-# http://www.timeanddate.com/news/time/haiti-dst-2012.html
-# </a>
-
# From Arthur David Olson (2012-03-11):
# The alterpresse.org source seems to show a US-style leap from 2:00 a.m. to
# 3:00 a.m. rather than the traditional Haitian jump at midnight.
-# Assume a US-style fall back as well XXX.
-# Do not yet assume that the change carries forward past 2012 XXX.
+# Assume a US-style fall back as well.
+
+# From Steffen Thorsen (2013-03-10):
+# It appears that Haiti is observing DST this year as well, same rules
+# as US/Canada. They did it last year as well, and it looks like they
+# are going to observe DST every year now...
+#
+# http://radiovision2000haiti.net/public/haiti-avis-changement-dheure-dimanche/
+# http://www.canalplushaiti.net/?p=6714
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Haiti 1983 only - May 8 0:00 1:00 D
@@ -3010,8 +3026,8 @@
Rule Haiti 1988 1997 - Oct lastSun 1:00s 0 S
Rule Haiti 2005 2006 - Apr Sun>=1 0:00 1:00 D
Rule Haiti 2005 2006 - Oct lastSun 0:00 0 S
-Rule Haiti 2012 only - Mar Sun>=8 2:00 1:00 D
-Rule Haiti 2012 only - Nov Sun>=1 2:00 0 S
+Rule Haiti 2012 max - Mar Sun>=8 2:00 1:00 D
+Rule Haiti 2012 max - Nov Sun>=1 2:00 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Port-au-Prince -4:49:20 - LMT 1890
-4:49 - PPMT 1917 Jan 24 12:00 # P-a-P MT
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/southamerica
^
|
@@ -11,6 +11,10 @@
# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
# San Diego: ACS Publications, Inc. (2003).
#
+# For data circa 1899, a common source is:
+# Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94
+# <http://www.jstor.org/stable/1774359>.
+#
# Gwillim Law writes that a good source
# for recent time zone data is the International Air Transport
# Association's Standard Schedules Information Manual (IATA SSIM),
@@ -381,21 +385,11 @@
# <a/>
# is the official page for the Province Government).
#
-# There's also a note in only one of the major national papers (La Nación) at
-# <a href="http://www.lanacion.com.ar/nota.asp?nota_id=1107912">
+# There's also a note in only one of the major national papers ...
# http://www.lanacion.com.ar/nota.asp?nota_id=1107912
-# </a>
#
-# The press release says:
-# (...) anunció que el próximo domingo a las 00:00 los puntanos deberán
-# atrasar una hora sus relojes.
-#
-# A partir de entonces, San Luis establecerá el huso horario propio de
-# la Provincia. De esta manera, durante el periodo del calendario anual
-# 2009, el cambio horario quedará comprendido entre las 00:00 del tercer
-# domingo de marzo y las 24:00 del segundo sábado de octubre.
-# Quick&dirty translation
-# (...) announced that next Sunday, at 00:00, Puntanos (the San Luis
+# The press release says [quick and dirty translation]:
+# ... announced that next Sunday, at 00:00, Puntanos (the San Luis
# inhabitants) will have to turn back one hour their clocks
#
# Since then, San Luis will establish its own Province timezone. Thus,
@@ -457,6 +451,9 @@
# rules...San Luis is still using "Western ARgentina Time" and it got
# stuck on Summer daylight savings time even though the summer is over.
+# From Paul Eggert (2013-02-21):
+# Milne says Cordoba time was -4:16:48.2. Round to the nearest second.
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
#
# Buenos Aires (BA), Capital Federal (CF),
@@ -812,9 +809,9 @@
# From Guilherme Bernardes Rodrigues (2011-10-07):
# There is news in the media, however there is still no decree about it.
-# I just send a e-mail to Zulmira Brandão at
+# I just send a e-mail to Zulmira Brandao at
# <a href="http://pcdsh01.on.br/">http://pcdsh01.on.br/</a> the
-# oficial agency about time in Brazil, and she confirmed that the old rule is
+# official agency about time in Brazil, and she confirmed that the old rule is
# still in force.
# From Guilherme Bernardes Rodrigues (2011-10-14)
@@ -1243,9 +1240,13 @@
# b. Saturday, September 1, 2012, clocks should go forward 60 minutes; that is,
# at 23:59:59, instead of passing to 0:00, the time should be adjusted to be
# 01:00 on September 2.
-#
-# Note that...this is yet another "temporary" change that will be reevaluated
-# AGAIN in 2013.
+
+# From Steffen Thorsen (2013-02-15):
+# According to several news sources, Chile has extended DST this year,
+# they will end DST later and start DST earlier than planned. They
+# hope to save energy. The new end date is 2013-04-28 00:00 and new
+# start date is 2013-09-08 00:00....
+# http://www.gob.cl/informa/2013/02/15/gobierno-anuncia-fechas-de-cambio-de-hora-para-el-ano-2013.htm
# NOTE: ChileAQ rules for Antarctic bases are stored separately in the
# 'antarctica' file.
@@ -1288,10 +1289,8 @@
Rule Chile 2010 only - Apr Sun>=1 3:00u 0 -
Rule Chile 2011 only - May Sun>=2 3:00u 0 -
Rule Chile 2011 only - Aug Sun>=16 4:00u 1:00 S
-Rule Chile 2012 only - Apr Sun>=23 3:00u 0 -
-Rule Chile 2012 only - Sep Sun>=2 4:00u 1:00 S
-Rule Chile 2013 max - Mar Sun>=9 3:00u 0 -
-Rule Chile 2013 max - Oct Sun>=9 4:00u 1:00 S
+Rule Chile 2012 max - Apr Sun>=23 3:00u 0 -
+Rule Chile 2012 max - Sep Sun>=2 4:00u 1:00 S
# IATA SSIM anomalies: (1992-02) says 1992-03-14;
# (1996-09) says 1998-03-08. Ignore these.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1313,17 +1312,23 @@
# San Felix, and Antarctic bases, are like America/Santiago.
# Colombia
+
+# Milne gives 4:56:16.4 for Bogota time in 1899; round to nearest. He writes,
+# "A variation of fifteen minutes in the public clocks of Bogota is not rare."
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule CO 1992 only - May 3 0:00 1:00 S
Rule CO 1993 only - Apr 4 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Bogota -4:56:20 - LMT 1884 Mar 13
- -4:56:20 - BMT 1914 Nov 23 # Bogota Mean Time
+Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
+ -4:56:16 - BMT 1914 Nov 23 # Bogota Mean Time
-5:00 CO CO%sT # Colombia Time
# Malpelo, Providencia, San Andres
# no information; probably like America/Bogota
# Curacao
+
+# Milne gives 4:35:46.9 for Curacao mean time; round to nearest.
#
# From Paul Eggert (2006-03-22):
# Shanks & Pottenger say that The Bottom and Philipsburg have been at
@@ -1340,7 +1345,7 @@
# though, as far as we know.
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone America/Curacao -4:35:44 - LMT 1912 Feb 12 # Willemstad
+Zone America/Curacao -4:35:47 - LMT 1912 Feb 12 # Willemstad
-4:30 - ANT 1965 # Netherlands Antilles Time
-4:00 - AST
@@ -1354,6 +1359,8 @@
# Ecuador
#
+# Milne says the Sentral and South American Telegraph Company used -5:24:15.
+#
# From Paul Eggert (2007-03-04):
# Apparently Ecuador had a failed experiment with DST in 1992.
# <http://midena.gov.ec/content/view/1261/208/> (2007-02-27) and
@@ -1560,6 +1567,15 @@
# ...
Rule Para 2010 max - Oct Sun>=1 0:00 1:00 S
Rule Para 2010 max - Apr Sun>=8 0:00 0 -
+#
+# From Steffen Thorsen (2013-03-07):
+# Paraguay will end DST on 2013-03-24 00:00....
+# They do not tell if this will be a permanent change or just this year....
+# http://www.ande.gov.py/interna.php?id=1075
+#
+# From Paul Eggert (2013-03-07):
+# For now, assume it's just this year.
+Rule Para 2013 only - Mar 24 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Asuncion -3:50:40 - LMT 1890
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/data/zone.tab
^
|
@@ -159,7 +159,8 @@
CX -1025+10543 Indian/Christmas
CY +3510+03322 Asia/Nicosia
CZ +5005+01426 Europe/Prague
-DE +5230+01322 Europe/Berlin
+DE +5230+01322 Europe/Berlin most locations
+DE +4742+00841 Europe/Busingen Busingen
DJ +1136+04309 Africa/Djibouti
DK +5540+01235 Europe/Copenhagen
DM +1518-06124 America/Dominica
@@ -341,8 +342,10 @@
RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River
RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal
RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River
+RU +623923+1353314 Asia/Khandyga Moscow+06 - Tomponsky, Ust-Maysky
RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River
RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island
+RU +643337+1431336 Asia/Ust-Nera Moscow+07 - Oymyakonsky
RU +5934+15048 Asia/Magadan Moscow+08 - Magadan
RU +5301+15839 Asia/Kamchatka Moscow+08 - Kamchatka
RU +6445+17729 Asia/Anadyr Moscow+08 - Bering Sea
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Africa.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Africa.txt,v 1.2.6.1 2009/09/06 15:25:31 tgl Exp $
+# src/timezone/tznames/Africa.txt
#
CAT 7200 # Central Africa Time
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/America.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/America.txt,v 1.4 2008/03/02 00:10:22 tgl Exp $
+# src/timezone/tznames/America.txt
#
# Acre time is sometimes called Acre Standard Time (AST) which leads to a
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Antarctica.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Antarctica.txt,v 1.2 2006/07/25 13:49:21 tgl Exp $
+# src/timezone/tznames/Antarctica.txt
#
CLST -10800 D # Chile Summer Time
@@ -17,8 +17,10 @@
# (Antarctica/Davis)
DDUT 36000 # Dumont-d`Urville Time (Antarctica)
# (Antarctica/DumontDUrville)
-MAWT 21600 # Mawson Time (Antarctica)
+MAWT 18000 # Mawson Time (Antarctica) (caution: this used to mean 21600)
# (Antarctica/Mawson)
+MIST 39600 # Macquarie Island Time
+ # (Antarctica/Macquarie)
NZDT 46800 D # New Zealand Daylight Time
# (Antarctica/McMurdo)
# (Pacific/Auckland)
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Asia.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Asia.txt,v 1.3.4.2 2010/05/11 22:36:58 tgl Exp $
+# src/timezone/tznames/Asia.txt
#
# CONFLICT! ADT is not unique
@@ -63,9 +63,9 @@
BTT 21600 # Bhutan Time
# (Asia/Thimphu)
CCT 28800 # China Coastal Time (not in zic)
-CHOST 36000 D # Choibalsan Summer Time
+CHOST 36000 D # Choibalsan Summer Time (obsolete)
# (Asia/Choibalsan)
-CHOT 32400 # Choibalsan Time
+CHOT 28800 # Choibalsan Time (caution: this used to mean 32400)
# (Asia/Choibalsan)
CIT 28800 # Central Indonesia Time
# (Asia/Makassar)
@@ -118,9 +118,9 @@
# (Europe/Zaporozhye)
EIT 32400 # East Indonesia Time
# (Asia/Jayapura)
-GEST 14400 D # Georgia Summer Time (there was a timezone change in 2004)
+GEST 14400 D # Georgia Summer Time (obsolete)
# (Asia/Tbilisi)
-GET 10800 # Georgia Time (there was a timezone change in 2004)
+GET 14400 # Georgia Time (caution: this used to mean 10800)
# (Asia/Tbilisi)
# CONFLICT! GST is not unique
# Other timezones:
@@ -141,9 +141,9 @@
IDT 10800 D # Israel Daylight Time
IRDT 16200 D # Iran Daylight Time
# (Asia/Tehran)
-IRKST 32400 D # Irkutsk Summer Time
+IRKST 32400 D # Irkutsk Summer Time (obsolete)
# (Asia/Irkutsk)
-IRKT 28800 # Irkutsk Time
+IRKT 32400 # Irkutsk Time (caution: this used to mean 28800)
# (Asia/Irkutsk)
IRST 12600 # Iran Standard Time
# (Asia/Tehran)
@@ -163,36 +163,36 @@
JST 32400 # Japan Standard Time
# (Asia/Tokyo)
KDT 36000 D # Korean Daylight Time (not in zic)
-KGST 21600 D # Kyrgyzstan Summer Time
+KGST 21600 D # Kyrgyzstan Summer Time (obsolete)
# (Asia/Bishkek)
-KGT 18000 # Kyrgyzstan Time
+KGT 21600 # Kyrgyzstan Time (caution: this used to mean 18000)
# (Asia/Bishkek)
-KRAST 28800 D # Krasnoyarsk Summer Time
+KRAST 28800 D # Krasnoyarsk Summer Time (obsolete)
# (Asia/Krasnoyarsk)
-KRAT 25200 # Krasnoyarsk Time
+KRAT 28800 # Krasnoyarsk Time (caution: this used to mean 25200)
# (Asia/Krasnoyarsk)
KST 32400 # Korean Standard Time
# (Asia/Pyongyang)
LKT 21600 # Lanka Time
# (Asia/Colombo)
-MAGST 43200 D # Magadan Summer Time
+MAGST 43200 D # Magadan Summer Time (obsolete)
# (Asia/Magadan)
-MAGT 39600 # Magadan Time
+MAGT 43200 # Magadan Time (caution: this used to mean 39600)
# (Asia/Magadan)
MMT 23400 # Myanmar Time
# (Asia/Rangoon)
MYT 28800 # Malaysia Time
# (Asia/Kuala_Lumpur)
# (Asia/Kuching)
-NOVST 25200 D # Novosibirsk Summer Time
+NOVST 25200 D # Novosibirsk Summer Time (obsolete)
# (Asia/Novosibirsk)
-NOVT 21600 # Novosibirsk Time
+NOVT 25200 # Novosibirsk Time (caution: this used to mean 21600)
# (Asia/Novosibirsk)
NPT 20700 # Nepal Time
# (Asia/Katmandu)
-OMSST 25200 D # Omsk Summer Time
+OMSST 25200 D # Omsk Summer Time (obsolete)
# (Asia/Omsk)
-OMST 21600 # Omsk Time
+OMST 25200 # Omsk Time (caution: this used to mean 21600)
# (Asia/Omsk)
ORAT 18000 # Oral Time
# (Asia/Oral)
@@ -200,7 +200,7 @@
# (Asia/Kamchatka)
PETT 43200 # Petropavlovsk-Kamchatski Time
# (Asia/Kamchatka)
-PHT 28800 # Phillipine Time (not in zic)
+PHT 28800 # Philippine Time (not in zic)
PKT 18000 # Pakistan Time
# (Asia/Karachi)
PKST 21600 D # Pakistan Summer Time
@@ -229,19 +229,19 @@
UZT 18000 # Uzbekistan Time
# (Asia/Samarkand)
# (Asia/Tashkent)
-VLAST 39600 D # Vladivostok Summer Time
+VLAST 39600 D # Vladivostok Summer Time (obsolete)
# (Asia/Vladivostok)
-VLAT 36000 # Vladivostok Time
+VLAT 39600 # Vladivostok Time (caution: this used to mean 36000)
# (Asia/Vladivostok)
WIT 25200 # Waktu Indonesia Timur
# West Indonesia Time
# (Asia/Jakarta)
# (Asia/Pontianak)
-YAKST 36000 D # Yakutsk Summer Time
+YAKST 36000 D # Yakutsk Summer Time (obsolete)
# (Asia/Yakutsk)
-YAKT 32400 # Yakutsk Time
+YAKT 36000 # Yakutsk Time (caution: this used to mean 32400)
# (Asia/Yakutsk)
-YEKST 21600 D # Yekaterinburg Summer Time
+YEKST 21600 D # Yekaterinburg Summer Time (obsolete)
# (Asia/Yekaterinburg)
-YEKT 18000 # Yekaterinburg Time
+YEKT 21600 # Yekaterinburg Time (caution: this used to mean 18000)
# (Asia/Yekaterinburg)
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Atlantic.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Atlantic.txt,v 1.2 2006/07/25 13:49:21 tgl Exp $
+# src/timezone/tznames/Atlantic.txt
#
# CONFLICT! ADT is not unique
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Australia
^
|
@@ -4,7 +4,7 @@
# timezone_abbreviations to 'Australia'. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Australia,v 1.2 2006/07/25 13:49:21 tgl Exp $
+# src/timezone/tznames/Australia
# include the default set
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Australia.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Australia.txt,v 1.2.6.1 2009/09/06 15:25:31 tgl Exp $
+# src/timezone/tznames/Australia.txt
#
ACSST 37800 D # Central Australia (not in zic)
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Default
^
|
@@ -4,7 +4,7 @@
# timezone_abbreviations to 'Default'. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Default,v 1.7.2.3 2010/08/26 19:59:00 tgl Exp $
+# src/timezone/tznames/Default
#################### AFRICA ####################
@@ -239,7 +239,7 @@
# (Antarctica/DumontDUrville)
# (Antarctica/Palmer)
# (America/Santiago)
-MAWT 21600 # Mawson Time (Antarctica)
+MAWT 18000 # Mawson Time (Antarctica) (caution: this used to mean 21600)
# (Antarctica/Mawson)
#################### ASIA ####################
@@ -273,9 +273,9 @@
BTT 21600 # Bhutan Time
# (Asia/Thimphu)
CCT 28800 # China Coastal Time (not in zic)
-GEST 14400 D # Georgia Summer Time (there was a timezone change in 2004)
+GEST 14400 D # Georgia Summer Time (obsolete)
# (Asia/Tbilisi)
-GET 10800 # Georgia Time (there was a timezone change in 2004)
+GET 14400 # Georgia Time (caution: this used to mean 10800)
# (Asia/Tbilisi)
HKT 28800 # Hong Kong Time (not in zic)
ICT 25200 # Indochina Time
@@ -284,9 +284,9 @@
# (Asia/Saigon)
# (Asia/Vientiane)
IDT 10800 D # Israel Daylight Time
-IRKST 32400 D # Irkutsk Summer Time
+IRKST 32400 D # Irkutsk Summer Time (obsolete)
# (Asia/Irkutsk)
-IRKT 28800 # Irkutsk Time
+IRKT 32400 # Irkutsk Time (caution: this used to mean 28800)
# (Asia/Irkutsk)
IRT 12600 # Iran Time (not in zic)
# CONFLICT! IST is not unique
@@ -298,42 +298,42 @@
JST 32400 # Japan Standard Time
# (Asia/Tokyo)
KDT 36000 D # Korean Daylight Time (not in zic)
-KGST 21600 D # Kyrgyzstan Summer Time
+KGST 21600 D # Kyrgyzstan Summer Time (obsolete)
# (Asia/Bishkek)
-KGT 18000 # Kyrgyzstan Time
+KGT 21600 # Kyrgyzstan Time (caution: this used to mean 18000)
# (Asia/Bishkek)
-KRAST 28800 D # Krasnoyarsk Summer Time
+KRAST 28800 D # Krasnoyarsk Summer Time (obsolete)
# (Asia/Krasnoyarsk)
-KRAT 25200 # Krasnoyarsk Time
+KRAT 28800 # Krasnoyarsk Time (caution: this used to mean 25200)
# (Asia/Krasnoyarsk)
KST 32400 # Korean Standard Time
# (Asia/Pyongyang)
LKT 21600 # Lanka Time
# (Asia/Colombo)
-MAGST 43200 D # Magadan Summer Time
+MAGST 43200 D # Magadan Summer Time (obsolete)
# (Asia/Magadan)
-MAGT 39600 # Magadan Time
+MAGT 43200 # Magadan Time (caution: this used to mean 39600)
# (Asia/Magadan)
MMT 23400 # Myanmar Time
# (Asia/Rangoon)
MYT 28800 # Malaysia Time
# (Asia/Kuala_Lumpur)
# (Asia/Kuching)
-NOVST 25200 D # Novosibirsk Summer Time
+NOVST 25200 D # Novosibirsk Summer Time (obsolete)
# (Asia/Novosibirsk)
-NOVT 21600 # Novosibirsk Time
+NOVT 25200 # Novosibirsk Time (caution: this used to mean 21600)
# (Asia/Novosibirsk)
NPT 20700 # Nepal Time
# (Asia/Katmandu)
-OMSST 25200 D # Omsk Summer Time
+OMSST 25200 D # Omsk Summer Time (obsolete)
# (Asia/Omsk)
-OMST 21600 # Omsk Time
+OMST 25200 # Omsk Time (caution: this used to mean 21600)
# (Asia/Omsk)
PETST 46800 D # Petropavlovsk-Kamchatski Summer Time
# (Asia/Kamchatka)
PETT 43200 # Petropavlovsk-Kamchatski Time
# (Asia/Kamchatka)
-PHT 28800 # Phillipine Time (not in zic)
+PHT 28800 # Philippine Time (not in zic)
PKT 18000 # Pakistan Time
# (Asia/Karachi)
PKST 21600 D # Pakistan Summer Time
@@ -354,17 +354,17 @@
UZT 18000 # Uzbekistan Time
# (Asia/Samarkand)
# (Asia/Tashkent)
-VLAST 39600 D # Vladivostok Summer Time
+VLAST 39600 D # Vladivostok Summer Time (obsolete)
# (Asia/Vladivostok)
-VLAT 36000 # Vladivostok Time
+VLAT 39600 # Vladivostok Time (caution: this used to mean 36000)
# (Asia/Vladivostok)
-YAKST 36000 D # Yakutsk Summer Time
+YAKST 36000 D # Yakutsk Summer Time (obsolete)
# (Asia/Yakutsk)
-YAKT 32400 # Yakutsk Time
+YAKT 36000 # Yakutsk Time (caution: this used to mean 32400)
# (Asia/Yakutsk)
-YEKST 21600 D # Yekaterinburg Summer Time
+YEKST 21600 D # Yekaterinburg Summer Time (obsolete)
# (Asia/Yekaterinburg)
-YEKT 18000 # Yekaterinburg Time
+YEKT 21600 # Yekaterinburg Time (caution: this used to mean 18000)
# (Asia/Yekaterinburg)
#################### ATLANTIC ####################
@@ -622,10 +622,12 @@
MET 3600 # Middle Europe Time (not in zic)
METDST 7200 D # Middle Europe Summer Time (not in zic)
MEZ 3600 # Mitteleuropaeische Zeit (German) (not in zic)
-MSD 14400 D # Moscow Daylight Time
+MSD 14400 D # Moscow Daylight Time (obsolete)
# (Europe/Moscow)
-MSK 10800 # Moscow Time
+MSK 14400 # Moscow Time (caution: this used to mean 10800)
# (Europe/Moscow)
+VOLT 14400 # Volgograd Time
+ # (Europe/Volgograd)
WET 0 # Western Europe Time
# (Africa/Casablanca)
# (Africa/El_Aaiun)
@@ -714,7 +716,7 @@
# (Pacific/Palau)
TAHT -36000 # Tahiti Time (zic says "TAHT", other sources "THAT")
# (Pacific/Tahiti)
-TKT -36000 # Tokelau Time
+TKT 46800 # Tokelau Time (caution: this used to mean -36000)
# (Pacific/Fakaofo)
TOT 46800 # Tonga Time (not in zic)
TRUT 36000 # Truk Time (zic used to say "TRUT", other sources say "TRUK")
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Etc.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Etc.txt,v 1.2 2006/07/25 13:49:21 tgl Exp $
+# src/timezone/tznames/Etc.txt
#
GMT 0 # Greenwich Mean Time
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Europe.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Europe.txt,v 1.2.6.1 2009/09/06 15:25:31 tgl Exp $
+# src/timezone/tznames/Europe.txt
#
BST 3600 D # British Summer Time
@@ -185,14 +185,16 @@
MET 3600 # Middle Europe Time (not in zic)
METDST 7200 D # Middle Europe Summer Time (not in zic)
MEZ 3600 # Mitteleuropäische Zeit (German) (not in zic)
-MSD 14400 D # Moscow Daylight Time
+MSD 14400 D # Moscow Daylight Time (obsolete)
# (Europe/Moscow)
-MSK 10800 # Moscow Time
+MSK 14400 # Moscow Time (caution: this used to mean 10800)
# (Europe/Moscow)
-SAMST 18000 D # Samara Summer Time
+SAMST 18000 D # Samara Summer Time (obsolete)
# (Europe/Samara)
SAMT 14400 # Samara Time
# (Europe/Samara)
+VOLT 14400 # Volgograd Time
+ # (Europe/Volgograd)
WEST 3600 D # Western Europe Summer Time
# (Africa/Casablanca)
# (Atlantic/Canary)
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/India
^
|
@@ -4,7 +4,7 @@
# timezone_abbreviations to 'India'. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/India,v 1.2 2006/07/25 13:49:21 tgl Exp $
+# src/timezone/tznames/India
# include the default set
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Indian.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Indian.txt,v 1.3 2009/03/05 14:27:50 heikki Exp $
+# src/timezone/tznames/Indian.txt
#
CCT 23400 # Cocos Islands Time (Indian Ocean)
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/Pacific.txt
^
|
@@ -4,7 +4,7 @@
# a template for timezones you could need. See the `Date/Time Support'
# appendix in the PostgreSQL documentation for more information.
#
-# $PostgreSQL: pgsql/src/timezone/tznames/Pacific.txt,v 1.2.6.1 2010/08/26 19:59:00 tgl Exp $
+# src/timezone/tznames/Pacific.txt
#
CHADT 49500 D # Chatham Daylight Time (New Zealand)
@@ -83,7 +83,7 @@
# (Pacific/Pago_Pago)
TAHT -36000 # Tahiti Time (zic says "TAHT", other sources "THAT")
# (Pacific/Tahiti)
-TKT -36000 # Tokelau Time
+TKT 46800 # Tokelau Time (caution: this used to mean -36000)
# (Pacific/Fakaofo)
TOT 46800 # Tonga Time (not in zic)
TRUT 36000 # Truk Time (zic used to say "TRUT", other sources say "TRUK")
@@ -98,6 +98,8 @@
# CONFLICT! WST is not unique
# Other timezones:
# - WST: Western Standard Time (Australia)
-WST -39600 # West Samoa Time
+WSDT 50400 D # West Samoa Daylight Time
+ # (Pacific/Apia)
+WST 46800 # West Samoa Time (caution: this used to mean -39600)
# (Pacific/Apia)
YAPT 36000 # Yap Time (Micronesia) (not in zic)
|
[-]
[+]
|
Changed |
postgresql-8.4.17.tar.bz2/src/timezone/tznames/README
^
|
@@ -1,4 +1,4 @@
-$PostgreSQL: pgsql/src/timezone/tznames/README,v 1.3.2.1 2009/09/06 15:25:31 tgl Exp $
+src/timezone/tznames/README
tznames
=======
|