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

Commit 642194b

Browse files
committed
1 parent af7d257 commit 642194b

14 files changed

+3701
-1
lines changed

contrib/Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $PostgreSQL: pgsql/contrib/Makefile,v 1.68 2006/09/05 17:20:26 tgl Exp $
1+
# $PostgreSQL: pgsql/contrib/Makefile,v 1.69 2006/09/05 18:00:57 teodor Exp $
22

33
subdir = contrib
44
top_builddir = ..
@@ -12,6 +12,7 @@ WANTED_DIRS = \
1212
dblink \
1313
earthdistance \
1414
fuzzystrmatch \
15+
hstore \
1516
intagg \
1617
intarray \
1718
isbn_issn \

contrib/README

+4
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ fuzzystrmatch -
5252
Levenshtein, metaphone, and soundex fuzzy string matching
5353
by Joe Conway <mail@joeconway.com>, Joel Burton <jburton@scw.org>
5454

55+
hstore -
56+
Hstore - module for storing (key,value) pairs
57+
by Oleg Bartunov <oleg@sai.msu.su> and Teodor Sigaev <teodor@sigaev.ru>
58+
5559
intagg -
5660
Integer aggregator
5761
by mlw <markw@mohawksoft.com>

contrib/hstore/Makefile

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
subdir = contrib/hstore
2+
top_builddir = ../..
3+
include $(top_builddir)/src/Makefile.global
4+
5+
6+
override CPPFLAGS := -I. $(CPPFLAGS)
7+
8+
MODULE_big = hstore
9+
OBJS = hstore_io.o hstore_op.o hstore_gist.o crc32.o
10+
11+
DATA_built = hstore.sql
12+
DOCS = README.hstore
13+
REGRESS = hstore
14+
15+
include $(top_srcdir)/contrib/contrib-global.mk
16+
# DO NOT DELETE
17+

contrib/hstore/README.hstore

