WIP: SP-GiST, Space-Partitioned GiST
Hi there,
attached is our WIP-patch for 9.2 development source tree, which provides
implementation of SP-GiST (prototype was presented at PGCon-2011, see
http://www.pgcon.org/2011/schedule/events/309.en.html and presentation
for details) as a core feature. Main differences from prototype version:
1. Now it's part of pg core, not contrib module
2. It provides more operations for quadtree and suffix tree
3. It uses clustering algorithm of nodes on disk and has much better
utilization of disk space. Fillfactor is supported
4. Some corner cases were eliminated
5. It provides support for concurency and recovery (inserts are
logged, supports for deletes, and log replay will be added really
soon)
So, now code contains almost all possible overhead of production code
and we ask hackers to test performance on real data sets. We expect
the same performance for random data (since almost no overlaps) and
much better performance on real-life data, plus much better index
creation time. Also, we appreciate your comments and suggestions about
API.
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
This is updates SP-GiST patch, which fixed one bug and
replaced test to the locale independent one.
On Wed, 31 Aug 2011, Oleg Bartunov wrote:
Hi there,
attached is our WIP-patch for 9.2 development source tree, which provides
implementation of SP-GiST (prototype was presented at PGCon-2011, see
http://www.pgcon.org/2011/schedule/events/309.en.html and presentation
for details) as a core feature. Main differences from prototype version:1. Now it's part of pg core, not contrib module
2. It provides more operations for quadtree and suffix tree
3. It uses clustering algorithm of nodes on disk and has much better
utilization of disk space. Fillfactor is supported
4. Some corner cases were eliminated
5. It provides support for concurency and recovery (inserts are
logged, supports for deletes, and log replay will be added really
soon)So, now code contains almost all possible overhead of production code
and we ask hackers to test performance on real data sets. We expect
the same performance for random data (since almost no overlaps) and
much better performance on real-life data, plus much better index
creation time. Also, we appreciate your comments and suggestions about
API.Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
Attached is updated SP-GiST patch, which provides full logging support and
fixed several bugs (Thanks ALexander Korotkov for help).
Regards,
Oleg
On Thu, 1 Sep 2011, Oleg Bartunov wrote:
This is updates SP-GiST patch, which fixed one bug and replaced test to the
locale independent one.On Wed, 31 Aug 2011, Oleg Bartunov wrote:
Hi there,
attached is our WIP-patch for 9.2 development source tree, which provides
implementation of SP-GiST (prototype was presented at PGCon-2011, see
http://www.pgcon.org/2011/schedule/events/309.en.html and presentation
for details) as a core feature. Main differences from prototype version:1. Now it's part of pg core, not contrib module
2. It provides more operations for quadtree and suffix tree
3. It uses clustering algorithm of nodes on disk and has much better
utilization of disk space. Fillfactor is supported
4. Some corner cases were eliminated
5. It provides support for concurency and recovery (inserts are
logged, supports for deletes, and log replay will be added really
soon)So, now code contains almost all possible overhead of production code
and we ask hackers to test performance on real data sets. We expect
the same performance for random data (since almost no overlaps) and
much better performance on real-life data, plus much better index
creation time. Also, we appreciate your comments and suggestions about
API.Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
I attached wrong patch in previous message, sorry ! Here is a last version.
This is a new WIP of SP-GiST patch, which provides support for:
1. Concurrent vacuum
2. Vacuum logging
3. WAL replay
Oleg
On Thu, 1 Sep 2011, Oleg Bartunov wrote:
This is updates SP-GiST patch, which fixed one bug and replaced test to the
locale independent one.On Wed, 31 Aug 2011, Oleg Bartunov wrote:
Hi there,
attached is our WIP-patch for 9.2 development source tree, which provides
implementation of SP-GiST (prototype was presented at PGCon-2011, see
http://www.pgcon.org/2011/schedule/events/309.en.html and presentation
for details) as a core feature. Main differences from prototype version:1. Now it's part of pg core, not contrib module
2. It provides more operations for quadtree and suffix tree
3. It uses clustering algorithm of nodes on disk and has much better
utilization of disk space. Fillfactor is supported
4. Some corner cases were eliminated
5. It provides support for concurency and recovery (inserts are
logged, supports for deletes, and log replay will be added really
soon)So, now code contains almost all possible overhead of production code
and we ask hackers to test performance on real data sets. We expect
the same performance for random data (since almost no overlaps) and
much better performance on real-life data, plus much better index
creation time. Also, we appreciate your comments and suggestions about
API.Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
Here is the latest spgist patch, which has all planned features as well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.
Oleg
On Mon, 5 Sep 2011, Oleg Bartunov wrote:
I attached wrong patch in previous message, sorry ! Here is a last version.
This is a new WIP of SP-GiST patch, which provides support for:
1. Concurrent vacuum
2. Vacuum logging
3. WAL replayOleg
On Thu, 1 Sep 2011, Oleg Bartunov wrote:This is updates SP-GiST patch, which fixed one bug and replaced test to the
locale independent one.On Wed, 31 Aug 2011, Oleg Bartunov wrote:
Hi there,
attached is our WIP-patch for 9.2 development source tree, which provides
implementation of SP-GiST (prototype was presented at PGCon-2011, see
http://www.pgcon.org/2011/schedule/events/309.en.html and presentation
for details) as a core feature. Main differences from prototype version:1. Now it's part of pg core, not contrib module
2. It provides more operations for quadtree and suffix tree
3. It uses clustering algorithm of nodes on disk and has much better
utilization of disk space. Fillfactor is supported
4. Some corner cases were eliminated
5. It provides support for concurency and recovery (inserts are
logged, supports for deletes, and log replay will be added really
soon)So, now code contains almost all possible overhead of production code
and we ask hackers to test performance on real data sets. We expect
the same performance for random data (since almost no overlaps) and
much better performance on real-life data, plus much better index
creation time. Also, we appreciate your comments and suggestions about
API.Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
On 09/06/2011 07:34 PM, Oleg Bartunov wrote:
Here is the latest spgist patch, which has all planned features as
well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.Oleg
Sorry for not getting the might-be-obvious here, but will this patch
bring indexed substring-search to PG? So queries conceptually equal to
this will be possible to index: WHERE som_col @@
':substr1:&:substr2!substr3:' meaning "contains substr1" AND "ends with
substr2" OR "starts with substr3"?
--
Andreas Joseph Krogh <andreak@officenet.no> - mob: +47 909 56 963
Senior Software Developer / CTO - OfficeNet AS - http://www.officenet.no
Public key: http://home.officenet.no/~andreak/public_key.asc
On Tue, Sep 6, 2011 at 10:21 PM, Andreas Joseph Krogh
<andreak@officenet.no>wrote:
Sorry for not getting the might-be-obvious here, but will this patch
bring indexed substring-search to PG? So queries conceptually equal to
this will be possible to index: WHERE som_col @@
':substr1:&:substr2!substr3:' meaning "contains substr1" AND "ends with
substr2" OR "starts with substr3"?
Such applications are potentionally possible, but aren't presented yet.
Currently only k-d-tree and suffix-tree are presented. Suffix-tree supports
prefix search like btree with *_pattern_ops. (Oleg will corect me if I'm
missing something)
For the queries you mentioned you may see LIKE acceleration in wildspeed
module (http://www.sai.msu.su/~megera/wiki/wildspeed) and pg_trgm of 9.1 (
http://www.postgresql.org/docs/9.1/static/pgtrgm.html).
------
With best regards,
Alexander Korotkov.
On 05.09.2011 09:39, Oleg Bartunov wrote:
I attached wrong patch in previous message, sorry ! Here is a last version.
One little detail caught my eye: In spgSplitNodeAction, you call
SpGistGetBuffer() within a critical section. That should be avoided,
SpGistGetBuffer() can easily fail if you e.g run out of disk space.
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
On 06.09.2011 20:34, Oleg Bartunov wrote:
Here is the latest spgist patch, which has all planned features as well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.
I'm ignoring the text suffix-tree part of this for now, because of the
issue with non-C locales that Alexander pointer out.
Regarding the quadtree, have you compared the performance of that with
Alexander's improved split algorithm? I ran some tests using the test
harness I still had lying around from the fast GiST index build tests:
testname | time | accesses | indexsize
-------------------------+-----------------+----------+-----------
points unordered auto | 00:03:58.188866 | 378779 | 522 MB
points ordered auto | 00:07:14.362355 | 177534 | 670 MB
points unordered auto | 00:02:59.130176 | 46561 | 532 MB
points ordered auto | 00:04:00.50756 | 45066 | 662 MB
points unordered spgist | 00:03:05.569259 | 78871 | 394 MB
points ordered spgist | 00:01:46.06855 | 422104 | 417 MB
(8 rows)
These tests were with a table with 7500000 random points. In the
ordered-tests, the table is sorted by x,y coordinates. 'time' is the
time used to build the index on it, and 'accesses' is the total number
of index blocks hit by a series of 10000 bounding box queries, measured
from pg_statio_user_indexes.idx_blks_hit + idx_blks_read.
The first two tests in the list are with a GiST index on unpatched
PostgreSQL. The next six tests are with Alexander's double-sorting split
patch. The last two tests are with an SP-GiST index.
It looks like the query performance with GiST using the double-sorting
split is better than SP-GiST, although the SP-GiST index is somewhat
smaller. The ordered case seems pathologically bad, is that some sort of
a worst-case scenario for quadtrees?
--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com
On Thu, Sep 22, 2011 at 2:05 PM, Heikki Linnakangas <
heikki.linnakangas@enterprisedb.com> wrote:
Regarding the quadtree, have you compared the performance of that with
Alexander's improved split algorithm? I ran some tests using the test
harness I still had lying around from the fast GiST index build tests:testname | time | accesses | indexsize
-------------------------+----**-------------+----------+-----**------
points unordered auto | 00:03:58.188866 | 378779 | 522 MB
points ordered auto | 00:07:14.362355 | 177534 | 670 MB
points unordered auto | 00:02:59.130176 | 46561 | 532 MB
points ordered auto | 00:04:00.50756 | 45066 | 662 MB
points unordered spgist | 00:03:05.569259 | 78871 | 394 MB
points ordered spgist | 00:01:46.06855 | 422104 | 417 MB
(8 rows)
I assume first two rows to be produced by new linear split
algorithm(current) and secound two rows by double sorting split algorithm(my
patch).
These tests were with a table with 7500000 random points. In the
ordered-tests, the table is sorted by x,y coordinates. 'time' is the time
used to build the index on it, and 'accesses' is the total number of index
blocks hit by a series of 10000 bounding box queries, measured from
pg_statio_user_indexes.idx_**blks_hit + idx_blks_read.The first two tests in the list are with a GiST index on unpatched
PostgreSQL. The next six tests are with Alexander's double-sorting split
patch. The last two tests are with an SP-GiST index.It looks like the query performance with GiST using the double-sorting
split is better than SP-GiST, although the SP-GiST index is somewhat
smaller. The ordered case seems pathologically bad, is that some sort of a
worst-case scenario for quadtrees?
Comparison of search speed using number of page accesses is
quite comprehensive for various GiST indexes. But when we're
comparing SP-GiST vs GiST we should take into accoung that they have
different CPU/IO ratio. GiST scans whole page which it accesses. SP-GiST can
scan only fraction of page because several nodes can be packed into single
page. Thereby it would be interesting to compare also CPU load GiST
vs. SP-GiST. Also, there is some hope to reduce number of page accesses in
SP-GiST by improving clustering algorithm.
------
With best regards,
Alexander Korotkov.
On Thu, 22 Sep 2011, Heikki Linnakangas wrote:
On 06.09.2011 20:34, Oleg Bartunov wrote:
Here is the latest spgist patch, which has all planned features as well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.I'm ignoring the text suffix-tree part of this for now, because of the issue
with non-C locales that Alexander pointer out.Regarding the quadtree, have you compared the performance of that with
Alexander's improved split algorithm? I ran some tests using the test harness
I still had lying around from the fast GiST index build tests:testname | time | accesses | indexsize
-------------------------+-----------------+----------+-----------
points unordered auto | 00:03:58.188866 | 378779 | 522 MB
points ordered auto | 00:07:14.362355 | 177534 | 670 MB
points unordered auto | 00:02:59.130176 | 46561 | 532 MB
points ordered auto | 00:04:00.50756 | 45066 | 662 MB
points unordered spgist | 00:03:05.569259 | 78871 | 394 MB
points ordered spgist | 00:01:46.06855 | 422104 | 417 MB
(8 rows)These tests were with a table with 7500000 random points. In the
ordered-tests, the table is sorted by x,y coordinates. 'time' is the time
used to build the index on it, and 'accesses' is the total number of index
blocks hit by a series of 10000 bounding box queries, measured from
pg_statio_user_indexes.idx_blks_hit + idx_blks_read.The first two tests in the list are with a GiST index on unpatched
PostgreSQL. The next six tests are with Alexander's double-sorting split
patch. The last two tests are with an SP-GiST index.It looks like the query performance with GiST using the double-sorting split
is better than SP-GiST, although the SP-GiST index is somewhat smaller. The
ordered case seems pathologically bad, is that some sort of a worst-case
scenario for quadtrees?
random points are not good use-case, on real data sp-gist is much faster
than GiST. I attached the latest version of patch, which descrease wal-traffic
and introduce kd-tree example.
real-life example from geonames database can be downloaded from
http://mira.sai.msu.su/~megera/geo-all.dump.gz
Below is a log of test run on my notebook:
zcat /home/megera/app/pgsql/knn/geo-all.dump.gz | psql test
create index spg_kd_idx on geo using spgist(point kd_point_ops);
CREATE INDEX
Time: 97180.047 ms
test=# select pg_total_relation_size('spg_quad_idx');
pg_total_relation_size
------------------------
363126784
test=# create index spg_quad_idx on geo using spgist(point);
LOG: checkpoints are occurring too frequently (22 seconds apart)
HINT: Consider increasing the configuration parameter "checkpoint_segments".
LOG: checkpoints are occurring too frequently (19 seconds apart)
HINT: Consider increasing the configuration parameter "checkpoint_segments".
LOG: checkpoints are occurring too frequently (20 seconds apart)
HINT: Consider increasing the configuration parameter "checkpoint_segments".
CREATE INDEX
Time: 68565.279 ms
test=# select pg_total_relation_size('spg_quad_idx');
pg_total_relation_size
------------------------
363126784
test=# create index gist_idx on geo using gist(point);
CREATE INDEX
Time: 354446.965 ms
test=# select pg_total_relation_size('gist_idx');
pg_total_relation_size
------------------------
542793728
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:
On 06.09.2011 20:34, Oleg Bartunov wrote:
Here is the latest spgist patch, which has all planned features as well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.
I'm ignoring the text suffix-tree part of this for now, because of the
issue with non-C locales that Alexander pointer out.
It seems to me that SP-GiST simply cannot work for full text comparisons
in non-C locales, because it's critically dependent on the assumption
that comparisons of strings are consistent with comparisons of prefixes
of those strings ... an assumption that's just plain false for most
non-C locales.
We can dodge that problem in the same way that we did in the btree
pattern_ops opclasses, namely implement the opclass only for the =
operator and the special operators ~<~ etc. I think I favor doing this
for the first round, because it's a simple matter of removing code
that's currently present in the patch. Even with only = support
the opclass would be extremely useful.
Something we could consider later is a way to use the index for the
regular text comparison operators (< etc), but only when the operator
is using C collation. This is not so much a matter for the index
implementation as it is about teaching the planner to optionally
consider collation when matching an operator call to the index. It's
probably going to tie into the unfinished business of marking which
operators are collation sensitive and which are not.
In other news, I looked at the patch briefly, but I don't think I want
to review it fully without some documentation. The absolute minimum
requirement IMO is documentation comparable to what we have for GIN,
ie a specification for the support methods and some indication of when
you'd use this index type in preference to others. I'd be willing to
help copy-edit and SGML-ize such documentation, but I do not care to
reverse-engineer it from the code.
regards, tom lane
We are working on the hackers documentation, hope to submit it before my
himalaya track.
Oleg
On Sun, 2 Oct 2011, Tom Lane wrote:
Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:
On 06.09.2011 20:34, Oleg Bartunov wrote:
Here is the latest spgist patch, which has all planned features as well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.I'm ignoring the text suffix-tree part of this for now, because of the
issue with non-C locales that Alexander pointer out.It seems to me that SP-GiST simply cannot work for full text comparisons
in non-C locales, because it's critically dependent on the assumption
that comparisons of strings are consistent with comparisons of prefixes
of those strings ... an assumption that's just plain false for most
non-C locales.We can dodge that problem in the same way that we did in the btree
pattern_ops opclasses, namely implement the opclass only for the =
operator and the special operators ~<~ etc. I think I favor doing this
for the first round, because it's a simple matter of removing code
that's currently present in the patch. Even with only = support
the opclass would be extremely useful.Something we could consider later is a way to use the index for the
regular text comparison operators (< etc), but only when the operator
is using C collation. This is not so much a matter for the index
implementation as it is about teaching the planner to optionally
consider collation when matching an operator call to the index. It's
probably going to tie into the unfinished business of marking which
operators are collation sensitive and which are not.In other news, I looked at the patch briefly, but I don't think I want
to review it fully without some documentation. The absolute minimum
requirement IMO is documentation comparable to what we have for GIN,
ie a specification for the support methods and some indication of when
you'd use this index type in preference to others. I'd be willing to
help copy-edit and SGML-ize such documentation, but I do not care to
reverse-engineer it from the code.regards, tom lane
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Hi there,
attached is the latest version of patch (v.110) for current 9.2. Now it
includes README and spgist.sgml.
There is one annoying problem under MAC OS (Linux, FreeBSD have no problem), we
just can't figure out how to find it, since we are not familiar with MAC OS -
it fails to restart after 'kill -9' backend, but only if sources were
compiled with -O2 option (no problem occured with -O0). Since the fail happens
not every time, we use following script to reproduce the problem. We ask
MAC OS guru to help us debugging this problem.
============================================================================
#!/bin/sh
# enable core file dumping by a system
ulimit -c unlimited
# create test data
createdb test
psql test -c 'drop table if exists qq;
create table qq as select point( p.lat, p.long) as p
from (
select (0.5-random())*180 as lat, random()*360 as long
from generate_series(1,10000000)
) as p;
'
while :
do
psql test -c 'create index spgist_idx on qq using spgist(p)' & sleep 20
kill -9 `ps ax | grep postgres: | grep -v grep | awk '{print $1}' | xargs`
rc=$?
if [ $rc -gt 0 ]
then
echo Something is going wrong (rc=$rc) ...
break
fi
sleep 10
done
Regads,
Oleg
On Sun, 2 Oct 2011, Tom Lane wrote:
Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> writes:
On 06.09.2011 20:34, Oleg Bartunov wrote:
Here is the latest spgist patch, which has all planned features as well as
all overhead, introduced by concurrency and recovery, so performance
measurement should be realistic now.I'm ignoring the text suffix-tree part of this for now, because of the
issue with non-C locales that Alexander pointer out.It seems to me that SP-GiST simply cannot work for full text comparisons
in non-C locales, because it's critically dependent on the assumption
that comparisons of strings are consistent with comparisons of prefixes
of those strings ... an assumption that's just plain false for most
non-C locales.We can dodge that problem in the same way that we did in the btree
pattern_ops opclasses, namely implement the opclass only for the =
operator and the special operators ~<~ etc. I think I favor doing this
for the first round, because it's a simple matter of removing code
that's currently present in the patch. Even with only = support
the opclass would be extremely useful.Something we could consider later is a way to use the index for the
regular text comparison operators (< etc), but only when the operator
is using C collation. This is not so much a matter for the index
implementation as it is about teaching the planner to optionally
consider collation when matching an operator call to the index. It's
probably going to tie into the unfinished business of marking which
operators are collation sensitive and which are not.In other news, I looked at the patch briefly, but I don't think I want
to review it fully without some documentation. The absolute minimum
requirement IMO is documentation comparable to what we have for GIN,
ie a specification for the support methods and some indication of when
you'd use this index type in preference to others. I'd be willing to
help copy-edit and SGML-ize such documentation, but I do not care to
reverse-engineer it from the code.regards, tom lane
Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
Attachments:
spgist_patch-0.110.gzapplication/octet-stream; name=spgist_patch-0.110.gzDownload
� N��N ��kWG� �Y�����#�?����������%5���V�-c&���w���]-����s��J��]�]���v���k��z��*Z����l��kQo����Y����K��T�^?����u��������Xm��?�tiuuuf�K+++����_���o����
��x����%��k�� ��x�O�w�?����<�w^J�;g�o��������kT@
c�$��o�rM"�_��+�'��]�aS�v.�Q/^=�&P5IGq_��G�$$���q4����I�\����5�q|�v]��
?-�:4���'�
�S�����p�b����`�7������u:����������z �� �n""�������������� ��`J���<8V��#��h�)|����Ma|(}��@�S0��� ?
�9R�6G�r�A4��(����a�<A?����.[��P0�������%�����,��o�l>�����^��
{�q�76�����x�w~�{y�O�~Ty��WI���qz�OT3���� B3nO������a�s�f��$���>W��C��3��p�2 U~?��K�����6n[}e�m��]E#���'�"�����f�T����(��rm%Th��pR��&�$��P��Q��Lu*�����<��y
*�V�L�I@�^��~|My����^:� v\H�\�O�|Q�I��
��5����6��_ba�C 5UKG*K�i�z���|�70��|��{qpt�w������cDz�uz�p�^�C
��V/Wa��f�usc}�������������o���42���'�0zI/���,���>>0��>Z�4�R�b���4Q�$����p�+\�����8���9���9Rw��j�nb\nj���(�v# =@�~���_~���|;a:�U���A���Oj�}_�7G$R���� �� �RCD��1ts�N�0��{n.��Itw������� Jy�>���I|]f��e�&��,�zQ���
�;�[sU\�"ZU���^/HI�!��'������F�����d�V
�P������DA���b�����!�`%�`_�o���I�N��Eu��! nh����C�L!��4��b�!�U���J�iN��rb��������� !�� ���x�0E������B�w�2K�m�!f\�R�[i��g�\�L�4��j#�,�����8�����o � F1�}���"�3;����6"��� �-���\[�"�������t�f����C�^e��t������p��"Q����p������rg������7�;0��hH1k��Y&�=�K��Qo�mnv:����o��m���]� ����[���(9�Q.%��X�9������1������������ 8rjq����Q|�P�������Ng���'�>N�X�6��sw�����a;��<��
b54P9��U"�/e�U�px�~k����>�c�C���`��46�*�.�G�d��� �P����\�6��n�����f���3�C����Shd�PH�H�P��u�K �������G=�C��YrGI��QV���<�CK�8�KF=63�-��4�JCYr� �X�i���6 �(�1��5V�L���OdpRX0$}(�#���� �9��4�!�mYK+�s xF��M��;B�8���$e���t�2M�������Z������1`�m��}P$d������h�Nsd5�d����p���.oi��AX@
&$����FN�)'��"".���{�q�����j�9 A���i��`�G*�V�|L`� ��:G��J�vo��`j��(�{g�5��r#������
B�)�������]*�{�Y��$x7����S��c���8��j<"�"���n����$��^��I��t=��E:�u���
��8�>h�p�L�!:�N��X�%�$��Z3d��"��M����^N�H6�����������]��u��b'�O���=�����&�/���~"G nU/�1zO`VO�� 3�O��<��y_�iv�Er�hg���
H�t�~`�%��C�O��@6��L&dko�� )���m`����� \%�a6�d���o���h�.y�� �P,�IF6
2'�\�,�"��w������K�Y'EI����'�=����D�����0�e�f1�}���Dd?�{�u�\E:�����G�yc����0�q���9W|
]$�9Q# wc�m+����
���D3�7����"�t� n5�R�(�`�Na�DP#n :C�q��>D�)h�_e���f�-�#O&�/��f6��|��Z��O��`��>���{�&z�`:!S�����6�A�����mOU��]��2�s�Q#���ej�62�.�D_�������F(Z}�n���E���T����v�Q��*��q�"��d���YkG�� ������A�g�#{��A<�o[�K&<�)u
�Q��;�_�&�M������=��b�L�9!���NG9,��i]����N>��c������8S�1O��OfS�o�X X+Vc���������ur�r����?��R�1�R��>mB�;�W�Cb�[�������i��Xy�����rz�jr���=���q#%��� ��I4���n�u���������������������_�����������'L�Al^Z��P_���=:�:����d���������7ow��=uqy~�w�������uaG.K8!�i��mo���bH�u{�~|-4R]��@�����c[�W�?�I��)ku �m�.�+Y(���o�u/8�*�z51�6M����G5�l2�m�:\�(����P4@������Hm���m��8}�k��
��o�o�V�y�4'��Gl�P���F����q*
O�[Qt�H��
_�a��3��J(��ID���� �lDVw
����� �����N��8>*�m����.���HM��'r ���;�������/D�@��MMy��9d�P�/F�^�)�$9�Q>��� +��J7�h<�YT�%N��5Z+���L�����fiE��~�O�E���[jm L�i���kZ b�2��-=��e��+vY��2��i: l`�/@���_�uF������~�n�`F'(I��q��w|���:����GP��<��� GZk�����w�}�m��6�w�}|h\�����{=�F���k�vZ��b�mMG�B��l�@ �z�~G� �)�����s
z���W��yC���5�Fq��T�0���-U�N��H��Tk��o�W���8p.u���� �����:@:n'Mq<�)�@�-���t��z������������ ;��<�$��o$��-V�+D��Q�'��4���cf�Fq�&��0�@�M����?��X-� �3��7s�3��Y��L��tf(�!9�������s�e5��Th�����7�.������ T�g���0����h�`�LC5q�{������ � ��=��f��?C�vm?Zk�3Wo!+�
�^4�@���M���8��g�SI"��T�I��������9�B|s2v� `�]�����m�%AU�>.�����(���R�iF�k���!�3Kf��)���]P�+�F���=�Q��Qo0�� �u�o��2B���)�28�����g`"�2$
&��1rd�
��
�$��@�
A����$��Y�]�����������6����V{��st7U`Rgo����v��\��k�������6���-BWj~i�N��-�?l`�VP���%��^/�l6�[����CZ(o8� ���������g�
]��fz��u��d;b��!�V::�}��=��X��-<�-�+�p��C�&�Zn��g�0������!���1���
�I��ia�O_���g���:�x�G���I�M��t���U ��(
gC7�-Y���S�-4����m�p�6�8ra�����J�qA$�fzd�&���'�0@g*��\�}ibRU�9G9���R����x�q���B?�� ��t�)�e��I��a��}N>��t������x����Y����e-w�N'�}��$�N%V Y���=[���o3�t�0��Uz�:<:r�e��@Cm�������#��Q<�G���>��l�xa�TF{|^2�ub"?������+}��'�O�<�t�?�v�����n�@D���b!�|C���g��=�E�S;�IDC5O�<&��
��X+�0�)���,3
�*���LD5���>O���&+1;���2Ag��:7nd���a,tj�./5�^��-TF�#��8Zt�f�0� :~����G�����}< F���}�� sI��A��- �n"�."2����;�Il ���v5b�U�tB��xR|�������I�����8dd�8zS�jw�[�����}�A�����PyV}��Y%���[��G6��� ��r�%����;M}.����KU���t���g�U�f���Y�x�j����� ���tJ
���m�e�����u
���������p�K�1�H����������������Z(T+l���o���u0l�FN ��/�i�K}�-�O���.��������x,����.J�R��d�����d7C��yD��E��;}��^`g��@���6�[������}�z����si����[�� ����'����4i�O�;�q�����|0'�H-����o�(�Dz��A���u�y��!o��$C8����D�S������:��j}�\,������
?���K+_"����/�|f�y1�|i�s��K!��R,t
8��@�y�h������K+{����'h�x�J���?��;?<cR��r���*�9�1q���[m��<df�Co��3)�w�3�Y�n�1*�N����)X �y=��#�h=hk�J��!51��c�����D��9�In�'��R�V������WQ{�x�p���6�^��o�,w|@�31�@5�NG��@0���)U������S�v=I�N��yj"�2���aE�q��� ^�[��t\��!��J [sL�>�"q�2:�B?�w�V���I��?���/�:x��O�q�����J��]���Ih��������} j�E��:Fc�g2�3<&����s ��@��w]�[@�1�
�;�<|����_���t��5~�_�lM��jSp�Q�[��P�n1��l����%�?�Y]1#��C�4�����&�������^Z� �~2U#�5����(�����-��}%L��a�n�<�����z�b��Dc�DO��tt��m K�80��`�����������T�������%�!�`���Y{|��Z��aQ�����Bx� gES��FgN�h���.����)1��-�H4"k����-�v�m)��{L9v c1Q���K�%
�D�'{%�o<�1�����;��
�r,]!x�4���9�@���}4�[;Y�o���Bc���m��m4F1J�h�} ��5��"�~���t���8��A�J[�?2�t�!k��X��<5�L���h865�b��2!����k��'��F���wm4�I
~���K�0��9h�$�����{�-��=Jf=hF!(�!�D����� �x�L� Y���L[r��4%L�e�!FE�'�H�,\soa�dM��'��\�=zsz~x��1�Cy��3�w����H�.@+���**@!y�Y�1��(T���O��z�G�Xij[ �AE�b�qgt���@�"���2��0%&?��77ZX�0#M��c�p;�h3"���0���]o]Z��#��3z�5����@���x=j�Ts��!E�����0��m���������KDM�i��K�+[IB2ycD}9!�hThF��T?� �R�'m������v9��@H��3�t�����=��Oe rK+'����e�qn �Df���
���O�aDz.��,nj�i�,US;��@���\��~ ������q��,
�0�����ji���������V���6`>?$j#���.f�E���y�R�8�o]Q�E�r�����NA���O��[�~�x�V����q� ���,���b#�;}"�d�zQP~Mz�A���D��@3�7�kj6�Q��>u,
���"O������bG?�? f��x�I�T��\,V�%0��8hIs5��� �j]>�vE5C�JO������?1�������~�:�A4�E~�M����o��f��)��
�OO`�K+P<�f4F}tRw���@�NS@<���l��%#cB�i��Y�G���1:��VG��a�2�b���2A>L!����
[(��b�|�k�d�b$#�� ���D&?����fmTt�����t��'m�.R<[�"x�����we �?A
!f#��=�J#���J����%7�h��#��g�x��6�T�>0�������������YbuC�
>3D�������32���Ba�3k�i>m�3W������xI��l�����������=�;vG7�d �t�]Z��^h�
�p����*��.c� -�;�V��)����1 z��4K�����xh�Hb~��#���)��H�"]di������l_�^�_���?5e2,��~��s���=�r��A{����$��XaS��_�Y���&�@_�qKf~����)�q,���)�|�L�r��WB<B�"����n��S��Q>r>��p%���"��O>5����U_F!�H8�]�b��&2S#��t��P ��A���N�@�M�Z$������)�[qJmu������[y���.`�5�����5��������(;�K���PQ*��F��H���!��G:e��iq&q��9����>����6��x���5-�\��h#�-�o��J����B.�����5��rm:�5�$@�$1���1��_VR�����QS�[����-ri�����(�hZ2���f�d�����JJU�\�7]���N$�Y
'Z� �� :/X�#������\�.�C7l��
� �:��hae�a�����f�Xl��u������6�h�4�DY����5J
��YN!��#�Z�=��ba(�I��E����T��)i���l�u������sI���:ac�ytE-�X�N�+x�������fWo�t9�T[���+������h��i�w ��A�q�gP����M��~�axt3%h�Bc[��ca�(@�#�B7�M6�t�����N���������$"����B�C=`������,tH�E��,@���`�5wz������-cq��� Q���,�x��@!����g5�6���Y�4m?�F��F�=�$<��X��P�M��z�E�*���2C3%�%K+��v� Z�$`����G8b���H�9����� tN=�`�&K7h�H���g�t`i��,��'b��=�����Y�j
S�������cB����Fm�������� s3��h���=��M _h_���M�<�
�
��+��3�K��W��UE�����}8�L<�� �]:y��-
1���yf�*�;2�����{o�LG���,���'�Y8�&;������� %!�������]���M�)��N'zV��X^�p�S9X
���b����b��y(9(]��K���]��
����i���z ��s9
_��'j�V~
.*��2n����V�6?���}K&fQC+�aN����mB5�E+��J���$����}��eh�.���s��z��#S�p���*?U�
C�l\[��'u�G�� ��z[@P��2��Rel �6��u�xf������#aq 7I��L2�����l���a(�Q��k|c+CA�]MJ�g����@k����vU��
4��]���^��3<ur�{�N.��<�n1�7��UG8c+7
d��-�R/R�1dC��v��"��8�ul�Ht�A��=Z�Lb��=fyD�c9Z,������q�K.����'����e>G�����.MAK�d/�A?K���~�%����TNQx���K�n�b������sc�z3����������>������~�H�g|Q������T��cY���U��h,?����T�,�p��t|?!C]��R�}�|us}c��RC���km��7���sZz�V��M<��lSI�I�h���%�V1n������ ��(�)y��tD�#������B������J6�'��i�2r_ '.�&Y/��,<� ����zx3�x����y�[��:+���g�@��0���I<�!e�9�<JF���3����=�����y�� ����0����,�Ot���t
��h$[����R���+��o//�w/���}������&(�R�d���
��}����~u'���E<.���8I�� �a�(P��)��Pp�}�S% ��nS��y�����.���Q�� �'��S�x�������, S
m��h�!����M������K�N ���<��s�^���-g����I��v0-��M��ZQt"��\�����L.�)y�x��7�}���>����m�[B�+�FrE�7i`���m:���^[=�?f���CY~�����],n�m\�������u��b�p����o����V��V&+�V�y�{���i�&�>�SD-G^�v����QG��Sp�����r+�
S|�U���-�P;����@��V7����`�I�B��A����(XL�%�f,#�����i��-��C�������K�n<������\.�{�F�~"�� �����tI�
�5`9����cj����s�h��k4P"�s/(%��{�
�N�P'w�T�#^����N.@����5��Y�;�3k�E�D%� ���X�x}~ZGt�a��a(���#E������"�bW�vq�h3������\�t:�@u�K���@PiG�Ly�-���B++2Ui�~ ��^]�o8���OED�r�9����v����xc��CC/��%
iM��gF����@������J^��������J7��R
gY�'����&������%i}�o�TC��q�a�.S��&�E'ZV[�.K]j������!���A��t�b(�P&{�5������)��vJ�hGm0����q��iH��;%�X��p��h���GG�"�-oV���\T�h�d�����`bNi*��5vMo�+�e��3a����N��B~����b��,Y�A�;|5ES7�K_���c��e�I���#���������y���+[��������� ��SK�.r4G�L�W^rn���m���b�M�����i��A��)�m�#���.�q
*�K&"�Y�A�8l�C|K�8?���m�iz��,���2(��I~ Dt��
r�/e��^����Le���9������d'�����G��y����������w8k9���m| �������]^��x�{��4�[C���#Ju(n�`g#�^m���z����ySf���V�z��3�\����I�J+���B���mIoli"�;��#��3I� �*��hN��4�3���d�b����V�/w�/���/�.(QM�e%Q3un�j�%��o a���7��W���_�:����Z�UD����&+��(�BY����������Rf��ez�<��UK�X)���~�W�g�`�e-�~������F9|���Mq�����F�c=9l��]H��U _��-�*�����[�����>C)���D
/����V�-v�>�����Pg�+�P��<�W��x+I����s��D�:���nJ1�tc���J�������� ;/�A�Xj�|����=�M�2dOx�Y>Am�7����Kp�G���J��~^����w��)uV[�u�kR.N����X�.����u�q;�����Q&-���]�
���}���;z�Ty���p��p3%��:7����=m<��P���Z,�l���h�����Y-�0 ��}jyt�Rs���6�2!0��HR��y�����O�\���.w��.����v;��;��!i���x[�`:t���H)3va�5[P�7���SWC�2���]7�e$a_�������j}�=`�q��K������~��9O�Q?�����/h��n�"[���/J$.Xiy�D��<��_'d��Jx�_�e�^�� �>�Cb� �����/�j:���������p��(����������>��X
�R�M3�b�UbK��G�w����L^n�Bm��k��
�Po��w�%MK:���+h�a�E�h����/���L�e(^dw�F���t�)�{�94����!�Z��)c�E��}��~7�9.�|."���co���%����Z�_�D�o���b�R���q�R��6L{g�.����f;�����;;P#.W��~��y�����
f���T!������X���V4��5�gYP�Xf���[�������"�h�� P���� ��i����H�B$MC��9����6e�q������Fq-q� 0Dp�������!�����W��FA����"����.3�j�=f/9���[���.P�������+`��Q�IUy��Fi������5I��
b&F>/�����Z|���qqyz~puq���m�
������h��i�"����~�����U*X%h$�S>��Y������Y�>����,����w Z��iR�����1������7�7��I"� �?4s��������P�\���6P��{�u&Sd�W��h��i&Xm����,S[iz5f��[�y�X�f"�G �%l�4��Hl�#�;5�
�k���0e����\�����3�`��?�����`^���m���X�&V�$��E��fV0h������-X�tZ��f4����6���������������b��&G�]��}������E��d��j�%��������1�4i��}���rV���*��:5����L�Q?�-�Y��l9��+[N�n�����d- U��c/�����$�Nt��o}��=�1����@]�&��N��&$�_����<��3sg�v/���wn�o���at3R��
����@�X[z����bY�q^�@�z���R �� ��������`����?�C��E�T��M�+.I��]��k\��'�����6-�S��{{S{ZL-��!��*y�$e��!�C��^���FC���O�(����\Hr<A6_��O���b�*�rES��GV�"�]n#[�����l���..��k���J���2N�����hx��w�O�B�x��y�?�b��$2Z��S�qlxZ{B����G��m��d3l]�������Y����M_���F�.�;>������.A�q��Qo^�V��7������f���������W���{��gtNG����c�3�a�u�����D��������a;m@����!�J��������/S�A��-:���w��97��l8�������*��h���� ��q���f�RrW�6��:��n�@�9��D�;|�g����\�O�4�S������~-�w�mW�@y %���O�X_�_���%k��pc��),�(��Mf����2�8��%F*�?��B�_��l��xs$'t�%��jV�A1���m�|�T�,�0�-�,�uD2�1x�/�[�w�,���7Kg<��@m�C�|uN?�s3K�$���' ��9�;�$6\}m��M9;��Ml;A��Xa�o��Wt�{+b���ub5��9@RLM���H��-��Zq81'����T^{�E��O? ������Jz�/.�e
9���&��&�}��Ft�^��1�0��H9��V����]K��>EF1DL�i��6�4��r����kq�Z��P�Q��
k���o84��.i��v����~S>�h��n��Y��V�h�S�[.�����8:MsC4����P_bV�W;m�N��9E�� q�:��Ur����[R�V�[������c=�9��
`��X���Q�y8�����!�df#�i���������������V2�z��P��a��p�JB
�(�����f���8+����"��'anA��@ #��+�,��
����~�In����������da�����$m��<�/t��n��H�J6���j�(��0HLKZ���ar����Gg�u���wQH0�������[V���H��)_�jA[��`>�X36�� �}�Wk�v\�E"92��1hy�������z�)ML�e������t�F�A�k��Lf��Y��z,����_��iS0~�L)w���@��#��=�g��1Omj,�4-�I����-��4���6������l�V"k����a�U��G�(�n�����_k{�F%_��h�b�gp)Z����� E�I��*`����88�;�?�:<998�:�=?��G����Zs �a� ��Y�hC� -G�� ����v�bB&��q�� l��}y� ��-P�$�v�iMs G��s�%cbO��� ���0�='�0��� b�!/o7J0T�?�l||���Z���/d)��"]���V�3��8��.��Q�V|��)�_}�t����A~-�']K12^������~�:\
�>��������:����tx�D~�O?����KJ����vFEj���)Yp��y�Pxm(��3sis�Vj�S$�gB��L� F��3��S�R>��ie�����)����$�8��0GsG]�m���P?�Q��Lc�e&�Aq
R�Y:-+������7"���h
3�I�ysc�lL� ���:��Mc����{|h�l�����U�Y�h<4���h^���a�U��%��I��8SF�}�'c"��Q@ /"l��b7/G�!+@�d��
�?G}4�"�"��'F,��E^�$Go�=�G)��f� ��b�-�2e����>����B���l^��G�� /�OwG���A0HU�T��K}���'��a-x/7���Zhph �����e#��D��&l^����'U�9��*��.X�v�L~=K��� ������e9���
� �xu��Y6�1��=h"F�����
�3hnUc�������e�%���r���2�8��n#��DlL�O`c���r p��#�n�D�����6Luy������vz����h���N�2������~���9N2cb7�x�hVK/����
�A�be-n�<�0���g.{���P�R� yK��B�t����B �X$w��j�Eu�;�9!�>��1z�
���s�&����YE�����P�|�v�?�tN7f�vg-Cr�l�B���]&0 �����c���h,z�]&��I]|��]�jg���f^��2(m��36���������r���s���br�l'��|�" :�2F:�hbAu��Vf*��.�X\���5�|[�U� m�*-4s�m��@�cS�����*�1��O��#�Z�R%���\.%@��:M����2 ��z���=���!1�P���CoE[��-��� z�*�^�j�i]W���JI��V��4�4�6���M'���=���}�Z����9�N7���[:�N�s���P�BQL_c�&1��S��_0Gr�;�K��bw[^!AR[L����/.&^�t�?#Tj�Vj��sa�3}M��S���[���)���8���*������?��.�� ���v)��w����d�%y���;4������Y4�Q���R�UU���/��fN��N41;�� �����'D��u_�����u��s���@��@�`��91��|����f��TE��;�KX��3��wiB���b}�����wt�o�40�9���c`T�q�e�b���%�Ui�|�jho�b����x�Q������>� lo>I�������j���Du1��?K��?Z*����q�������@��z~�`�$�����Y�gy���k�]�E�3�.@aJ�[�x���������T'd��p���}z�����������.q�7Q�:���+'���i��'��!���F�|��i�����^�^��@����:����d��$u3���I�6;��g�.5�����vX��������+�b��zaB�T�<�}�m[��
�-]��,d��T���<��W��Z��1�������+��u�d������D0�}��$�����>���Gy�|���z���|D�F�����#?��*�_����T��U��aZT�|�j�-��B��+@��O�$��'<�!������S%��UN&�`���p():3����l���fs|V~s�I�Jwb��f�q]b�j����!W$���Y��%�ee�$'Q�� ��_Z�d��Vm�]�HK6t���_`�KY�23����_�N����D��������z;����=Lf�N�t����eb��!���~��k��te� �r� Q��8��5;�~=q���ht��W������{OD��U��n��2_�TP�������cU�R(d��&�E�>����9j�0 �8�^���?9�?(�K5�'-�=It��`�fI��j����mJS�'"X��c�v��_��j�-,����\vh~N^�/hjv.��+���,s�����w���9��)|��|[n���=N����j]X���t���i�+�+��������c(e����!X�������?�_���9��3��x��mG���I�^�e���zgP��^>�����Q��/W�W�Y�&�W@Q/���_��}t������C $|g=`@
�l��j�)u�p@�v7IG7�����hX"�8@
�.��F"��'� S~^�a�M1�_
]������%��,��|�tT�?�T�>���D���7�O(��n'��1+�"��++����g�N�u�����~��T�6�;���r�`��DD��e��� [��+����0�h�c���m�fq!�a)�'$���"z��hW�J|V}��\_�~��h?S���yl����y�<�A�j�x"���*-�A�&!Y�&�4��r�C�����w�
�2R*���
��NfF�q,.���P��O(W����[�����[�,��bF��jb�p�*R�N�����Z(����F���
HD�(�m4������1�Ka�������&1������q�����I7\4��H$�.��BK�U*��<S7�;�BB�p��ZV��6&���zAC"�s���>]s�� ������h���i��f���aJ��5Jc����>0����r��*�>�:��df��I&#�� ��P>+i
sn�n��=.�~�Q��e�&��I�G�a�[�]���yI���kHh�)����T���?���m*���5����u��v�Y,`F����t*���[c[U\�;ig[��L�E��B��i�sc5l$��W�B��`�M�e���c`2=4�rd;���T����m���l�����T7*�@Q���a<L'>Mp���2���~>F��rJ����p'�G,��b���4������.��u�z��"z�VJ-��I�t_��UZtu�?����-���Y����T������a��~����P��p��L����^�S�=�rP�����\���������/�&���n����v/��->�����+�{�1��HZ��4�NH� } ����j��@t^9/<�(Aa/��)�w������/<6HM_�w���xo@�M���JG�+��[��!�>Yl��0W5
_���8�EE�9/6.3Y~�I?������7�=���Q<��o�:�g�����3�ezst�����������D/{�g�{ ��f�{
��-/X3�LziI�=;?}s�{|utx{��������}�]��0�i>��/ .I�L��.�F;�>&C�2|F9q��?�9���GK��Q��`�T\��&��l*4}P(GuN�wC�AS�T�L�6C�����.X��H{I�E#1Pq�������<��6;�P��=��7#��S;��gFA�R���nl9V����*]�rdR e�U�%�
����-������|n&V�zf=�9�z��=2���&�L���c�M��b��+��������qZ8g��xiS�������9�)����?Y���4��v�5��������"Y9z{q��Aan��qO��
J��h}���$�a��W/�7u;���
��.�f��t�q+U_�%��0,���d������Nl��n�:��A��w��<u�%��C���m�����3�������pP&��nR�E�z5?�^e�C��"������q8������dkj��w�?jr�R��^�1����~J2�_m4�@Q�>��c�|������ ��./f����fb���<���2I0���iP��g�L����8b���7I�qV<��KJ�����i/��+*�~��~n��Q7�w��q;��e�r�Ns}9P�sn���f$z�,q��������w��r��-T��1�Xs:y���{~��� x^,�����~'�}�B��x�~����U�.�p/���F��B��J� �v�3���q�/��N�t��;5�����*�� ���aG
�L���l)��i���e������M:�z���e���������<��N�}C��������* *5]B�!-�1�$�N��F������y{9��o�
sC�����a�
�W04<�-gU6V��
�N)��QvO|�e�P���E,5��"�rQ/E.�Ky�[�����9+]B*V��~��t�F_!�����\��;C]��
���=���s5J�&�^)�$L�w[`K�@������n�����z��G7��9J��-@�4eUQ0�5��3���b�f�(d����B���M�VX��\M�<�C^0���H�?� ��F�� JG��T��9�5���v:��MJV"w��D�T8[
���y
�X�Zp�{Y�8�~| ���x��#N���T�Cx�##�0�bH���OK���Z������e��Z7���G�����Y�q�hB�
���n�rK(>^'��9o��?�t�MZ���tz���������U���?�!ZZYY���_��V���je����[�������_���g�
���:�'�!��%'��(�tq*p�N����t|�)���������������_v3�/�v���n4P�H����7��xNKO��<�� X��3VoG ��5
� �M`�GId�u�pry��po=z*��r��EL����Qo0Dy4f�d��G�L7���+��x�|�m[(���e�P��n�d��?D �{������������%5x��(1��@d�/���x ������z3��r7����<��G�����*z�QJ���^��|�_H��"��=���d�o���z���\BW��o.�����(�������@������'W?��7+_�1���HU��|K�CuO;e�� R�
|P�U�,�����lw ��������HZp�e� ���}����H�Z�������5Ha�9*>���.���tu��Ip<Z��ni�����������9���%�m��y��TxX��V@�*�1K��!\�3�f�\�9���Wg��'��49�����aN5�"E�pt�*��[�����r����M�}�-3��w|����d+�Cl�ZL��9�KG����~�����dQ���\/GR�~ �e3���s�QM�v.��<��/������
Lb�������;��Re��p{����c*S+(�.�,���b��b;���$�q��)�@�*���\����!7�`I��\vc�l��a0�An:)��vI��s��/3�w~�{��x�?�1Q3������Q#�P�Ww�~�3� ax�:,"�P@�P� +�t(z�tw�8����� �'${�\mM9��Qs�2������ �Qe�D
?�K���]\^���}{tyu|xrq��sJ�^�(v��#��Y������;t�u��_BxM�Qd��E�&2��$hSuw<9���,$�\6�* U�YZ���@D
�"�)��i��1�V(<�)��Ln����2��O���<�����4��zFX�|]�0cG��0�f���}DN�z"�U3w����J���L�
���@��+�6�P]
��Sr������������0sNf��S~jEP�~��{�Ec_?0���w[�v�l6���@�J�C
�L
���^b~I�I~>��h�"wG�!0��K=�2��4�H�f�U$:L��*�V��n�<,��s��*}.������Q�7}���>�n�mj���-[��������Qq����c���v����x���$�Ek
<���_�r
�8�����mg�o�����&�_�QH_t%���m;�����8���7�x�+lI6���Zl�F��8����
��9lg���W��W@=��������xoe��$#��]��������]�h��xD_��^~{z���_�;�_'��We1�-|�^�&�/�~�
������g��G�c����g9�p������]��t�Q��/���>�iJ���>��~��&��o�rih����O��������"�|�J[�y��������X�nex��BC�~�g~��F3Tz��������ls�o-�A@X�by��f�v���!:A?;�_�Nb�m^�8�����J6���P<�:���
h����{=H��[*�D
Ha�����ox�bG;��MV�~y��Y�^�W�\x>(���ekSoAE{#��6�'��������Q���TB�3J�$#�0�~I<�m��Z]���Q�W�����IO9g����*��W�����t�b�������6�hr�:�g�Y��Rk.�"R�
���b]BWE�9�P ����J"b
���%����?s���l��������<�"�4m3�^>����vZ��<�I;M9���X&������/}`��rF��%�-�~�a=@m8� ����g^����6^�5�A�MV_�|��O�����+@�&i���7M�h�L�9z),3mTXjBa�����*�z8����
�3����quC����^��a�!c~�4c��6Mub�6�K�i3�������0 &�f+qR����7��2�Pe�9?���]�(�,����jh�L4�����������I��;��0����~�er�������D�-�[f7A���
\�;��QP5�7Z���6�S[U�q�(�H�p (�g ��n�l��xOeT��rI�����#?��3�)����,�Z�Zz=��J���P������Y���{r�����oL?�M2$�#��FC��X�����c�T�����)H��H $_y/KXJ���u�=X�C���li�%:�<���y��r���
�Q�O��lge�����HMjAh|[9J��+5������G'+����!����F�)
4������&4#��������;�+���z��t��74`}�8�u��}m���"��0��?p����dK�*�w����(n���u����j����(n�E������H�������?���������TQ. ��4$oj�\�k���g�X���#|�m�mj�ij�6[l�*
)�HM &E2�0����&����`\�=���Q�����L#�X��J�^���;�9�
��:�n�Y�{�dqT�/������\����PXN�����P�{�Hg���j��P���Hk�\���j���<��l^�m��E���K�B�_:h�S�a�$�j`J9�!W��u[Wm�Q�Zz�v����j�;c&��3g/>+�T��H/���qj�`<~BE6���o_�$?�n�)>���I����M�� [������a &��BIJ�����_��-9�mZ�]=��t]}���,"�M*uQ.5��{�tzn��zTdhRf_��v��<��j<~\��������x�`�3��Z��=h���_��h<��x���A���{j�y
�r}�q�� ���;<��?�M���%W�N��jMg�zu��pvJ��������������\):���@/��N��z����f���}��!�����=�j��g�N���Q?���<Oc��'6>���x���! �
�q��N_cd��P[�u�R���*���g��K��O��kx#}RU�������S0�zQ��q?�FK:������Ew�4M{�����O��A�j:�/u���?�_��z%p����y��Y��7��u��;5
P\�v!TA����K�yx�������-���g��,}Z���u����xkzr��%��f��J�\{����~[���6�����,s=R*�PS���s]�o��FJpj�����X2VX�Y���F��=�lmm�h�N�S<2 ��3�3w�.���:.�������z��7�{Yg
*������C+%���>Kn��������oqz��Y��*w��^�K��*]=^k���i����5(jf����<���n��JN�^��b����UN-�_$*���*���q�.�T����� S�� ����d�
�0��x��5�,��Yp�;� *f�`����6�r5��m�3����'����5���!wExH4M�=V���}��v��� ��x:��F�4>'��
��-~{������e��E�,h�(�X���m����i�y\��F��z�oY�?{>U�bC�c� �Z�����s��`o�� �+On�\n� �v!�/��%��b�H�e�>w+&���������GT�����d�x�����4X�����&n�J�w.�'�7��x��NR0�1�%-�R��k�}�o���g��cq���n�)�O�:�
( �D=VM�,��S�L���;w�(�D<���g�A�(����Gp�ZQ�����G�GHN4��g���V�P�:�� ��f��xI���;����w�x>8^31�~�G�x6�Z���W?@����w����8 %�W�`
tX`��O�G8����U�o-�mBb�Z�dN�b'-��ipB�O�0�J�fI� �\u\|��T4oR��l��������ag���XWq9�������e�j�z��6�q�Jg�h w ]O����@�a�9l!n�}5��mi�Q�L���������4#���0a����z,�,%���^�\��);�KG����}����U��e�����^����nS<��/*2��k��`A�����I��A ,Q[���VNR/�F��V4`���$������bI�J����,p0�w��U�,&