+175
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
Hstore - contrib module for storing (key,value) pairs
2+
3+
[Online version] (http://www.sai.msu.su/~megera/oddmuse/index.cgi?Hstore)
4+
5+
Motivation
6+
7+
Many attributes rarely searched, semistructural data, lazy DBA
8+
9+
Authors
10+
11+
* Oleg Bartunov <oleg@sai.msu.su>, Moscow, Moscow University, Russia
12+
* Teodor Sigaev <teodor@sigaev.ru>, Moscow, Delta-Soft Ltd.,Russia
13+
14+
License
15+
16+
Stable version, included into PostgreSQL distribution, released under BSD license. Development version, available from this site, released under the GNU General Public License, version 2 (June 1991).
17+
18+
Operations
19+
20+
* hstore -> text - get value , perl analogy $h{key}
21+
22+
select 'a=>q, b=>g'->'a';
23+
?
24+
------
25+
q
26+
27+
* hstore || hstore - concatenation, perl analogy %a=( %b, %c );
28+
29+
regression=# select 'a=>b'::hstore || 'c=>d'::hstore;
30+
?column?
31+
--------------------
32+
"a"=>"b", "c"=>"d"
33+
(1 row)
34+
35+
but, notice
36+
37+
regression=# select 'a=>b'::hstore || 'a=>d'::hstore;
38+
?column?
39+
----------
40+
"a"=>"d"
41+
(1 row)
42+
43+
* text => text - creates hstore type from two text strings
44+
45+
select 'a'=>'b';
46+
?column?
47+
----------
48+
"a"=>"b"
49+
50+
* hstore @ hstore - contains operation, check if left operand contains right.
51+
52+
regression=# select 'a=>b, b=>1, c=>NULL'::hstore @ 'a=>c';
53+
?column?
54+
----------
55+
f
56+
(1 row)
57+
58+
regression=# select 'a=>b, b=>1, c=>NULL'::hstore @ 'b=>1';
59+
?column?
60+
----------
61+
t
62+
(1 row)
63+
64+
* hstore ~ hstore - contained operation, check if left operand is contained in right
65+
66+
Functions
67+
68+
* akeys(hstore) - returns all keys from hstore as array
69+
70+
regression=# select akeys('a=>1,b=>2');
71+
akeys
72+
-------
73+
{a,b}
74+
75+
* skeys(hstore) - returns all keys from hstore as strings
76+
77+
regression=# select skeys('a=>1,b=>2');
78+
skeys
79+
-------
80+
a
81+
b
82+
83+
* avals(hstore) - returns all values from hstore as array
84+
85+
regression=# select avals('a=>1,b=>2');
86+
avals
87+
-------
88+
{1,2}
89+
90+
* svals(hstore) - returns all values from hstore as strings
91+
92+
regression=# select svals('a=>1,b=>2');
93+
svals
94+
-------
95+
1
96+
2
97+
98+
* delete (hstore,text) - delete (key,value) from hstore if key matches argument.
99+
100+
regression=# select delete('a=>1,b=>2','b');
101+
delete
102+
----------
103+
"a"=>"1"
104+
105+
* each(hstore) return (key, value) pairs
106+
107+
regression=# select * from each('a=>1,b=>2');
108+
key | value
109+
-----+-------
110+
a | 1
111+
b | 2
112+
113+
* isexists (hstore,text) - returns 'true if key is exists in hstore and false otherwise.
114+
115+
regression=# select isexists('a=>1','a');
116+
isexists
117+
----------
118+
t
119+
120+
* isdefined (hstore,text) - returns true if key is exists in hstore and its value is not NULL.
121+
122+
regression=# select isdefined('a=>NULL','a');
123+
isdefined
124+
-----------
125+
f
126+
127+
Indices
128+
129+
Module provides index support for '@' and '~' operations.
130+
131+
create index hidx on testhstore using gist(h);
132+
133+
Note
134+
135+
Use parenthesis in select below, because priority of 'is' is higher than that of '->'
136+
137+
select id from entrants where (info->'education_period') is not null;
138+
139+
Examples
140+
141+
* add key
142+
143+
update tt set h=h||'c=>3';
144+
145+
* delete key
146+
147+
update tt set h=delete(h,'k1');
148+
149+
* Statistics
150+
151+
hstore type, because of its intrinsic liberality, could contain a lot of different keys. Checking for valid keys is the task of application. Examples below demonstrate several techniques how to check keys statistics.
152+
153+
o simple example
154+
155+
select * from each('aaa=>bq, b=>NULL, ""=>1 ');
156+
157+
o using table
158+
159+
select (each(h)).key, (each(h)).value into stat from testhstore ;
160+
161+
o online stat
162+
163+
select key, count(*) from (select (each(h)).key from testhstore) as stat group by key order by count desc, key;
164+
key | count
165+
-----------+-------
166+
line | 883
167+
query | 207
168+
pos | 203
169+
node | 202
170+
space | 197
171+
status | 195
172+
public | 194
173+
title | 190
174+
org | 189
175+
...................

contrib/hstore/crc32.c

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/* Both POSIX and CRC32 checksums */
2+
3+
#include <sys/types.h>
4+
#include <stdio.h>
5+
#include <sys/types.h>
6+
7+
#include "crc32.h"
8+
9+
/*
10+
* This code implements the AUTODIN II polynomial
11+
* The variable corresponding to the macro argument "crc" should
12+
* be an unsigned long.
13+
* Oroginal code by Spencer Garrett <srg@quick.com>
14+
*/
15+
16+
#define _CRC32_(crc, ch) (crc = (crc >> 8) ^ crc32tab[(crc ^ (ch)) & 0xff])
17+
18+
/* generated using the AUTODIN II polynomial
19+
* x^32 + x^26 + x^23 + x^22 + x^16 +
20+
* x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1
21+
*/
22+
23+
static const unsigned int crc32tab[256] = {
24+
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
25+
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
26+
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
27+
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
28+
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
29+
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
30+
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
31+
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
32+
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
33+
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
34+
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
35+
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
36+
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
37+
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
38+
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
39+
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
40+
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
41+
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
42+
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
43+
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
44+
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
45+
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
46+
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
47+
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
48+
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
49+
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
50+
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
51+
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
52+
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
53+
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
54+
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
55+
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
56+
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
57+
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
58+
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
59+
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
60+
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
61+
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
62+
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
63+
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
64+
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
65+
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
66+
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
67+
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
68+
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
69+
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
70+
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
71+
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
72+
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
73+
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
74+
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
75+
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
76+
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
77+
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
78+
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
79+
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
80+
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
81+
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
82+
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
83+
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
84+
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
85+
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
86+
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
87+
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
88+
};
89+
90+
unsigned int
91+
crc32_sz(char *buf, int size)
92+
{
93+
unsigned int crc = ~0;
94+
char *p;
95+
int len,
96+
nr;
97+
98+
len = 0;
99+
nr = size;
100+
for (len += nr, p = buf; nr--; ++p)
101+
_CRC32_(crc, *p);
102+
return ~crc;
103+
}

contrib/hstore/crc32.h

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef _CRC32_H
2+
#define _CRC32_H
3+
4+
/* Returns crc32 of data block */
5+
extern unsigned int crc32_sz(char *buf, int size);
6+
7+
/* Returns crc32 of null-terminated string */
8+
#define crc32(buf) crc32_sz((buf),strlen(buf))
9+
10+
#endif

0 commit comments

Comments
 (0)