Update /contrib for "autocommit TO 'on'".

Create objects in public schema.

Make spacing/capitalization consistent.

Remove transaction block use for object creation.

Remove unneeded function GRANTs.
This commit is contained in:
Bruce Momjian 2002-10-18 18:41:22 +00:00
parent fb9bc342ff
commit aa4c702eac
91 changed files with 3530 additions and 2643 deletions

View File

@ -1,5 +1,5 @@
#!/usr/bin/perl
# $Id: adddepend,v 1.1 2002/09/18 20:38:59 momjian Exp $
# $Id: adddepend,v 1.2 2002/10/18 18:41:19 momjian Exp $
# Project exists to assist PostgreSQL users with their structural upgrade
# from 7.2 (or prior) to 7.3 (possibly later). Must be run against a 7.3
@ -125,6 +125,20 @@ my $dbh = DBI->connect($dsn, $dbuser, $dbpass);
# We want to control commits
$dbh->{'AutoCommit'} = 0;
# turn on autocommit
my $sql = qq{
SET search_path = public;
};
my $sth = $dbh->prepare($sql);
$sth->execute();
# turn on autocommit
my $sql2 = qq{
SET autocommit TO 'on';
};
my $sth2 = $dbh->prepare($sql2);
$sth2->execute();
END {
$dbh->disconnect() if $dbh;
}

View File

@ -2,287 +2,353 @@
-- define the array operators *=, **=, *~ and **~ for type _text
--
create or replace function array_texteq(_text, text) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
create or replace function array_all_texteq(_text, text) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
-- Adjust this setting to control where the objects get created.
SET search_path = public;
create or replace function array_textregexeq(_text, text) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
SET autocommit TO 'on';
create or replace function array_all_textregexeq(_text, text) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_texteq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *= (
leftarg=_text,
rightarg=text,
procedure=array_texteq);
CREATE OR REPLACE FUNCTION array_all_texteq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator **= (
leftarg=_text,
rightarg=text,
procedure=array_all_texteq);
CREATE OR REPLACE FUNCTION array_textregexeq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *~ (
leftarg=_text,
rightarg=text,
procedure=array_textregexeq);
CREATE OR REPLACE FUNCTION array_all_textregexeq(_text, text)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator **~ (
leftarg=_text,
rightarg=text,
procedure=array_all_textregexeq);
CREATE OPERATOR *= (
LEFTARG=_text,
RIGHTARG=text,
PROCEDURE=array_texteq
);
CREATE OPERATOR **= (
LEFTARG=_text,
RIGHTARG=text,
PROCEDURE=array_all_texteq
);
CREATE OPERATOR *~ (
LEFTARG=_text,
RIGHTARG=text,
PROCEDURE=array_textregexeq
);
CREATE OPERATOR **~ (
LEFTARG=_text,
RIGHTARG=text,
PROCEDURE=array_all_textregexeq
);
-- define the array operators *=, **=, *~ and **~ for type _varchar
--
-- NOTE: "varchar" is also a reserved word and must be quoted.
--
create or replace function array_varchareq(_varchar, varchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_varchareq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_varchareq(_varchar, varchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_varchareq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_varcharregexeq(_varchar, varchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_varcharregexeq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_varcharregexeq(_varchar, varchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_varcharregexeq(_varchar, varchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *= (
leftarg=_varchar,
rightarg="varchar",
procedure=array_varchareq);
CREATE OPERATOR *= (
LEFTARG=_varchar,
RIGHTARG="varchar",
PROCEDURE=array_varchareq
);
create operator **= (
leftarg=_varchar,
rightarg="varchar",
procedure=array_all_varchareq);
CREATE OPERATOR **= (
LEFTARG=_varchar,
RIGHTARG="varchar",
PROCEDURE=array_all_varchareq
);
create operator *~ (
leftarg=_varchar,
rightarg="varchar",
procedure=array_varcharregexeq);
CREATE OPERATOR *~ (
LEFTARG=_varchar,
RIGHTARG="varchar",
PROCEDURE=array_varcharregexeq
);
create operator **~ (
leftarg=_varchar,
rightarg="varchar",
procedure=array_all_varcharregexeq);
CREATE OPERATOR **~ (
LEFTARG=_varchar,
RIGHTARG="varchar",
PROCEDURE=array_all_varcharregexeq
);
-- define the array operators *=, **=, *~ and **~ for type _bpchar
--
create or replace function array_bpchareq(_bpchar, bpchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_bpchareq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_bpchareq(_bpchar, bpchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_bpchareq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_bpcharregexeq(_bpchar, bpchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_bpcharregexeq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_bpcharregexeq(_bpchar, bpchar) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_bpcharregexeq(_bpchar, bpchar)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *= (
leftarg=_bpchar,
rightarg=bpchar,
procedure=array_bpchareq);
CREATE OPERATOR *= (
LEFTARG=_bpchar,
RIGHTARG=bpchar,
PROCEDURE=array_bpchareq
);
create operator **= (
leftarg=_bpchar,
rightarg=bpchar,
procedure=array_all_bpchareq);
CREATE OPERATOR **= (
LEFTARG=_bpchar,
RIGHTARG=bpchar,
PROCEDURE=array_all_bpchareq
);
create operator *~ (
leftarg=_bpchar,
rightarg=bpchar,
procedure=array_bpcharregexeq);
CREATE OPERATOR *~ (
LEFTARG=_bpchar,
RIGHTARG=bpchar,
PROCEDURE=array_bpcharregexeq
);
create operator **~ (
leftarg=_bpchar,
rightarg=bpchar,
procedure=array_all_bpcharregexeq);
CREATE OPERATOR **~ (
LEFTARG=_bpchar,
RIGHTARG=bpchar,
PROCEDURE=array_all_bpcharregexeq
);
-- define the array operators *=, **=, *> and **> for type _int4
--
create or replace function array_int4eq(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_int4eq(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_int4eq(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_int4eq(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_int4ne(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_int4ne(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_int4ne(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_int4ne(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_int4gt(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_int4gt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_int4gt(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_int4gt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_int4ge(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_int4ge(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_int4ge(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_int4ge(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_int4lt(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_int4lt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_int4lt(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_int4lt(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_int4le(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_int4le(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_int4le(_int4, int4) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_int4le(_int4, int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *= (
leftarg=_int4,
rightarg=int4,
procedure=array_int4eq);
CREATE OPERATOR *= (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_int4eq
);
create operator **= (
leftarg=_int4,
rightarg=int4,
procedure=array_all_int4eq);
CREATE OPERATOR **= (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_all_int4eq
);
create operator *<> (
leftarg=_int4,
rightarg=int4,
procedure=array_int4ne);
CREATE OPERATOR *<> (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_int4ne
);
create operator **<> (
leftarg=_int4,
rightarg=int4,
procedure=array_all_int4ne);
CREATE OPERATOR **<> (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_all_int4ne
);
create operator *> (
leftarg=_int4,
rightarg=int4,
procedure=array_int4gt);
CREATE OPERATOR *> (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_int4gt
);
create operator **> (
leftarg=_int4,
rightarg=int4,
procedure=array_all_int4gt);
CREATE OPERATOR **> (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_all_int4gt
);
create operator *>= (
leftarg=_int4,
rightarg=int4,
procedure=array_int4ge);
CREATE OPERATOR *>= (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_int4ge
);
create operator **>= (
leftarg=_int4,
rightarg=int4,
procedure=array_all_int4ge);
CREATE OPERATOR **>= (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_all_int4ge
);
create operator *< (
leftarg=_int4,
rightarg=int4,
procedure=array_int4lt);
CREATE OPERATOR *< (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_int4lt
);
create operator **< (
leftarg=_int4,
rightarg=int4,
procedure=array_all_int4lt);
CREATE OPERATOR **< (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_all_int4lt
);
create operator *<= (
leftarg=_int4,
rightarg=int4,
procedure=array_int4le);
CREATE OPERATOR *<= (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_int4le
);
create operator **<= (
leftarg=_int4,
rightarg=int4,
procedure=array_all_int4le);
CREATE OPERATOR **<= (
LEFTARG=_int4,
RIGHTARG=int4,
PROCEDURE=array_all_int4le
);
-- define the array operators *=, **<> for type _oid (added tobias 1. 1999)
--
create or replace function array_oideq(_oid, oid) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_oideq(_oid, oid)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_oidne(_oid, oid) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_oidne(_oid, oid)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *= (
leftarg=_oid,
rightarg=oid,
procedure=array_oideq);
CREATE OPERATOR *= (
LEFTARG=_oid,
RIGHTARG=oid,
PROCEDURE=array_oideq
);
create operator **<> (
leftarg=_oid,
rightarg=oid,
procedure=array_all_oidne);
CREATE OPERATOR **<> (
LEFTARG=_oid,
RIGHTARG=oid,
PROCEDURE=array_all_oidne
);
-- define the array operators *=, **=, *<>, **<> for type _inet
create or replace function array_ineteq(_inet, inet) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_ineteq(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_ineteq(_inet, inet) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_ineteq(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_inetne(_inet, inet) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_inetne(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create or replace function array_all_inetne(_inet, inet) returns bool
as 'MODULE_PATHNAME'
language C with (isStrict);
CREATE OR REPLACE FUNCTION array_all_inetne(_inet, inet)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
create operator *= (
leftarg=_inet,
rightarg=inet,
procedure=array_ineteq);
CREATE OPERATOR *= (
LEFTARG=_inet,
RIGHTARG=inet,
PROCEDURE=array_ineteq
);
create operator **= (
leftarg=_inet,
rightarg=inet,
procedure=array_all_ineteq);
CREATE OPERATOR **= (
LEFTARG=_inet,
RIGHTARG=inet,
PROCEDURE=array_all_ineteq
);
create operator *<> (
leftarg=_inet,
rightarg=inet,
procedure=array_inetne);
CREATE OPERATOR *<> (
LEFTARG=_inet,
RIGHTARG=inet,
PROCEDURE=array_inetne
);
create operator **<> (
leftarg=_inet,
rightarg=inet,
procedure=array_all_inetne);
CREATE OPERATOR **<> (
LEFTARG=_inet,
RIGHTARG=inet,
PROCEDURE=array_all_inetne
);

View File

@ -1,23 +1,23 @@
begin transaction;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
-- create type of int4 key
CREATE FUNCTION int4key_in(cstring)
RETURNS int4key
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'c' WITH (isstrict);
CREATE FUNCTION int4key_out(int4key)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'c' WITH (isstrict);
CREATE TYPE int4key (
internallength = 8,
input = int4key_in,
output = int4key_out
INTERNALLENGTH = 8,
INPUT = int4key_in,
OUTPUT = int4key_out
);
@ -29,23 +29,45 @@ output = int4key_out
--
--
-- define the GiST support methods
create function gint4_consistent(internal,int4,int2) returns bool as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gint4_consistent(internal,int4,int2)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gint4_compress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gint4_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function btree_decompress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION btree_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gint4_penalty(internal,internal,internal) returns internal as 'MODULE_PATHNAME' language 'C' with(isstrict);
CREATE FUNCTION gint4_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
create function gint4_picksplit(internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gint4_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gint4_union(bytea, internal) returns int4 as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gint4_union(bytea, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gint4_same(internal, internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gint4_same(internal, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Create the operator class
CREATE OPERATOR CLASS gist_int4_ops
DEFAULT FOR TYPE int4 USING gist AS
DEFAULT FOR TYPE int4 USING gist
AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
@ -73,34 +95,53 @@ CREATE OPERATOR CLASS gist_int4_ops
CREATE FUNCTION tskey_in(cstring)
RETURNS tskey
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'c' WITH (isstrict);
CREATE FUNCTION tskey_out(tskey)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'c' WITH (isstrict);
CREATE TYPE tskey (
internallength = 16,
input = tskey_in,
output = tskey_out
INTERNALLENGTH = 16,
INPUT = tskey_in,
OUTPUT = tskey_out
);
create function gts_consistent(internal,timestamp,int2) returns bool as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gts_consistent(internal,timestamp,int2)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gts_compress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gts_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gts_penalty(internal,internal,internal) returns internal as 'MODULE_PATHNAME' language 'C' with(isstrict);
CREATE FUNCTION gts_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
create function gts_picksplit(internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gts_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gts_union(bytea, internal) returns int4 as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gts_union(bytea, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gts_same(internal, internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gts_same(internal, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Create the operator class
CREATE OPERATOR CLASS gist_timestamp_ops
DEFAULT FOR TYPE timestamp USING gist AS
DEFAULT FOR TYPE timestamp USING gist
AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
@ -114,6 +155,3 @@ CREATE OPERATOR CLASS gist_timestamp_ops
FUNCTION 6 gts_picksplit (internal, internal),
FUNCTION 7 gts_same (internal, internal, internal),
STORAGE tskey;
end transaction;

View File

@ -7,35 +7,35 @@ psql:btree_gist.sql:10: WARNING: ProcedureCreate: type int4key is not yet defin
psql:btree_gist.sql:15: WARNING: Argument type "int4key" is only a shell
psql:btree_gist.sql:76: WARNING: ProcedureCreate: type tskey is not yet defined
psql:btree_gist.sql:81: WARNING: Argument type "tskey" is only a shell
create table inttmp (b int4);
CREATE TABLE inttmp (b int4);
\copy inttmp from 'data/test_btree.data'
create table tstmp ( t timestamp without time zone );
CREATE TABLE tstmp ( t timestamp without time zone );
\copy tstmp from 'data/test_btree_ts.data'
-- without idx
select count(*) from inttmp where b <=10;
SELECT count(*) FROM inttmp WHERE b <=10;
count
-------
11
(1 row)
select count(*) from tstmp where t < '2001-05-29 08:33:09';
SELECT count(*) FROM tstmp WHERE t < '2001-05-29 08:33:09';
count
-------
66
(1 row)
-- create idx
create index aaaidx on inttmp using gist ( b );
create index tsidx on tstmp using gist ( t );
CREATE INDEX aaaidx ON inttmp USING gist ( b );
CREATE INDEX tsidx ON tstmp USING gist ( t );
--with idx
set enable_seqscan=off;
select count(*) from inttmp where b <=10;
SET enable_seqscan=off;
SELECT count(*) FROM inttmp WHERE b <=10;
count
-------
11
(1 row)
select count(*) from tstmp where t < '2001-05-29 08:33:09';
SELECT count(*) FROM tstmp WHERE t < '2001-05-29 08:33:09';
count
-------
66

View File

@ -3,34 +3,35 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i btree_gist.sql
\set ECHO all
create table inttmp (b int4);
CREATE TABLE inttmp (b int4);
\copy inttmp from 'data/test_btree.data'
create table tstmp ( t timestamp without time zone );
CREATE TABLE tstmp ( t timestamp without time zone );
\copy tstmp from 'data/test_btree_ts.data'
-- without idx
select count(*) from inttmp where b <=10;
SELECT count(*) FROM inttmp WHERE b <=10;
select count(*) from tstmp where t < '2001-05-29 08:33:09';
SELECT count(*) FROM tstmp WHERE t < '2001-05-29 08:33:09';
-- create idx
create index aaaidx on inttmp using gist ( b );
CREATE INDEX aaaidx ON inttmp USING gist ( b );
create index tsidx on tstmp using gist ( t );
CREATE INDEX tsidx ON tstmp USING gist ( t );
--with idx
set enable_seqscan=off;
SET enable_seqscan=off;
select count(*) from inttmp where b <=10;
SELECT count(*) FROM inttmp WHERE b <=10;
select count(*) from tstmp where t < '2001-05-29 08:33:09';
SELECT count(*) FROM tstmp WHERE t < '2001-05-29 08:33:09';

View File

@ -4,7 +4,7 @@
-- darcy@druid.net
-- http://www.druid.net/darcy/
--
-- $Header: /cvsroot/pgsql/contrib/chkpass/chkpass.sql.in,v 1.2 2002/08/22 00:01:38 tgl Exp $
-- $Header: /cvsroot/pgsql/contrib/chkpass/chkpass.sql.in,v 1.3 2002/10/18 18:41:19 momjian Exp $
--
-- best viewed with tabs set to 4
--
@ -13,41 +13,46 @@
-- Input and output functions and the type itself:
--
create function chkpass_in(cstring)
returns chkpass
as 'MODULE_PATHNAME'
language 'c';
-- Adjust this setting to control where the objects get created.
SET search_path = public;
create function chkpass_out(chkpass)
returns cstring
as 'MODULE_PATHNAME'
language 'c';
SET autocommit TO 'on';
create type chkpass (
CREATE FUNCTION chkpass_in(cstring)
RETURNS chkpass
AS 'MODULE_PATHNAME'
LANGUAGE 'c';
CREATE FUNCTION chkpass_out(chkpass)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c';
CREATE TYPE chkpass (
internallength = 16,
externallength = 13,
input = chkpass_in,
output = chkpass_out
);
create function raw(chkpass)
returns text
as 'MODULE_PATHNAME', 'chkpass_rout'
language 'c';
CREATE FUNCTION raw(chkpass)
RETURNS text
AS 'MODULE_PATHNAME', 'chkpass_rout'
LANGUAGE 'c';
--
-- The various boolean tests:
--
create function eq(chkpass, text)
returns bool
as 'MODULE_PATHNAME', 'chkpass_eq'
language 'c';
CREATE FUNCTION eq(chkpass, text)
RETURNS bool
AS 'MODULE_PATHNAME', 'chkpass_eq'
LANGUAGE 'c';
create function ne(chkpass, text)
returns bool
as 'MODULE_PATHNAME', 'chkpass_ne'
language 'c';
CREATE FUNCTION ne(chkpass, text)
RETURNS bool
AS 'MODULE_PATHNAME', 'chkpass_ne'
LANGUAGE 'c';
--
-- Now the operators. Note how some of the parameters to some
@ -56,7 +61,7 @@ create function ne(chkpass, text)
-- will be implicitly defined when those are, further down.
--
create operator = (
CREATE OPERATOR = (
leftarg = chkpass,
rightarg = text,
commutator = =,
@ -64,7 +69,7 @@ create operator = (
procedure = eq
);
create operator <> (
CREATE OPERATOR <> (
leftarg = chkpass,
rightarg = text,
negator = =,

View File

@ -1,14 +1,15 @@
-- Create the user-defined type for N-dimensional boxes
--
BEGIN;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION cube_in(cstring)
RETURNS cube
AS 'MODULE_PATHNAME'
LANGUAGE 'c'IMMUTABLE STRICT;
LANGUAGE 'C' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_out(cube)
RETURNS cstring
@ -16,22 +17,20 @@ AS 'MODULE_PATHNAME'
LANGUAGE 'c'IMMUTABLE STRICT;
CREATE TYPE cube (
internallength = variable,
input = cube_in,
output = cube_out
INTERNALLENGTH = variable,
INPUT = cube_in,
OUTPUT = cube_out
);
COMMENT ON TYPE cube IS
'multi-dimensional cube ''(FLOAT-1, FLOAT-2, ..., FLOAT-N), (FLOAT-1, FLOAT-2, ..., FLOAT-N)''';
COMMENT ON TYPE cube IS 'multi-dimensional cube ''(FLOAT-1, FLOAT-2, ..., FLOAT-N), (FLOAT-1, FLOAT-2, ..., FLOAT-N)''';
-- Convert from text to cube
CREATE OR REPLACE FUNCTION cube(text) RETURNS cube
AS 'MODULE_PATHNAME'
LANGUAGE 'c' IMMUTABLE STRICT;
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube(text) IS
'convert text to cube';
COMMENT ON FUNCTION cube(text) IS 'convert text to cube';
--
-- External C-functions for R-tree methods
@ -39,208 +38,252 @@ COMMENT ON FUNCTION cube(text) IS
-- Left/Right methods
CREATE OR REPLACE FUNCTION cube_over_left(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_over_left(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_over_left(cube, cube) IS
'is over and left of (NOT IMPLEMENTED)';
COMMENT ON FUNCTION cube_over_left(cube, cube) IS 'is over and left of (NOT IMPLEMENTED)';
CREATE OR REPLACE FUNCTION cube_over_right(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_over_right(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_over_right(cube, cube) IS
'is over and right of (NOT IMPLEMENTED)';
COMMENT ON FUNCTION cube_over_right(cube, cube) IS 'is over and right of (NOT IMPLEMENTED)';
CREATE OR REPLACE FUNCTION cube_left(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_left(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_left(cube, cube) IS
'is left of (NOT IMPLEMENTED)';
CREATE OR REPLACE FUNCTION cube_right(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_right(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_right(cube, cube) IS
'is right of (NOT IMPLEMENTED)';
COMMENT ON FUNCTION cube_right(cube, cube) IS 'is right of (NOT IMPLEMENTED)';
-- Comparison methods
CREATE OR REPLACE FUNCTION cube_lt(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_lt(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_lt(cube, cube) IS
'lower than';
COMMENT ON FUNCTION cube_lt(cube, cube) IS 'lower than';
CREATE OR REPLACE FUNCTION cube_gt(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_gt(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_gt(cube, cube) IS
'greater than';
COMMENT ON FUNCTION cube_gt(cube, cube) IS 'greater than';
CREATE OR REPLACE FUNCTION cube_contains(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_contains(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_contains(cube, cube) IS
'contains';
COMMENT ON FUNCTION cube_contains(cube, cube) IS 'contains';
CREATE OR REPLACE FUNCTION cube_contained(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_contained(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_contained(cube, cube) IS
'contained in';
COMMENT ON FUNCTION cube_contained(cube, cube) IS 'contained in';
CREATE OR REPLACE FUNCTION cube_overlap(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_overlap(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_overlap(cube, cube) IS
'overlaps';
COMMENT ON FUNCTION cube_overlap(cube, cube) IS 'overlaps';
CREATE OR REPLACE FUNCTION cube_same(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_same(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_same(cube, cube) IS
'same as';
COMMENT ON FUNCTION cube_same(cube, cube) IS 'same as';
CREATE OR REPLACE FUNCTION cube_different(cube, cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_different(cube, cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
COMMENT ON FUNCTION cube_different(cube, cube) IS
'different';
COMMENT ON FUNCTION cube_different(cube, cube) IS 'different';
-- support routines for indexing
CREATE OR REPLACE FUNCTION cube_union(cube, cube) RETURNS cube
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_union(cube, cube)
RETURNS cube
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_inter(cube, cube) RETURNS cube
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_inter(cube, cube)
RETURNS cube
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_size(cube) RETURNS float8
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_size(cube)
RETURNS float8
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
-- Misc N-dimensional functions
-- proximity routines
CREATE OR REPLACE FUNCTION cube_distance(cube, cube) RETURNS float8
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_distance(cube, cube)
RETURNS float8
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
-- Extracting elements functions
CREATE OR REPLACE FUNCTION cube_dim(cube) RETURNS int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_dim(cube)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_ll_coord(cube, int4) RETURNS float8
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_ll_coord(cube, int4)
RETURNS float8
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_ur_coord(cube, int4) RETURNS float8
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_ur_coord(cube, int4)
RETURNS float8
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
-- Test if cube is also a point
CREATE OR REPLACE FUNCTION cube_is_point(cube) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_is_point(cube)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
-- Increasing the size of a cube by a radius in at least n dimensions
CREATE OR REPLACE FUNCTION cube_enlarge(cube, float8, int4) RETURNS cube
AS 'MODULE_PATHNAME' LANGUAGE 'c' IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION cube_enlarge(cube, float8, int4)
RETURNS cube
AS 'MODULE_PATHNAME'
LANGUAGE 'C' IMMUTABLE STRICT;
--
-- OPERATORS
--
CREATE OPERATOR < (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_lt,
COMMUTATOR = '>',
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_lt,
COMMUTATOR = '>',
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
);
CREATE OPERATOR > (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_gt,
COMMUTATOR = '<',
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_gt,
COMMUTATOR = '<',
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
);
CREATE OPERATOR << (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_left,
COMMUTATOR = '>>',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_left,
COMMUTATOR = '>>',
RESTRICT = positionsel, JOIN = positionjoinsel
);
CREATE OPERATOR &< (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_over_left,
COMMUTATOR = '&>',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_over_left,
COMMUTATOR = '&>',
RESTRICT = positionsel, JOIN = positionjoinsel
);
CREATE OPERATOR && (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_overlap,
COMMUTATOR = '&&',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_overlap,
COMMUTATOR = '&&',
RESTRICT = positionsel, JOIN = positionjoinsel
);
CREATE OPERATOR &> (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_over_right,
COMMUTATOR = '&<',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_over_right,
COMMUTATOR = '&<',
RESTRICT = positionsel, JOIN = positionjoinsel
);
CREATE OPERATOR >> (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_right,
COMMUTATOR = '<<',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_right,
COMMUTATOR = '<<',
RESTRICT = positionsel, JOIN = positionjoinsel
);
CREATE OPERATOR = (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_same,
COMMUTATOR = '=', NEGATOR = '<>',
RESTRICT = eqsel, JOIN = eqjoinsel,
SORT1 = '<', SORT2 = '<'
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_same,
COMMUTATOR = '=', NEGATOR = '<>',
RESTRICT = eqsel, JOIN = eqjoinsel,
SORT1 = '<', SORT2 = '<'
);
CREATE OPERATOR <> (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_different,
COMMUTATOR = '<>', NEGATOR = '=',
RESTRICT = neqsel, JOIN = neqjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_different,
COMMUTATOR = '<>', NEGATOR = '=',
RESTRICT = neqsel, JOIN = neqjoinsel
);
CREATE OPERATOR @ (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contains,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contains,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
);
CREATE OPERATOR ~ (
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contained,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contained,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
);
-- define the GiST support methods
CREATE OR REPLACE FUNCTION g_cube_consistent(internal,cube,int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE OR REPLACE FUNCTION g_cube_consistent(internal,cube,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION g_cube_compress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE OR REPLACE FUNCTION g_cube_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION g_cube_decompress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE OR REPLACE FUNCTION g_cube_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION g_cube_penalty(internal,internal,internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c' STRICT;
CREATE OR REPLACE FUNCTION g_cube_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' STRICT;
CREATE OR REPLACE FUNCTION g_cube_picksplit(internal, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE OR REPLACE FUNCTION g_cube_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION g_cube_union(bytea, internal) RETURNS cube
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE OR REPLACE FUNCTION g_cube_union(bytea, internal)
RETURNS cube
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION g_cube_same(cube, cube, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE OR REPLACE FUNCTION g_cube_same(cube, cube, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Create the operator class for indexing
@ -262,32 +305,3 @@ CREATE OPERATOR CLASS gist_cube_ops
FUNCTION 5 g_cube_penalty (internal, internal, internal),
FUNCTION 6 g_cube_picksplit (internal, internal),
FUNCTION 7 g_cube_same (cube, cube, internal);
--
-- By default the externally visible functions are made executable by
-- anyone. To restrict their access comment out the following grant commands.
--
GRANT EXECUTE ON FUNCTION cube(text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_over_left(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_over_right(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_left(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_right(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_lt(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_gt(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_contains(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_contained(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_overlap(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_same(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_different(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_union(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_inter(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_size(cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_distance(cube, cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_dim(cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_ll_coord(cube, int4) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_ur_coord(cube, int4) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_is_point(cube) TO PUBLIC;
GRANT EXECUTE ON FUNCTION cube_enlarge(cube, float8, int4) TO PUBLIC;
COMMIT;

View File

@ -6,8 +6,8 @@
-- does not depend on contents of cube.sql.
--
\set ECHO none
psql:cube.sql:11: WARNING: ProcedureCreate: type cube is not yet defined
psql:cube.sql:16: WARNING: Argument type "cube" is only a shell
psql:cube.sql:12: WARNING: ProcedureCreate: type cube is not yet defined
psql:cube.sql:17: WARNING: Argument type "cube" is only a shell
--
-- testing the input and output functions
--

View File

@ -7,6 +7,7 @@
-- does not depend on contents of cube.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i cube.sql
\set ECHO all

View File

@ -858,6 +858,10 @@ main(int argc, char **argv)
exit(1);
}
PQexec(conn, "SET search_path = public");
PQexec(conn, "SET autocommit TO 'on'");
/* Substitute field names */
do_substitute(subarg, dbh);

View File

@ -1,33 +1,43 @@
-- Uncomment the following 9 lines to use original DEPRECATED functions
--CREATE OR REPLACE FUNCTION dblink (text,text) RETURNS setof int
-- AS 'MODULE_PATHNAME','dblink' LANGUAGE 'c'
-- WITH (isstrict);
--CREATE OR REPLACE FUNCTION dblink_tok (int,int) RETURNS text
-- AS 'MODULE_PATHNAME','dblink_tok' LANGUAGE 'c'
-- WITH (isstrict);
--CREATE OR REPLACE FUNCTION dblink_last_oid (int) RETURNS oid
-- AS 'MODULE_PATHNAME','dblink_last_oid' LANGUAGE 'c'
-- WITH (isstrict);
--
-- Uncomment the following commented lines to use original DEPRECATED functions
--
--CREATE OR REPLACE FUNCTION dblink (text,text)
--RETURNS setof int
--AS 'MODULE_PATHNAME','dblink'
--LANGUAGE 'C' WITH (isstrict);
--CREATE OR REPLACE FUNCTION dblink_tok (int,int)
--RETURNS text
--AS 'MODULE_PATHNAME','dblink_tok'
--LANGUAGE 'C' WITH (isstrict);
--CREATE OR REPLACE FUNCTION dblink_last_oid (int)
--RETURNS oid
--AS 'MODULE_PATHNAME','dblink_last_oid'
--LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_connect (text) RETURNS text
AS 'MODULE_PATHNAME','dblink_connect' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_connect (text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_connect'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_disconnect () RETURNS text
AS 'MODULE_PATHNAME','dblink_disconnect' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_disconnect ()
RETURNS text
AS 'MODULE_PATHNAME','dblink_disconnect'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_open (text,text) RETURNS text
AS 'MODULE_PATHNAME','dblink_open' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_open (text,text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_open'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_fetch (text,int) RETURNS setof record
AS 'MODULE_PATHNAME','dblink_fetch' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_fetch (text,int)
RETURNS setof record
AS 'MODULE_PATHNAME','dblink_fetch'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_close (text) RETURNS text
AS 'MODULE_PATHNAME','dblink_close' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_close (text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_close'
LANGUAGE 'C' WITH (isstrict);
-- Note: if this is not a first time install of dblink, uncomment the
-- following DROP which prepares the database for the new, non-deprecated
@ -35,55 +45,49 @@ CREATE OR REPLACE FUNCTION dblink_close (text) RETURNS text
--DROP FUNCTION dblink (text,text);
-- Comment out the following 3 lines if the DEPRECATED functions are used.
CREATE OR REPLACE FUNCTION dblink (text,text) RETURNS setof record
AS 'MODULE_PATHNAME','dblink_record' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink (text,text)
RETURNS setof record
AS 'MODULE_PATHNAME','dblink_record'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink (text) RETURNS setof record
AS 'MODULE_PATHNAME','dblink_record' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink (text)
RETURNS setof record
AS 'MODULE_PATHNAME','dblink_record'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_exec (text,text) RETURNS text
AS 'MODULE_PATHNAME','dblink_exec' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_exec (text,text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_exec'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_exec (text) RETURNS text
AS 'MODULE_PATHNAME','dblink_exec' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_exec (text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_exec'
LANGUAGE 'c' WITH (isstrict);
CREATE TYPE dblink_pkey_results AS (position int4, colname text);
CREATE OR REPLACE FUNCTION dblink_get_pkey (text) RETURNS setof dblink_pkey_results
AS 'MODULE_PATHNAME','dblink_get_pkey' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_get_pkey (text)
RETURNS setof dblink_pkey_results
AS 'MODULE_PATHNAME','dblink_get_pkey'
LANGUAGE 'c' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) RETURNS text
AS 'MODULE_PATHNAME','dblink_build_sql_insert' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_build_sql_insert'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) RETURNS text
AS 'MODULE_PATHNAME','dblink_build_sql_delete' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_build_sql_delete'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) RETURNS text
AS 'MODULE_PATHNAME','dblink_build_sql_update' LANGUAGE 'c'
WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_current_query () RETURNS text
AS 'MODULE_PATHNAME','dblink_current_query' LANGUAGE 'c';
GRANT EXECUTE ON FUNCTION dblink_connect (text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_disconnect () TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_open (text,text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_fetch (text,int) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_close (text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink (text,text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink (text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_exec (text,text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_exec (text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_get_pkey (text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION dblink_current_query () TO PUBLIC;
CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text)
RETURNS text
AS 'MODULE_PATHNAME','dblink_build_sql_update'
LANGUAGE 'C' WITH (isstrict);
CREATE OR REPLACE FUNCTION dblink_current_query ()
RETURNS text
AS 'MODULE_PATHNAME','dblink_current_query'
LANGUAGE 'C';

View File

@ -4,7 +4,11 @@
--
-- This initial hackery is to allow successive runs without failures.
--
CREATE OR REPLACE FUNCTION conditional_drop() RETURNS text AS '
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION conditional_drop()
RETURNS text AS '
DECLARE
dbname text;
BEGIN
@ -26,28 +30,29 @@ CREATE DATABASE regression_slave;
-- Turn off echoing so that expected file does not depend on
-- contents of dblink.sql.
\set ECHO none
create table foo(f1 int, f2 text, f3 text[], primary key (f1,f2));
CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index 'foo_pkey' for table 'foo'
insert into foo values(0,'a','{"a0","b0","c0"}');
insert into foo values(1,'b','{"a1","b1","c1"}');
insert into foo values(2,'c','{"a2","b2","c2"}');
insert into foo values(3,'d','{"a3","b3","c3"}');
insert into foo values(4,'e','{"a4","b4","c4"}');
insert into foo values(5,'f','{"a5","b5","c5"}');
insert into foo values(6,'g','{"a6","b6","c6"}');
insert into foo values(7,'h','{"a7","b7","c7"}');
insert into foo values(8,'i','{"a8","b8","c8"}');
insert into foo values(9,'j','{"a9","b9","c9"}');
INSERT INTO foo VALUES (0,'a','{"a0","b0","c0"}');
INSERT INTO foo VALUES (1,'b','{"a1","b1","c1"}');
INSERT INTO foo VALUES (2,'c','{"a2","b2","c2"}');
INSERT INTO foo VALUES (3,'d','{"a3","b3","c3"}');
INSERT INTO foo VALUES (4,'e','{"a4","b4","c4"}');
INSERT INTO foo VALUES (5,'f','{"a5","b5","c5"}');
INSERT INTO foo VALUES (6,'g','{"a6","b6","c6"}');
INSERT INTO foo VALUES (7,'h','{"a7","b7","c7"}');
INSERT INTO foo VALUES (8,'i','{"a8","b8","c8"}');
INSERT INTO foo VALUES (9,'j','{"a9","b9","c9"}');
-- misc utilities
-- show the currently executing query
select 'hello' as hello, dblink_current_query() as query;
SELECT 'hello' AS hello, dblink_current_query() AS query;
hello | query
-------+-----------------------------------------------------------
hello | select 'hello' as hello, dblink_current_query() as query;
hello | SELECT 'hello' AS hello, dblink_current_query() AS query;
(1 row)
-- list the primary key fields
select * from dblink_get_pkey('foo');
SELECT *
FROM dblink_get_pkey('foo');
position | colname
----------+---------
1 | f1
@ -56,7 +61,7 @@ select * from dblink_get_pkey('foo');
-- build an insert statement based on a local tuple,
-- replacing the primary key values with new ones
select dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
SELECT dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
dblink_build_sql_insert
-----------------------------------------------------------
INSERT INTO foo(f1,f2,f3) VALUES('99','xyz','{a0,b0,c0}')
@ -64,14 +69,14 @@ select dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
-- build an update statement based on a local tuple,
-- replacing the primary key values with new ones
select dblink_build_sql_update('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
SELECT dblink_build_sql_update('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
dblink_build_sql_update
----------------------------------------------------------------------------------------
UPDATE foo SET f1 = '99', f2 = 'xyz', f3 = '{a0,b0,c0}' WHERE f1 = '99' AND f2 = 'xyz'
(1 row)
-- build a delete statement based on a local tuple,
select dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}');
SELECT dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}');
dblink_build_sql_delete
---------------------------------------------
DELETE FROM foo WHERE f1 = '0' AND f2 = 'a'
@ -85,7 +90,9 @@ select dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}');
\connect regression
\set ECHO none
-- regular old dblink
select * from dblink('dbname=regression_slave','select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('dbname=regression_slave','SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
a | b | c
---+---+------------
8 | i | {a8,b8,c8}
@ -93,17 +100,21 @@ select * from dblink('dbname=regression_slave','select * from foo') as t(a int,
(2 rows)
-- should generate "no connection available" error
select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
ERROR: dblink: no connection available
-- create a persistent connection
select dblink_connect('dbname=regression_slave');
SELECT dblink_connect('dbname=regression_slave');
dblink_connect
----------------
OK
(1 row)
-- use the persistent connection
select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
a | b | c
---+---+------------
8 | i | {a8,b8,c8}
@ -111,14 +122,15 @@ select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.
(2 rows)
-- open a cursor
select dblink_open('rmt_foo_cursor','select * from foo');
SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foo');
dblink_open
-------------
OK
(1 row)
-- fetch some data
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
a | b | c
---+---+------------
0 | a | {a0,b0,c0}
@ -127,7 +139,8 @@ select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
3 | d | {a3,b3,c3}
(4 rows)
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
a | b | c
---+---+------------
4 | e | {a4,b4,c4}
@ -137,7 +150,8 @@ select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
(4 rows)
-- this one only finds two rows left
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
a | b | c
---+---+------------
8 | i | {a8,b8,c8}
@ -145,35 +159,38 @@ select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
(2 rows)
-- close the cursor
select dblink_close('rmt_foo_cursor');
SELECT dblink_close('rmt_foo_cursor');
dblink_close
--------------
OK
(1 row)
-- should generate "cursor rmt_foo_cursor does not exist" error
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
ERROR: dblink_fetch: cursor rmt_foo_cursor does not exist
-- close the persistent connection
select dblink_disconnect();
SELECT dblink_disconnect();
dblink_disconnect
-------------------
OK
(1 row)
-- should generate "no connection available" error
select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
ERROR: dblink: no connection available
-- put more data into our slave table, first using arbitrary connection syntax
-- but truncate the actual return value so we can use diff to check for success
select substr(dblink_exec('dbname=regression_slave','insert into foo values(10,''k'',''{"a10","b10","c10"}'')'),1,6);
SELECT substr(dblink_exec('dbname=regression_slave','INSERT INTO foo VALUES (10,''k'',''{"a10","b10","c10"}'')'),1,6);
substr
--------
INSERT
(1 row)
-- create a persistent connection
select dblink_connect('dbname=regression_slave');
SELECT dblink_connect('dbname=regression_slave');
dblink_connect
----------------
OK
@ -181,14 +198,15 @@ select dblink_connect('dbname=regression_slave');
-- put more data into our slave table, using persistent connection syntax
-- but truncate the actual return value so we can use diff to check for success
select substr(dblink_exec('insert into foo values(11,''l'',''{"a11","b11","c11"}'')'),1,6);
SELECT substr(dblink_exec('INSERT INTO foo VALUES (11,''l'',''{"a11","b11","c11"}'')'),1,6);
substr
--------
INSERT
(1 row)
-- let's see it
select * from dblink('select * from foo') as t(a int, b text, c text[]);
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]);
a | b | c
----+---+---------------
0 | a | {a0,b0,c0}
@ -206,34 +224,38 @@ select * from dblink('select * from foo') as t(a int, b text, c text[]);
(12 rows)
-- change some data
select dblink_exec('update foo set f3[2] = ''b99'' where f1 = 11');
SELECT dblink_exec('UPDATE foo SET f3[2] = ''b99'' WHERE f1 = 11');
dblink_exec
-------------
UPDATE 1
(1 row)
-- let's see it
select * from dblink('select * from foo') as t(a int, b text, c text[]) where a = 11;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE a = 11;
a | b | c
----+---+---------------
11 | l | {a11,b99,c11}
(1 row)
-- delete some data
select dblink_exec('delete from foo where f1 = 11');
SELECT dblink_exec('DELETE FROM foo WHERE f1 = 11');
dblink_exec
-------------
DELETE 1
(1 row)
-- let's see it
select * from dblink('select * from foo') as t(a int, b text, c text[]) where a = 11;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE a = 11;
a | b | c
---+---+---
(0 rows)
-- close the persistent connection
select dblink_disconnect();
SELECT dblink_disconnect();
dblink_disconnect
-------------------
OK

View File

@ -4,7 +4,14 @@
--
-- This initial hackery is to allow successive runs without failures.
--
CREATE OR REPLACE FUNCTION conditional_drop() RETURNS text AS '
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION conditional_drop()
RETURNS text AS '
DECLARE
dbname text;
BEGIN
@ -26,36 +33,37 @@ CREATE DATABASE regression_slave;
\i dblink.sql
\set ECHO all
create table foo(f1 int, f2 text, f3 text[], primary key (f1,f2));
insert into foo values(0,'a','{"a0","b0","c0"}');
insert into foo values(1,'b','{"a1","b1","c1"}');
insert into foo values(2,'c','{"a2","b2","c2"}');
insert into foo values(3,'d','{"a3","b3","c3"}');
insert into foo values(4,'e','{"a4","b4","c4"}');
insert into foo values(5,'f','{"a5","b5","c5"}');
insert into foo values(6,'g','{"a6","b6","c6"}');
insert into foo values(7,'h','{"a7","b7","c7"}');
insert into foo values(8,'i','{"a8","b8","c8"}');
insert into foo values(9,'j','{"a9","b9","c9"}');
CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2));
INSERT INTO foo VALUES (0,'a','{"a0","b0","c0"}');
INSERT INTO foo VALUES (1,'b','{"a1","b1","c1"}');
INSERT INTO foo VALUES (2,'c','{"a2","b2","c2"}');
INSERT INTO foo VALUES (3,'d','{"a3","b3","c3"}');
INSERT INTO foo VALUES (4,'e','{"a4","b4","c4"}');
INSERT INTO foo VALUES (5,'f','{"a5","b5","c5"}');
INSERT INTO foo VALUES (6,'g','{"a6","b6","c6"}');
INSERT INTO foo VALUES (7,'h','{"a7","b7","c7"}');
INSERT INTO foo VALUES (8,'i','{"a8","b8","c8"}');
INSERT INTO foo VALUES (9,'j','{"a9","b9","c9"}');
-- misc utilities
-- show the currently executing query
select 'hello' as hello, dblink_current_query() as query;
SELECT 'hello' AS hello, dblink_current_query() AS query;
-- list the primary key fields
select * from dblink_get_pkey('foo');
SELECT *
FROM dblink_get_pkey('foo');
-- build an insert statement based on a local tuple,
-- replacing the primary key values with new ones
select dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
SELECT dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
-- build an update statement based on a local tuple,
-- replacing the primary key values with new ones
select dblink_build_sql_update('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
SELECT dblink_build_sql_update('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}');
-- build a delete statement based on a local tuple,
select dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}');
SELECT dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}');
--
-- Connect back to the regression database and define the functions.
@ -68,64 +76,82 @@ select dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}');
\set ECHO all
-- regular old dblink
select * from dblink('dbname=regression_slave','select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('dbname=regression_slave','SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
-- should generate "no connection available" error
select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
-- create a persistent connection
select dblink_connect('dbname=regression_slave');
SELECT dblink_connect('dbname=regression_slave');
-- use the persistent connection
select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
-- open a cursor
select dblink_open('rmt_foo_cursor','select * from foo');
SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foo');
-- fetch some data
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
-- this one only finds two rows left
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
-- close the cursor
select dblink_close('rmt_foo_cursor');
SELECT dblink_close('rmt_foo_cursor');
-- should generate "cursor rmt_foo_cursor does not exist" error
select * from dblink_fetch('rmt_foo_cursor',4) as t(a int, b text, c text[]);
SELECT *
FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]);
-- close the persistent connection
select dblink_disconnect();
SELECT dblink_disconnect();
-- should generate "no connection available" error
select * from dblink('select * from foo') as t(a int, b text, c text[]) where t.a > 7;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE t.a > 7;
-- put more data into our slave table, first using arbitrary connection syntax
-- but truncate the actual return value so we can use diff to check for success
select substr(dblink_exec('dbname=regression_slave','insert into foo values(10,''k'',''{"a10","b10","c10"}'')'),1,6);
SELECT substr(dblink_exec('dbname=regression_slave','INSERT INTO foo VALUES(10,''k'',''{"a10","b10","c10"}'')'),1,6);
-- create a persistent connection
select dblink_connect('dbname=regression_slave');
SELECT dblink_connect('dbname=regression_slave');
-- put more data into our slave table, using persistent connection syntax
-- but truncate the actual return value so we can use diff to check for success
select substr(dblink_exec('insert into foo values(11,''l'',''{"a11","b11","c11"}'')'),1,6);
SELECT substr(dblink_exec('INSERT INTO foo VALUES(11,''l'',''{"a11","b11","c11"}'')'),1,6);
-- let's see it
select * from dblink('select * from foo') as t(a int, b text, c text[]);
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]);
-- change some data
select dblink_exec('update foo set f3[2] = ''b99'' where f1 = 11');
SELECT dblink_exec('UPDATE foo SET f3[2] = ''b99'' WHERE f1 = 11');
-- let's see it
select * from dblink('select * from foo') as t(a int, b text, c text[]) where a = 11;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE a = 11;
-- delete some data
select dblink_exec('delete from foo where f1 = 11');
SELECT dblink_exec('DELETE FROM foo WHERE f1 = 11');
-- let's see it
select * from dblink('select * from foo') as t(a int, b text, c text[]) where a = 11;
SELECT *
FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[])
WHERE a = 11;
-- close the persistent connection
select dblink_disconnect();
SELECT dblink_disconnect();

View File

@ -1,5 +1,9 @@
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE TRIGGER "MyTableName_Trig" AFTER INSERT OR DELETE OR UPDATE
ON "MyTableName" FOR EACH ROW EXECUTE PROCEDURE
"recordchange" ();
SET autocommit TO 'on';
CREATE TRIGGER "MyTableName_Trig"
AFTER INSERT OR DELETE OR UPDATE ON "MyTableName"
FOR EACH ROW EXECUTE PROCEDURE "recordchange" ();

View File

@ -19,7 +19,7 @@
# GNU General Public License for more details.
#
##############################################################################
# $Id: DBMirror.pl,v 1.1 2002/06/23 21:58:07 momjian Exp $
# $Id: DBMirror.pl,v 1.2 2002/10/18 18:41:19 momjian Exp $
#
##############################################################################
@ -112,6 +112,23 @@ sub Main() {
die;
}
my $setQuery;
$setQuery = "SET search_path = public";
$setResult = $masterConn->exec($setQuery);
if($setResult->resultStatus!=PGRES_COMMAND_OK) {
logErrorMessage($masterConn->errorMessage . "\n" .
$setQuery);
die;
}
my $setQuery2;
$setQuery2 = "SET autocommit TO 'on'";
$setResult2 = $masterConn->exec($setQuery2);
if($setResult2->resultStatus!=PGRES_COMMAND_OK) {
logErrorMessage($masterConn->errorMessage . "\n" .
$setQuery2);
die;
}
my $firstTime = 1;
while(1) {
@ -127,6 +144,7 @@ sub Main() {
sendQueryToSlaves(undef,"SET autocommit TO 'on'");
sendQueryToSlaves(undef,"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");
sendQueryToSlaves(undef,"SET CONSTRAINTS ALL DEFERRED");
@ -703,7 +721,7 @@ sub openSlaveConnection($) {
$slaveConn = Pg::connectdb($slaveConnString);
if($slaveConn->status !=PGRES_CONNECTION_OK) {
if($slaveConn->status != PGRES_CONNECTION_OK) {
my $errorMessage = "Can't connect to slave database " ;
$errorMessage .= $slavePtr->{"slaveHost"} . "\n";
$errorMessage .= $slaveConn->errorMessage;

View File

@ -1,4 +1,6 @@
SET autocommit TO 'on';
CREATE FUNCTION "recordchange" () RETURNS trigger AS
'/usr/local/pgsql/lib/pending.so', 'recordchange' LANGUAGE 'C';

View File

@ -16,7 +16,7 @@
# GNU General Public License for more details.
#
##############################################################################
# $Id: clean_pending.pl,v 1.1 2002/06/23 21:58:08 momjian Exp $
# $Id: clean_pending.pl,v 1.2 2002/10/18 18:41:19 momjian Exp $
##############################################################################
@ -69,6 +69,10 @@ unless($dbConn->status == PGRES_CONNECTION_OK) {
printf("Can't connect to database\n");
die;
}
my $setresult = $dbConn->exec("SET autocommit TO 'on'");
unless($setresult->resultStatus == PGRES_COMMAND_OK) {
die $dbConn->errorMessage;
}
my $result = $dbConn->exec("BEGIN");
unless($result->resultStatus == PGRES_COMMAND_OK) {
die $dbConn->errorMessage;

View File

@ -1,24 +1,19 @@
begin;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
--------------- geo_distance
CREATE OR REPLACE FUNCTION geo_distance (point, point) RETURNS float8
LANGUAGE 'c' IMMUTABLE STRICT AS 'MODULE_PATHNAME';
CREATE OR REPLACE FUNCTION geo_distance (point, point)
RETURNS float8
LANGUAGE 'C' IMMUTABLE STRICT AS 'MODULE_PATHNAME';
--------------- geo_distance as operator <@>
CREATE OPERATOR <@> (
leftarg = point,
rightarg = point,
procedure = geo_distance,
commutator = <@>
LEFTARG = point,
RIGHTARG = point,
PROCEDURE = geo_distance,
COMMUTATOR = <@>
);
--
-- By default this function is made executable by anyone. To restrict
-- access by default, comment out the following grant command.
--
grant execute on function geo_distance(point, point) to public;
commit;

View File

@ -9,73 +9,73 @@
--
-- Test getting the distance between two points using geo_distance.
--
select geo_distance('(0,0)'::point,'(0,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(0,0)'::point)::numeric(20,5);
geo_distance
--------------
0.00000
(1 row)
select geo_distance('(0,0)'::point,'(180,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(180,0)'::point)::numeric(20,5);
geo_distance
--------------
12436.77274
(1 row)
select geo_distance('(0,0)'::point,'(0,90)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(0,90)'::point)::numeric(20,5);
geo_distance
--------------
6218.38637
(1 row)
select geo_distance('(0,0)'::point,'(90,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(90,0)'::point)::numeric(20,5);
geo_distance
--------------
6218.38637
(1 row)
select geo_distance('(0,0)'::point,'(1,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(1,0)'::point)::numeric(20,5);
geo_distance
--------------
69.09318
(1 row)
select geo_distance('(0,0)'::point,'(0,1)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(0,1)'::point)::numeric(20,5);
geo_distance
--------------
69.09318
(1 row)
select geo_distance('(0,30)'::point,'(1,30)'::point)::numeric(20,5);
SELECT geo_distance('(0,30)'::point,'(1,30)'::point)::numeric(20,5);
geo_distance
--------------
59.83626
(1 row)
select geo_distance('(0,30)'::point,'(0,31)'::point)::numeric(20,5);
SELECT geo_distance('(0,30)'::point,'(0,31)'::point)::numeric(20,5);
geo_distance
--------------
69.09318
(1 row)
select geo_distance('(0,60)'::point,'(1,60)'::point)::numeric(20,5);
SELECT geo_distance('(0,60)'::point,'(1,60)'::point)::numeric(20,5);
geo_distance
--------------
34.54626
(1 row)
select geo_distance('(0,60)'::point,'(0,61)'::point)::numeric(20,5);
SELECT geo_distance('(0,60)'::point,'(0,61)'::point)::numeric(20,5);
geo_distance
--------------
69.09318
(1 row)
select geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)::numeric(20,5);
SELECT geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)::numeric(20,5);
geo_distance
--------------
1129.18983
(1 row)
select (geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
SELECT (geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
numeric
---------------
1817254.87730
@ -84,73 +84,73 @@ select (geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)*5280.*12.*2.54/
--
-- Test getting the distance between two points using the <@> operator.
--
select ('(0,0)'::point <@> '(0,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(0,0)'::point)::numeric(20,5);
numeric
---------
0.00000
(1 row)
select ('(0,0)'::point <@> '(180,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(180,0)'::point)::numeric(20,5);
numeric
-------------
12436.77274
(1 row)
select ('(0,0)'::point <@> '(0,90)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(0,90)'::point)::numeric(20,5);
numeric
------------
6218.38637
(1 row)
select ('(0,0)'::point <@> '(90,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(90,0)'::point)::numeric(20,5);
numeric
------------
6218.38637
(1 row)
select ('(0,0)'::point <@> '(1,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(1,0)'::point)::numeric(20,5);
numeric
----------
69.09318
(1 row)
select ('(0,0)'::point <@> '(0,1)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(0,1)'::point)::numeric(20,5);
numeric
----------
69.09318
(1 row)
select ('(0,30)'::point <@> '(1,30)'::point)::numeric(20,5);
SELECT ('(0,30)'::point <@> '(1,30)'::point)::numeric(20,5);
numeric
----------
59.83626
(1 row)
select ('(0,30)'::point <@> '(0,31)'::point)::numeric(20,5);
SELECT ('(0,30)'::point <@> '(0,31)'::point)::numeric(20,5);
numeric
----------
69.09318
(1 row)
select ('(0,60)'::point <@> '(1,60)'::point)::numeric(20,5);
SELECT ('(0,60)'::point <@> '(1,60)'::point)::numeric(20,5);
numeric
----------
34.54626
(1 row)
select ('(0,60)'::point <@> '(0,61)'::point)::numeric(20,5);
SELECT ('(0,60)'::point <@> '(0,61)'::point)::numeric(20,5);
numeric
----------
69.09318
(1 row)
select ('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)::numeric(20,5);
SELECT ('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)::numeric(20,5);
numeric
------------
1129.18983
(1 row)
select (('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
SELECT (('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
numeric
---------------
1817254.87730

View File

@ -7,6 +7,7 @@
-- does not depend on contents of earthdistance.sql or cube.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i earthdistance.sql
\set ECHO all
@ -14,32 +15,32 @@
-- Test getting the distance between two points using geo_distance.
--
select geo_distance('(0,0)'::point,'(0,0)'::point)::numeric(20,5);
select geo_distance('(0,0)'::point,'(180,0)'::point)::numeric(20,5);
select geo_distance('(0,0)'::point,'(0,90)'::point)::numeric(20,5);
select geo_distance('(0,0)'::point,'(90,0)'::point)::numeric(20,5);
select geo_distance('(0,0)'::point,'(1,0)'::point)::numeric(20,5);
select geo_distance('(0,0)'::point,'(0,1)'::point)::numeric(20,5);
select geo_distance('(0,30)'::point,'(1,30)'::point)::numeric(20,5);
select geo_distance('(0,30)'::point,'(0,31)'::point)::numeric(20,5);
select geo_distance('(0,60)'::point,'(1,60)'::point)::numeric(20,5);
select geo_distance('(0,60)'::point,'(0,61)'::point)::numeric(20,5);
select geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)::numeric(20,5);
select (geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(0,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(180,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(0,90)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(90,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(1,0)'::point)::numeric(20,5);
SELECT geo_distance('(0,0)'::point,'(0,1)'::point)::numeric(20,5);
SELECT geo_distance('(0,30)'::point,'(1,30)'::point)::numeric(20,5);
SELECT geo_distance('(0,30)'::point,'(0,31)'::point)::numeric(20,5);
SELECT geo_distance('(0,60)'::point,'(1,60)'::point)::numeric(20,5);
SELECT geo_distance('(0,60)'::point,'(0,61)'::point)::numeric(20,5);
SELECT geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)::numeric(20,5);
SELECT (geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
--
-- Test getting the distance between two points using the <@> operator.
--
select ('(0,0)'::point <@> '(0,0)'::point)::numeric(20,5);
select ('(0,0)'::point <@> '(180,0)'::point)::numeric(20,5);
select ('(0,0)'::point <@> '(0,90)'::point)::numeric(20,5);
select ('(0,0)'::point <@> '(90,0)'::point)::numeric(20,5);
select ('(0,0)'::point <@> '(1,0)'::point)::numeric(20,5);
select ('(0,0)'::point <@> '(0,1)'::point)::numeric(20,5);
select ('(0,30)'::point <@> '(1,30)'::point)::numeric(20,5);
select ('(0,30)'::point <@> '(0,31)'::point)::numeric(20,5);
select ('(0,60)'::point <@> '(1,60)'::point)::numeric(20,5);
select ('(0,60)'::point <@> '(0,61)'::point)::numeric(20,5);
select ('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)::numeric(20,5);
select (('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(0,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(180,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(0,90)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(90,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(1,0)'::point)::numeric(20,5);
SELECT ('(0,0)'::point <@> '(0,1)'::point)::numeric(20,5);
SELECT ('(0,30)'::point <@> '(1,30)'::point)::numeric(20,5);
SELECT ('(0,30)'::point <@> '(0,31)'::point)::numeric(20,5);
SELECT ('(0,60)'::point <@> '(1,60)'::point)::numeric(20,5);
SELECT ('(0,60)'::point <@> '(0,61)'::point)::numeric(20,5);
SELECT ('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)::numeric(20,5);
SELECT (('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);

View File

@ -3,7 +3,7 @@
*
* Copyright 2002 by PostgreSQL Global Development Group
*
* $Header: /cvsroot/pgsql/contrib/findoidjoins/Attic/findoidjoins.c,v 1.18 2002/09/05 19:57:32 tgl Exp $
* $Header: /cvsroot/pgsql/contrib/findoidjoins/Attic/findoidjoins.c,v 1.19 2002/10/18 18:41:20 momjian Exp $
*/
#include "postgres_fe.h"
@ -48,6 +48,8 @@ main(int argc, char **argv)
resetPQExpBuffer(&sql);
appendPQExpBuffer(&sql, "%s",
"SET search_path = public;"
"SET autocommit TO 'on';"
"SELECT c.relname, (SELECT nspname FROM "
"pg_catalog.pg_namespace n WHERE n.oid = c.relnamespace) AS nspname "
"FROM pg_catalog.pg_class c "

View File

@ -166,6 +166,8 @@ sub main {
return 1;
}
PQexec($PG_CONN, "SET search_path = public");
PQexec($PG_CONN, "SET autocommit TO 'on'");
PQexec($PG_CONN, "begin");
$query = "declare C cursor for select (\"";

View File

@ -1,5 +1,8 @@
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION fti() RETURNS trigger AS
'MODULE_PATHNAME', 'fti'
LANGUAGE 'C' VOLATILE CALLED ON NULL INPUT;
GRANT EXECUTE ON FUNCTION fti() TO PUBLIC;

View File

@ -1 +1,6 @@
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
DROP FUNCTION fti() CASCADE;

View File

@ -1,16 +1,22 @@
CREATE FUNCTION levenshtein (text,text) RETURNS int
AS 'MODULE_PATHNAME','levenshtein' LANGUAGE 'c' with (iscachable, isstrict);
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION metaphone (text,int) RETURNS text
AS 'MODULE_PATHNAME','metaphone' LANGUAGE 'c' with (iscachable, isstrict);
SET autocommit TO 'on';
CREATE FUNCTION levenshtein (text,text)
RETURNS int
AS 'MODULE_PATHNAME','levenshtein'
LANGUAGE 'C' WITH (iscachable, isstrict);
CREATE FUNCTION metaphone (text,int)
RETURNS text
AS 'MODULE_PATHNAME','metaphone'
LANGUAGE 'C' WITH (iscachable, isstrict);
CREATE FUNCTION soundex(text) RETURNS text
AS 'MODULE_PATHNAME', 'soundex' LANGUAGE 'c' with (iscachable, isstrict);
AS 'MODULE_PATHNAME', 'soundex'
LANGUAGE 'C' WITH (iscachable, isstrict);
CREATE FUNCTION text_soundex(text) RETURNS text
AS 'MODULE_PATHNAME', 'soundex' LANGUAGE 'c';
GRANT EXECUTE ON FUNCTION levenshtein (text,text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION metaphone (text,int) TO PUBLIC;
GRANT EXECUTE ON FUNCTION soundex(text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION text_soundex(text) TO PUBLIC;
AS 'MODULE_PATHNAME', 'soundex'
LANGUAGE 'C';

View File

@ -1,28 +1,25 @@
-- Drop functions
drop aggregate int_array_aggregate(int4);
drop function int_agg_state (int4, int4);
drop function int_agg_final_array (int4);
drop function int_array_enum (int4[]);
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
-- Internal function for the aggregate
-- Is called for each item in an aggregation
create function int_agg_state (int4, int4)
returns int4
as 'MODULE_PATHNAME','int_agg_state'
language 'c';
CREATE OR REPLACE FUNCTION int_agg_state (int4, int4)
RETURNS int4
AS 'MODULE_PATHNAME','int_agg_state'
LANGUAGE 'C';
-- Internal function for the aggregate
-- Is called at the end of the aggregation, and returns an array.
create function int_agg_final_array (int4)
returns int4[]
as 'MODULE_PATHNAME','int_agg_final_array'
language 'c';
CREATE OR REPLACE FUNCTION int_agg_final_array (int4)
RETURNS int4[]
AS 'MODULE_PATHNAME','int_agg_final_array'
LANGUAGE 'C';
-- The aggration funcion.
-- uses the above functions to create an array of integers from an aggregation.
create aggregate int_array_aggregate
(
CREATE OR REPLACE AGGREGATE int_array_aggregate (
BASETYPE = int4,
SFUNC = int_agg_state,
STYPE = int4,
@ -33,8 +30,7 @@ create aggregate int_array_aggregate
-- The enumeration function
-- returns each element in a one dimentional integer array
-- as a row.
create function int_array_enum(int4[])
returns setof integer
as 'MODULE_PATHNAME','int_enum'
language 'c';
CREATE OR REPLACE FUNCTION int_array_enum(int4[])
RETURNS setof integer
AS 'MODULE_PATHNAME','int_enum'
LANGUAGE 'C';

View File

@ -1,53 +1,67 @@
--
-- Create the user-defined type for the 1-D integer arrays (_int4)
--
BEGIN TRANSACTION;
--
-- Adjust this setting to control where the operators, functions, and
-- opclasses get created.
SET search_path = public;
SET autocommit TO 'on';
-- Query type
CREATE FUNCTION bqarr_in(cstring)
RETURNS query_int
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION bqarr_out(query_int)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE TYPE query_int (
internallength = -1,
input = bqarr_in,
output = bqarr_out
INTERNALLENGTH = -1,
INPUT = bqarr_in,
OUTPUT = bqarr_out
);
--only for debug
CREATE FUNCTION querytree(query_int)
RETURNS text
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION boolop(_int4, query_int) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION boolop(_int4, query_int)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION boolop(_int4, query_int) IS 'boolean operation with array';
CREATE FUNCTION rboolop(query_int, _int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION rboolop(query_int, _int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION rboolop(query_int, _int4) IS 'boolean operation with array';
CREATE OPERATOR @@ (
LEFTARG = _int4, RIGHTARG = query_int, PROCEDURE = boolop,
COMMUTATOR = '~~', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = _int4,
RIGHTARG = query_int,
PROCEDURE = boolop,
COMMUTATOR = '~~',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~~ (
LEFTARG = query_int, RIGHTARG = _int4, PROCEDURE = rboolop,
COMMUTATOR = '@@', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = query_int,
RIGHTARG = _int4,
PROCEDURE = rboolop,
COMMUTATOR = '@@',
RESTRICT = contsel,
JOIN = contjoinsel
);
@ -57,175 +71,279 @@ CREATE OPERATOR ~~ (
-- Comparison methods
CREATE FUNCTION _int_contains(_int4, _int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_contains(_int4, _int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION _int_contains(_int4, _int4) IS 'contains';
CREATE FUNCTION _int_contained(_int4, _int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_contained(_int4, _int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION _int_contained(_int4, _int4) IS 'contained in';
CREATE FUNCTION _int_overlap(_int4, _int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_overlap(_int4, _int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION _int_overlap(_int4, _int4) IS 'overlaps';
CREATE FUNCTION _int_same(_int4, _int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_same(_int4, _int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION _int_same(_int4, _int4) IS 'same as';
CREATE FUNCTION _int_different(_int4, _int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_different(_int4, _int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
COMMENT ON FUNCTION _int_different(_int4, _int4) IS 'different';
-- support routines for indexing
CREATE FUNCTION _int_union(_int4, _int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_union(_int4, _int4)
RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION _int_inter(_int4, _int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION _int_inter(_int4, _int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
--
-- OPERATORS
--
CREATE OPERATOR && (
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_overlap,
COMMUTATOR = '&&',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = _int4,
RIGHTARG = _int4,
PROCEDURE = _int_overlap,
COMMUTATOR = '&&',
RESTRICT = contsel,
JOIN = contjoinsel
);
--CREATE OPERATOR = (
-- LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_same,
-- COMMUTATOR = '=', NEGATOR = '<>',
-- RESTRICT = eqsel, JOIN = eqjoinsel,
-- SORT1 = '<', SORT2 = '<'
-- LEFTARG = _int4,
-- RIGHTARG = _int4,
-- PROCEDURE = _int_same,
-- COMMUTATOR = '=',
-- NEGATOR = '<>',
-- RESTRICT = eqsel,
-- JOIN = eqjoinsel,
-- SORT1 = '<',
-- SORT2 = '<'
--);
CREATE OPERATOR <> (
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_different,
COMMUTATOR = '<>', NEGATOR = '=',
RESTRICT = neqsel, JOIN = neqjoinsel
LEFTARG = _int4,
RIGHTARG = _int4,
PROCEDURE = _int_different,
COMMUTATOR = '<>',
NEGATOR = '=',
RESTRICT = neqsel,
JOIN = neqjoinsel
);
CREATE OPERATOR @ (
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_contains,
COMMUTATOR = '~', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = _int4,
RIGHTARG = _int4,
PROCEDURE = _int_contains,
COMMUTATOR = '~',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~ (
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_contained,
COMMUTATOR = '@', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = _int4,
RIGHTARG = _int4,
PROCEDURE = _int_contained,
COMMUTATOR = '@',
RESTRICT = contsel,
JOIN = contjoinsel
);
--------------
CREATE FUNCTION intset(int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION intset(int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION icount(_int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION icount(_int4) RETURNS int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE OPERATOR # (
RIGHTARG = _int4, PROCEDURE = icount
RIGHTARG = _int4,
PROCEDURE = icount
);
CREATE FUNCTION sort(_int4, text) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION sort(_int4, text)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION sort(_int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION sort(_int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION sort_asc(_int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION sort_asc(_int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION sort_desc(_int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION sort_desc(_int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION uniq(_int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION uniq(_int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION idx(_int4, int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION idx(_int4, int4) RETURNS int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE OPERATOR # (
LEFTARG = _int4, RIGHTARG = int4, PROCEDURE = idx
LEFTARG = _int4,
RIGHTARG = int4,
PROCEDURE = idx
);
CREATE FUNCTION subarray(_int4, int4, int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION subarray(_int4, int4, int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION subarray(_int4, int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION subarray(_int4, int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION intarray_push_elem(_int4, int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE FUNCTION intarray_push_elem(_int4, int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE OPERATOR + (
LEFTARG = _int4, RIGHTARG = int4, PROCEDURE = intarray_push_elem
LEFTARG = _int4,
RIGHTARG = int4,
PROCEDURE = intarray_push_elem
);
CREATE FUNCTION intarray_push_array(_int4, _int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION intarray_push_array(_int4, _int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE OPERATOR + (
LEFTARG = _int4, RIGHTARG = _int4, COMMUTATOR = +, PROCEDURE = intarray_push_array
LEFTARG = _int4,
RIGHTARG = _int4,
COMMUTATOR = +,
PROCEDURE = intarray_push_array
);
CREATE FUNCTION intarray_del_elem(_int4, int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION intarray_del_elem(_int4, int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE OPERATOR - (
LEFTARG = _int4, RIGHTARG = int4, PROCEDURE = intarray_del_elem
LEFTARG = _int4,
RIGHTARG = int4,
PROCEDURE = intarray_del_elem
);
CREATE FUNCTION intset_union_elem(_int4, int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION intset_union_elem(_int4, int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE OPERATOR | (
LEFTARG = _int4, RIGHTARG = int4, PROCEDURE = intset_union_elem
LEFTARG = _int4,
RIGHTARG = int4,
PROCEDURE = intset_union_elem
);
CREATE OPERATOR | (
LEFTARG = _int4, RIGHTARG = _int4, COMMUTATOR = |, PROCEDURE = _int_union
LEFTARG = _int4,
RIGHTARG = _int4,
COMMUTATOR = |,
PROCEDURE = _int_union
);
CREATE FUNCTION intset_subtract(_int4, _int4) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c' WITH (isStrict, isCachable);
CREATE FUNCTION intset_subtract(_int4, _int4)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict, isCachable);
CREATE OPERATOR - (
LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = intset_subtract
LEFTARG = _int4,
RIGHTARG = _int4,
PROCEDURE = intset_subtract
);
CREATE OPERATOR & (
LEFTARG = _int4, RIGHTARG = _int4, COMMUTATOR = &, PROCEDURE = _int_inter
LEFTARG = _int4,
RIGHTARG = _int4,
COMMUTATOR = &,
PROCEDURE = _int_inter
);
--------------
-- define the GiST support methods
CREATE FUNCTION g_int_consistent(internal,_int4,int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_int_consistent(internal,_int4,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_int_compress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_int_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_int_decompress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_int_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_int_penalty(internal,internal,internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION g_int_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION g_int_picksplit(internal, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_int_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_int_union(bytea, internal) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_int_union(bytea, internal)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_int_same(_int4, _int4, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_int_same(_int4, _int4, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Create the operator class for indexing
CREATE OPERATOR CLASS gist__int_ops
DEFAULT FOR TYPE _int4 USING gist AS
DEFAULT FOR TYPE _int4 USING gist AS
OPERATOR 3 &&,
OPERATOR 6 = RECHECK,
OPERATOR 7 @,
@ -244,31 +362,46 @@ CREATE OPERATOR CLASS gist__int_ops
-- intbig
---------------------------------------------
-- define the GiST support methods
CREATE FUNCTION g_intbig_consistent(internal,_int4,int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_intbig_consistent(internal,_int4,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_intbig_compress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_intbig_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_intbig_decompress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_intbig_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_intbig_penalty(internal,internal,internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION g_intbig_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION g_intbig_picksplit(internal, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_intbig_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_intbig_union(bytea, internal) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_intbig_union(bytea, internal)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION g_intbig_same(_int4, _int4, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION g_intbig_same(_int4, _int4, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- register the opclass for indexing (not as default)
CREATE OPERATOR CLASS gist__intbig_ops
FOR TYPE _int4 USING gist AS
FOR TYPE _int4 USING gist
AS
OPERATOR 3 && RECHECK,
OPERATOR 6 = RECHECK,
OPERATOR 7 @ RECHECK,
@ -281,5 +414,3 @@ CREATE OPERATOR CLASS gist__intbig_ops
FUNCTION 5 g_intbig_penalty (internal, internal, internal),
FUNCTION 6 g_intbig_picksplit (internal, internal),
FUNCTION 7 g_intbig_same (_int4, _int4, internal);
END TRANSACTION;

View File

@ -3,364 +3,364 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
psql:_int.sql:13: WARNING: ProcedureCreate: type query_int is not yet defined
psql:_int.sql:18: WARNING: Argument type "query_int" is only a shell
select intset(1234);
psql:_int.sql:15: WARNING: ProcedureCreate: type query_int is not yet defined
psql:_int.sql:20: WARNING: Argument type "query_int" is only a shell
SELECT intset(1234);
intset
--------
{1234}
(1 row)
select icount('{1234234,234234}');
SELECT icount('{1234234,234234}');
icount
--------
2
(1 row)
select sort('{1234234,-30,234234}');
SELECT sort('{1234234,-30,234234}');
sort
----------------------
{-30,234234,1234234}
(1 row)
select sort('{1234234,-30,234234}','asc');
SELECT sort('{1234234,-30,234234}','asc');
sort
----------------------
{-30,234234,1234234}
(1 row)
select sort('{1234234,-30,234234}','desc');
SELECT sort('{1234234,-30,234234}','desc');
sort
----------------------
{1234234,234234,-30}
(1 row)
select sort_asc('{1234234,-30,234234}');
SELECT sort_asc('{1234234,-30,234234}');
sort_asc
----------------------
{-30,234234,1234234}
(1 row)
select sort_desc('{1234234,-30,234234}');
SELECT sort_desc('{1234234,-30,234234}');
sort_desc
----------------------
{1234234,234234,-30}
(1 row)
select uniq('{1234234,-30,-30,234234,-30}');
SELECT uniq('{1234234,-30,-30,234234,-30}');
uniq
--------------------------
{1234234,-30,234234,-30}
(1 row)
select uniq(sort_asc('{1234234,-30,-30,234234,-30}'));
SELECT uniq(sort_asc('{1234234,-30,-30,234234,-30}'));
uniq
----------------------
{-30,234234,1234234}
(1 row)
select idx('{1234234,-30,-30,234234,-30}',-30);
SELECT idx('{1234234,-30,-30,234234,-30}',-30);
idx
-----
2
(1 row)
select subarray('{1234234,-30,-30,234234,-30}',2,3);
SELECT subarray('{1234234,-30,-30,234234,-30}',2,3);
subarray
------------------
{-30,-30,234234}
(1 row)
select subarray('{1234234,-30,-30,234234,-30}',-1,1);
SELECT subarray('{1234234,-30,-30,234234,-30}',-1,1);
subarray
----------
{-30}
(1 row)
select subarray('{1234234,-30,-30,234234,-30}',0,-1);
SELECT subarray('{1234234,-30,-30,234234,-30}',0,-1);
subarray
--------------------------
{1234234,-30,-30,234234}
(1 row)
select #'{1234234,234234}'::int[];
SELECT #'{1234234,234234}'::int[];
?column?
----------
2
(1 row)
select '{123,623,445}'::int[] + 1245;
SELECT '{123,623,445}'::int[] + 1245;
?column?
--------------------
{123,623,445,1245}
(1 row)
select '{123,623,445}'::int[] + 445;
SELECT '{123,623,445}'::int[] + 445;
?column?
-------------------
{123,623,445,445}
(1 row)
select '{123,623,445}'::int[] + '{1245,87,445}';
SELECT '{123,623,445}'::int[] + '{1245,87,445}';
?column?
---------------------------
{123,623,445,1245,87,445}
(1 row)
select '{123,623,445}'::int[] - 623;
SELECT '{123,623,445}'::int[] - 623;
?column?
-----------
{123,445}
(1 row)
select '{123,623,445}'::int[] - '{1623,623}';
SELECT '{123,623,445}'::int[] - '{1623,623}';
?column?
-----------
{123,445}
(1 row)
select '{123,623,445}'::int[] | 623;
SELECT '{123,623,445}'::int[] | 623;
?column?
---------------
{123,445,623}
(1 row)
select '{123,623,445}'::int[] | 1623;
SELECT '{123,623,445}'::int[] | 1623;
?column?
--------------------
{123,445,623,1623}
(1 row)
select '{123,623,445}'::int[] | '{1623,623}';
SELECT '{123,623,445}'::int[] | '{1623,623}';
?column?
--------------------
{123,445,623,1623}
(1 row)
select '{123,623,445}'::int[] & '{1623,623}';
SELECT '{123,623,445}'::int[] & '{1623,623}';
?column?
----------
{623}
(1 row)
--test query_int
select '1'::query_int;
SELECT '1'::query_int;
query_int
-----------
1
(1 row)
select ' 1'::query_int;
SELECT ' 1'::query_int;
query_int
-----------
1
(1 row)
select '1 '::query_int;
SELECT '1 '::query_int;
query_int
-----------
1
(1 row)
select ' 1 '::query_int;
SELECT ' 1 '::query_int;
query_int
-----------
1
(1 row)
select ' ! 1 '::query_int;
SELECT ' ! 1 '::query_int;
query_int
-----------
!1
(1 row)
select '!1'::query_int;
SELECT '!1'::query_int;
query_int
-----------
!1
(1 row)
select '1|2'::query_int;
SELECT '1|2'::query_int;
query_int
-----------
1 | 2
(1 row)
select '1|!2'::query_int;
SELECT '1|!2'::query_int;
query_int
-----------
1 | !2
(1 row)
select '!1|2'::query_int;
SELECT '!1|2'::query_int;
query_int
-----------
!1 | 2
(1 row)
select '!1|!2'::query_int;
SELECT '!1|!2'::query_int;
query_int
-----------
!1 | !2
(1 row)
select '!(!1|!2)'::query_int;
SELECT '!(!1|!2)'::query_int;
query_int
--------------
!( !1 | !2 )
(1 row)
select '!(!1|2)'::query_int;
SELECT '!(!1|2)'::query_int;
query_int
-------------
!( !1 | 2 )
(1 row)
select '!(1|!2)'::query_int;
SELECT '!(1|!2)'::query_int;
query_int
-------------
!( 1 | !2 )
(1 row)
select '!(1|2)'::query_int;
SELECT '!(1|2)'::query_int;
query_int
------------
!( 1 | 2 )
(1 row)
select '1&2'::query_int;
SELECT '1&2'::query_int;
query_int
-----------
1 & 2
(1 row)
select '!1&2'::query_int;
SELECT '!1&2'::query_int;
query_int
-----------
!1 & 2
(1 row)
select '1&!2'::query_int;
SELECT '1&!2'::query_int;
query_int
-----------
1 & !2
(1 row)
select '!1&!2'::query_int;
SELECT '!1&!2'::query_int;
query_int
-----------
!1 & !2
(1 row)
select '(1&2)'::query_int;
SELECT '(1&2)'::query_int;
query_int
-----------
1 & 2
(1 row)
select '1&(2)'::query_int;
SELECT '1&(2)'::query_int;
query_int
-----------
1 & 2
(1 row)
select '!(1)&2'::query_int;
SELECT '!(1)&2'::query_int;
query_int
-----------
!1 & 2
(1 row)
select '!(1&2)'::query_int;
SELECT '!(1&2)'::query_int;
query_int
------------
!( 1 & 2 )
(1 row)
select '1|2&3'::query_int;
SELECT '1|2&3'::query_int;
query_int
-----------
1 | 2 & 3
(1 row)
select '1|(2&3)'::query_int;
SELECT '1|(2&3)'::query_int;
query_int
-----------
1 | 2 & 3
(1 row)
select '(1|2)&3'::query_int;
SELECT '(1|2)&3'::query_int;
query_int
---------------
( 1 | 2 ) & 3
(1 row)
select '1|2&!3'::query_int;
SELECT '1|2&!3'::query_int;
query_int
------------
1 | 2 & !3
(1 row)
select '1|!2&3'::query_int;
SELECT '1|!2&3'::query_int;
query_int
------------
1 | !2 & 3
(1 row)
select '!1|2&3'::query_int;
SELECT '!1|2&3'::query_int;
query_int
------------
!1 | 2 & 3
(1 row)
select '!1|(2&3)'::query_int;
SELECT '!1|(2&3)'::query_int;
query_int
------------
!1 | 2 & 3
(1 row)
select '!(1|2)&3'::query_int;
SELECT '!(1|2)&3'::query_int;
query_int
----------------
!( 1 | 2 ) & 3
(1 row)
select '(!1|2)&3'::query_int;
SELECT '(!1|2)&3'::query_int;
query_int
----------------
( !1 | 2 ) & 3
(1 row)
select '1|(2|(4|(5|6)))'::query_int;
SELECT '1|(2|(4|(5|6)))'::query_int;
query_int
-------------------------------
1 | ( 2 | ( 4 | ( 5 | 6 ) ) )
(1 row)
select '1|2|4|5|6'::query_int;
SELECT '1|2|4|5|6'::query_int;
query_int
-------------------------------
( ( ( 1 | 2 ) | 4 ) | 5 ) | 6
(1 row)
select '1&(2&(4&(5&6)))'::query_int;
SELECT '1&(2&(4&(5&6)))'::query_int;
query_int
-------------------
1 & 2 & 4 & 5 & 6
(1 row)
select '1&2&4&5&6'::query_int;
SELECT '1&2&4&5&6'::query_int;
query_int
-------------------
1 & 2 & 4 & 5 & 6
(1 row)
select '1&(2&(4&(5|6)))'::query_int;
SELECT '1&(2&(4&(5|6)))'::query_int;
query_int
-----------------------
1 & 2 & 4 & ( 5 | 6 )
(1 row)
select '1&(2&(4&(5|!6)))'::query_int;
SELECT '1&(2&(4&(5|!6)))'::query_int;
query_int
------------------------
1 & 2 & 4 & ( 5 | !6 )
@ -465,7 +465,7 @@ SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)';
21
(1 row)
drop index text_idx;
DROP INDEX text_idx;
CREATE INDEX text_idx on test__int using gist ( a gist__intbig_ops );
SELECT count(*) from test__int WHERE a && '{23,50}';
count

View File

@ -3,73 +3,74 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i _int.sql
\set ECHO all
select intset(1234);
select icount('{1234234,234234}');
select sort('{1234234,-30,234234}');
select sort('{1234234,-30,234234}','asc');
select sort('{1234234,-30,234234}','desc');
select sort_asc('{1234234,-30,234234}');
select sort_desc('{1234234,-30,234234}');
select uniq('{1234234,-30,-30,234234,-30}');
select uniq(sort_asc('{1234234,-30,-30,234234,-30}'));
select idx('{1234234,-30,-30,234234,-30}',-30);
select subarray('{1234234,-30,-30,234234,-30}',2,3);
select subarray('{1234234,-30,-30,234234,-30}',-1,1);
select subarray('{1234234,-30,-30,234234,-30}',0,-1);
SELECT intset(1234);
SELECT icount('{1234234,234234}');
SELECT sort('{1234234,-30,234234}');
SELECT sort('{1234234,-30,234234}','asc');
SELECT sort('{1234234,-30,234234}','desc');
SELECT sort_asc('{1234234,-30,234234}');
SELECT sort_desc('{1234234,-30,234234}');
SELECT uniq('{1234234,-30,-30,234234,-30}');
SELECT uniq(sort_asc('{1234234,-30,-30,234234,-30}'));
SELECT idx('{1234234,-30,-30,234234,-30}',-30);
SELECT subarray('{1234234,-30,-30,234234,-30}',2,3);
SELECT subarray('{1234234,-30,-30,234234,-30}',-1,1);
SELECT subarray('{1234234,-30,-30,234234,-30}',0,-1);
select #'{1234234,234234}'::int[];
select '{123,623,445}'::int[] + 1245;
select '{123,623,445}'::int[] + 445;
select '{123,623,445}'::int[] + '{1245,87,445}';
select '{123,623,445}'::int[] - 623;
select '{123,623,445}'::int[] - '{1623,623}';
select '{123,623,445}'::int[] | 623;
select '{123,623,445}'::int[] | 1623;
select '{123,623,445}'::int[] | '{1623,623}';
select '{123,623,445}'::int[] & '{1623,623}';
SELECT #'{1234234,234234}'::int[];
SELECT '{123,623,445}'::int[] + 1245;
SELECT '{123,623,445}'::int[] + 445;
SELECT '{123,623,445}'::int[] + '{1245,87,445}';
SELECT '{123,623,445}'::int[] - 623;
SELECT '{123,623,445}'::int[] - '{1623,623}';
SELECT '{123,623,445}'::int[] | 623;
SELECT '{123,623,445}'::int[] | 1623;
SELECT '{123,623,445}'::int[] | '{1623,623}';
SELECT '{123,623,445}'::int[] & '{1623,623}';
--test query_int
select '1'::query_int;
select ' 1'::query_int;
select '1 '::query_int;
select ' 1 '::query_int;
select ' ! 1 '::query_int;
select '!1'::query_int;
select '1|2'::query_int;
select '1|!2'::query_int;
select '!1|2'::query_int;
select '!1|!2'::query_int;
select '!(!1|!2)'::query_int;
select '!(!1|2)'::query_int;
select '!(1|!2)'::query_int;
select '!(1|2)'::query_int;
select '1&2'::query_int;
select '!1&2'::query_int;
select '1&!2'::query_int;
select '!1&!2'::query_int;
select '(1&2)'::query_int;
select '1&(2)'::query_int;
select '!(1)&2'::query_int;
select '!(1&2)'::query_int;
select '1|2&3'::query_int;
select '1|(2&3)'::query_int;
select '(1|2)&3'::query_int;
select '1|2&!3'::query_int;
select '1|!2&3'::query_int;
select '!1|2&3'::query_int;
select '!1|(2&3)'::query_int;
select '!(1|2)&3'::query_int;
select '(!1|2)&3'::query_int;
select '1|(2|(4|(5|6)))'::query_int;
select '1|2|4|5|6'::query_int;
select '1&(2&(4&(5&6)))'::query_int;
select '1&2&4&5&6'::query_int;
select '1&(2&(4&(5|6)))'::query_int;
select '1&(2&(4&(5|!6)))'::query_int;
SELECT '1'::query_int;
SELECT ' 1'::query_int;
SELECT '1 '::query_int;
SELECT ' 1 '::query_int;
SELECT ' ! 1 '::query_int;
SELECT '!1'::query_int;
SELECT '1|2'::query_int;
SELECT '1|!2'::query_int;
SELECT '!1|2'::query_int;
SELECT '!1|!2'::query_int;
SELECT '!(!1|!2)'::query_int;
SELECT '!(!1|2)'::query_int;
SELECT '!(1|!2)'::query_int;
SELECT '!(1|2)'::query_int;
SELECT '1&2'::query_int;
SELECT '!1&2'::query_int;
SELECT '1&!2'::query_int;
SELECT '!1&!2'::query_int;
SELECT '(1&2)'::query_int;
SELECT '1&(2)'::query_int;
SELECT '!(1)&2'::query_int;
SELECT '!(1&2)'::query_int;
SELECT '1|2&3'::query_int;
SELECT '1|(2&3)'::query_int;
SELECT '(1|2)&3'::query_int;
SELECT '1|2&!3'::query_int;
SELECT '1|!2&3'::query_int;
SELECT '!1|2&3'::query_int;
SELECT '!1|(2&3)'::query_int;
SELECT '!(1|2)&3'::query_int;
SELECT '(!1|2)&3'::query_int;
SELECT '1|(2|(4|(5|6)))'::query_int;
SELECT '1|2|4|5|6'::query_int;
SELECT '1&(2&(4&(5&6)))'::query_int;
SELECT '1&2&4&5&6'::query_int;
SELECT '1&(2&(4&(5|6)))'::query_int;
SELECT '1&(2&(4&(5|!6)))'::query_int;
CREATE TABLE test__int( a int[] );
@ -96,7 +97,7 @@ SELECT count(*) from test__int WHERE a @@ '50&68';
SELECT count(*) from test__int WHERE a @ '{20,23}' or a @ '{50,68}';
SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)';
drop index text_idx;
DROP INDEX text_idx;
CREATE INDEX text_idx on test__int using gist ( a gist__intbig_ops );
SELECT count(*) from test__int WHERE a && '{23,50}';
@ -107,4 +108,3 @@ SELECT count(*) from test__int WHERE a @ '{20,23}';
SELECT count(*) from test__int WHERE a @@ '50&68';
SELECT count(*) from test__int WHERE a @ '{20,23}' or a @ '{50,68}';
SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)';

View File

@ -1,35 +1,36 @@
--
-- PostgreSQL code for ISSNs.
--
-- $Id: isbn_issn.sql.in,v 1.6 2002/08/22 00:01:39 tgl Exp $
-- $Id: isbn_issn.sql.in,v 1.7 2002/10/18 18:41:20 momjian Exp $
--
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
--
-- Input and output functions and the type itself:
--
create function issn_in(cstring)
returns issn
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_in(cstring)
RETURNS issn
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function issn_out(issn)
returns cstring
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_out(issn)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create type issn (
internallength = 16,
externallength = 9,
input = issn_in,
output = issn_out
CREATE TYPE issn (
INTERNALLENGTH = 16,
EXTERNALLENGTH = 9,
INPUT = issn_in,
OUTPUT = issn_out
);
comment on type issn
COMMENT ON TYPE issn
is 'International Standard Serial Number';
@ -37,35 +38,35 @@ comment on type issn
-- The various boolean tests:
--
create function issn_lt(issn, issn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_lt(issn, issn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function issn_le(issn, issn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_le(issn, issn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function issn_eq(issn, issn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_eq(issn, issn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function issn_ge(issn, issn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_ge(issn, issn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function issn_gt(issn, issn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_gt(issn, issn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function issn_ne(issn, issn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION issn_ne(issn, issn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
--
-- Now the operators. Note how some of the parameters to some
@ -74,47 +75,47 @@ create function issn_ne(issn, issn)
-- will be implicitly defined when those are, further down.
--
create operator < (
leftarg = issn,
rightarg = issn,
-- negator = >=,
procedure = issn_lt
CREATE OPERATOR < (
LEFTARG = issn,
RIGHTARG = issn,
-- NEGATOR = >=,
PROCEDURE = issn_lt
);
create operator <= (
leftarg = issn,
rightarg = issn,
-- negator = >,
procedure = issn_le
CREATE OPERATOR <= (
LEFTARG = issn,
RIGHTARG = issn,
-- NEGATOR = >,
PROCEDURE = issn_le
);
create operator = (
leftarg = issn,
rightarg = issn,
commutator = =,
-- negator = <>,
procedure = issn_eq
CREATE OPERATOR = (
LEFTARG = issn,
RIGHTARG = issn,
COMMUTATOR = =,
-- NEGATOR = <>,
PROCEDURE = issn_eq
);
create operator >= (
leftarg = issn,
rightarg = issn,
negator = <,
procedure = issn_ge
CREATE OPERATOR >= (
LEFTARG = issn,
RIGHTARG = issn,
NEGATOR = <,
PROCEDURE = issn_ge
);
create operator > (
leftarg = issn,
rightarg = issn,
negator = <=,
procedure = issn_gt
CREATE OPERATOR > (
LEFTARG = issn,
RIGHTARG = issn,
NEGATOR = <=,
PROCEDURE = issn_gt
);
create operator <> (
leftarg = issn,
rightarg = issn,
negator = =,
procedure = issn_ne
CREATE OPERATOR <> (
LEFTARG = issn,
RIGHTARG = issn,
NEGATOR = =,
PROCEDURE = issn_ne
);
--
@ -123,66 +124,65 @@ create operator <> (
--
-- PostgreSQL code for ISBNs.
--
-- $Id: isbn_issn.sql.in,v 1.6 2002/08/22 00:01:39 tgl Exp $
-- $Id: isbn_issn.sql.in,v 1.7 2002/10/18 18:41:20 momjian Exp $
--
--
-- Input and output functions and the type itself:
--
create function isbn_in(cstring)
returns isbn
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_in(cstring)
RETURNS isbn
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function isbn_out(isbn)
returns cstring
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_out(isbn)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create type isbn (
internallength = 16,
externallength = 13,
input = isbn_in,
output = isbn_out
CREATE TYPE isbn (
INTERNALLENGTH = 16,
EXTERNALLENGTH = 13,
INPUT = isbn_in,
OUTPUT = isbn_out
);
comment on type isbn
is 'International Standard Book Number';
COMMENT ON TYPE isbn IS 'International Standard Book Number';
--
-- The various boolean tests:
--
create function isbn_lt(isbn, isbn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_lt(isbn, isbn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function isbn_le(isbn, isbn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_le(isbn, isbn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function isbn_eq(isbn, isbn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_eq(isbn, isbn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function isbn_ge(isbn, isbn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_ge(isbn, isbn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function isbn_gt(isbn, isbn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_gt(isbn, isbn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function isbn_ne(isbn, isbn)
returns bool
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION isbn_ne(isbn, isbn)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
--
-- Now the operators. Note how some of the parameters to some
@ -191,61 +191,61 @@ create function isbn_ne(isbn, isbn)
-- will be implicitly defined when those are, further down.
--
create operator < (
leftarg = isbn,
rightarg = isbn,
-- negator = >=,
procedure = isbn_lt
CREATE OPERATOR < (
LEFTARG = isbn,
RIGHTARG = isbn,
-- NEGATOR = >=,
PROCEDURE = isbn_lt
);
create operator <= (
leftarg = isbn,
rightarg = isbn,
-- negator = >,
procedure = isbn_le
CREATE OPERATOR <= (
LEFTARG = isbn,
RIGHTARG = isbn,
-- NEGATOR = >,
PROCEDURE = isbn_le
);
create operator = (
leftarg = isbn,
rightarg = isbn,
commutator = =,
-- negator = <>,
procedure = isbn_eq
CREATE OPERATOR = (
LEFTARG = isbn,
RIGHTARG = isbn,
COMMUTATOR = =,
-- NEGATOR = <>,
PROCEDURE = isbn_eq
);
create operator >= (
leftarg = isbn,
rightarg = isbn,
negator = <,
procedure = isbn_ge
CREATE OPERATOR >= (
LEFTARG = isbn,
RIGHTARG = isbn,
NEGATOR = <,
PROCEDURE = isbn_ge
);
create operator > (
leftarg = isbn,
rightarg = isbn,
negator = <=,
procedure = isbn_gt
CREATE OPERATOR > (
LEFTARG = isbn,
RIGHTARG = isbn,
NEGATOR = <=,
PROCEDURE = isbn_gt
);
create operator <> (
leftarg = isbn,
rightarg = isbn,
negator = =,
procedure = isbn_ne
CREATE OPERATOR <> (
LEFTARG = isbn,
RIGHTARG = isbn,
NEGATOR = =,
PROCEDURE = isbn_ne
);
-- Register 'isbn' comparison function
create function isbn_cmp(isbn, isbn)
returns integer
as '$libdir/isbn_issn'
language c;
CREATE FUNCTION isbn_cmp(isbn, isbn)
RETURNS integer
AS '$libdir/isbn_issn'
LANGUAGE c;
-- Register 'issn' comparison function
create function issn_cmp(issn, issn)
returns integer
as '$libdir/isbn_issn'
language c;
CREATE FUNCTION issn_cmp(issn, issn)
RETURNS integer
AS '$libdir/isbn_issn'
LANGUAGE c;
-------------------------------------------------
-- Create default operator class for 'isbn' --
@ -253,7 +253,8 @@ create function issn_cmp(issn, issn)
-------------------------------------------------
CREATE OPERATOR CLASS isbn_ops
DEFAULT FOR TYPE isbn USING btree AS
DEFAULT FOR TYPE isbn USING btree
AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
@ -267,7 +268,8 @@ CREATE OPERATOR CLASS isbn_ops
-------------------------------------------------
CREATE OPERATOR CLASS issn_ops
DEFAULT FOR TYPE issn USING btree AS
DEFAULT FOR TYPE issn USING btree
AS
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,

View File

@ -1,56 +1,62 @@
--
-- PostgreSQL code for LargeObjects
--
-- $Id: lo.sql.in,v 1.7 2002/08/22 00:01:39 tgl Exp $
-- $Id: lo.sql.in,v 1.8 2002/10/18 18:41:20 momjian Exp $
--
--
-- Create the data type
--
-- used by the lo type, it takes an oid and returns an lo object
create function lo_in(cstring)
returns lo
as 'MODULE_PATHNAME'
language 'c';
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE FUNCTION lo_in(cstring)
RETURNS lo
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- used by the lo type, it returns the oid of the object
create function lo_out(lo)
returns cstring
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION lo_out(lo)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- finally the type itself
create type lo (
internallength = 4,
externallength = variable,
input = lo_in,
output = lo_out
CREATE TYPE lo (
INTERNALLENGTH = 4,
EXTERNALLENGTH = variable,
INPUT = lo_in,
OUTPUT = lo_out
);
-- this returns the oid associated with a lo object
create function lo_oid(lo)
returns oid
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION lo_oid(lo)
RETURNS oid
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- same function, named to allow it to be used as a type coercion, eg:
-- create table a (image lo);
-- select image::oid from a;
-- CREATE TABLE a (image lo);
-- SELECT image::oid FROM a;
--
create function oid(lo)
returns oid
as 'MODULE_PATHNAME', 'lo_oid'
language 'c';
CREATE FUNCTION oid(lo)
RETURNS oid
AS 'MODULE_PATHNAME', 'lo_oid'
LANGUAGE 'C';
-- this allows us to convert an oid to a managed lo object
-- ie: insert into test values (lo_import('/fullpath/file')::lo);
create function lo(oid)
returns lo
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION lo(oid)
RETURNS lo
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- This is used in triggers
create function lo_manage()
returns trigger
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION lo_manage()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -3,13 +3,18 @@
-- It's used just for development
--
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
-- remove our test table
drop table a;
DROP TABLE a;
-- now drop the type and associated C functions
drop type lo CASCADE;
DROP TYPE lo CASCADE;
-- the trigger function has no dependency on the type, so drop separately
drop function lo_manage();
DROP FUNCTION lo_manage();
-- the lo stuff is now removed from the system

View File

@ -5,53 +5,65 @@
--
-- ignore any errors here - simply drop the table if it already exists
drop table a;
DROP TABLE a;
-- create the test table
create table a (fname name,image lo);
CREATE TABLE a (fname name,image lo);
-- insert a null object
insert into a values ('null');
INSERT INTO a VALUES ('null');
-- insert an empty large object
insert into a values ('empty','');
INSERT INTO a VALUES ('empty','');
-- insert a large object based on a file
insert into a values ('/etc/group',lo_import('/etc/group')::lo);
INSERT INTO a VALUES ('/etc/group',lo_import('/etc/group')::lo);
-- now select the table
select * from a;
SELECT * FROM a;
-- this select also returns an oid based on the lo column
select *,image::oid from a;
SELECT *,image::oid from a;
-- now test the trigger
create trigger t_a before update or delete on a for each row execute procedure lo_manage(image);
CREATE TRIGGER t_a
BEFORE UPDATE OR DELETE ON a
FOR EACH ROW
EXECUTE PROCEDURE lo_manage(image);
-- insert
insert into a values ('aa','');
select * from a where fname like 'aa%';
INSERT INTO a VALUES ('aa','');
SELECT * FROM a
WHERE fname LIKE 'aa%';
-- update
update a set image=lo_import('/etc/group')::lo where fname='aa';
select * from a where fname like 'aa%';
UPDATE a SET image=lo_import('/etc/group')::lo
WHERE fname='aa';
SELECT * FROM a
WHERE fname LIKE 'aa%';
-- update the 'empty' row which should be null
update a set image=lo_import('/etc/hosts')::lo where fname='empty';
select * from a where fname like 'empty%';
update a set image=null where fname='empty';
select * from a where fname like 'empty%';
UPDATE a SET image=lo_import('/etc/hosts')::lo
WHERE fname='empty';
SELECT * FROM a
WHERE fname LIKE 'empty%';
UPDATE a SET image=null
WHERE fname='empty';
SELECT * FROM a
WHERE fname LIKE 'empty%';
-- delete the entry
delete from a where fname='aa';
select * from a where fname like 'aa%';
DELETE FROM a
WHERE fname='aa';
SELECT * FROM a
WHERE fname LIKE 'aa%';
-- This deletes the table contents. Note, if you comment this out, and
-- expect the drop table to remove the objects, think again. The trigger
-- doesn't get thrown by drop table.
delete from a;
DELETE FROM a;
-- finally drop the table
drop table a;
DROP TABLE a;
-- end of tests

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +1,23 @@
BEGIN;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE FUNCTION ltree_in(cstring)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION ltree_out(ltree)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE TYPE ltree (
internallength = -1,
input = ltree_in,
output = ltree_out,
storage = extended
INTERNALLENGTH = -1,
INPUT = ltree_in,
OUTPUT = ltree_out,
STORAGE = extended
);
@ -25,74 +25,99 @@ storage = extended
CREATE FUNCTION ltree_cmp(ltree,ltree)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_lt(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_le(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_eq(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_ge(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_gt(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_ne(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR < (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_lt,
COMMUTATOR = '>', NEGATOR = '>=',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_lt,
COMMUTATOR = '>',
NEGATOR = '>=',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR <= (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_le,
COMMUTATOR = '>=', NEGATOR = '>',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_le,
COMMUTATOR = '>=',
NEGATOR = '>',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR >= (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_ge,
COMMUTATOR = '<=', NEGATOR = '<',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_ge,
COMMUTATOR = '<=',
NEGATOR = '<',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR > (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_gt,
COMMUTATOR = '<', NEGATOR = '<=',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_gt,
COMMUTATOR = '<',
NEGATOR = '<=',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR = (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_eq,
COMMUTATOR = '=', NEGATOR = '<>',
RESTRICT = eqsel, JOIN = eqjoinsel,
SORT1 = '<', SORT2 = '<'
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_eq,
COMMUTATOR = '=',
NEGATOR = '<>',
RESTRICT = eqsel,
JOIN = eqjoinsel,
SORT1 = '<',
SORT2 = '<'
);
CREATE OPERATOR <> (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_ne,
COMMUTATOR = '<>', NEGATOR = '=',
RESTRICT = neqsel, JOIN = neqjoinsel
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_ne,
COMMUTATOR = '<>',
NEGATOR = '=',
RESTRICT = neqsel,
JOIN = neqjoinsel
);
--util functions
@ -100,122 +125,140 @@ CREATE OPERATOR <> (
CREATE FUNCTION subltree(ltree,int4,int4)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION subpath(ltree,int4,int4)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION subpath(ltree,int4)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION nlevel(ltree)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(_ltree)
RETURNS ltree
AS 'MODULE_PATHNAME','_lca'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree,ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree,ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree,ltree,ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_isparent(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_risparent(ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_addltree(ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_addtext(ltree,text)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltree_textadd(text,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR @> (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_isparent,
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_isparent,
COMMUTATOR = '<@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^@> (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_isparent,
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_isparent,
COMMUTATOR = '^<@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR <@ (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_risparent,
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_risparent,
COMMUTATOR = '@>',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^<@ (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_risparent,
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_risparent,
COMMUTATOR = '^@>',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR || (
LEFTARG = ltree, RIGHTARG = ltree, PROCEDURE = ltree_addltree
LEFTARG = ltree,
RIGHTARG = ltree,
PROCEDURE = ltree_addltree
);
CREATE OPERATOR || (
LEFTARG = ltree, RIGHTARG = text, PROCEDURE = ltree_addtext
LEFTARG = ltree,
RIGHTARG = text,
PROCEDURE = ltree_addtext
);
CREATE OPERATOR || (
LEFTARG = text, RIGHTARG = ltree, PROCEDURE = ltree_textadd
LEFTARG = text,
RIGHTARG = ltree,
PROCEDURE = ltree_textadd
);
@ -235,135 +278,166 @@ CREATE OPERATOR CLASS ltree_ops
CREATE FUNCTION lquery_in(cstring)
RETURNS lquery
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION lquery_out(lquery)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE TYPE lquery (
internallength = -1,
input = lquery_in,
output = lquery_out,
storage = extended
INTERNALLENGTH = -1,
INPUT = lquery_in,
OUTPUT = lquery_out,
STORAGE = extended
);
CREATE FUNCTION ltq_regex(ltree,lquery)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION ltq_rregex(lquery,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR ~ (
LEFTARG = ltree, RIGHTARG = lquery, PROCEDURE = ltq_regex,
LEFTARG = ltree,
RIGHTARG = lquery,
PROCEDURE = ltq_regex,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~ (
LEFTARG = lquery, RIGHTARG = ltree, PROCEDURE = ltq_rregex,
LEFTARG = lquery,
RIGHTARG = ltree,
PROCEDURE = ltq_rregex,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
--not-indexed
CREATE OPERATOR ^~ (
LEFTARG = ltree, RIGHTARG = lquery, PROCEDURE = ltq_regex,
LEFTARG = ltree,
RIGHTARG = lquery,
PROCEDURE = ltq_regex,
COMMUTATOR = '^~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^~ (
LEFTARG = lquery, RIGHTARG = ltree, PROCEDURE = ltq_rregex,
LEFTARG = lquery,
RIGHTARG = ltree,
PROCEDURE = ltq_rregex,
COMMUTATOR = '^~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE FUNCTION ltxtq_in(cstring)
RETURNS ltxtquery
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION ltxtq_out(ltxtquery)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE TYPE ltxtquery (
internallength = -1,
input = ltxtq_in,
output = ltxtq_out,
storage = extended
INTERNALLENGTH = -1,
INPUT = ltxtq_in,
OUTPUT = ltxtq_out,
STORAGE = extended
);
-- operations with ltxtquery
-- operations WITH ltxtquery
CREATE FUNCTION ltxtq_exec(ltree, ltxtquery)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict, iscachable);
LANGUAGE 'C' WITH (isstrict, iscachable);
CREATE FUNCTION ltxtq_rexec(ltxtquery, ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict, iscachable);
LANGUAGE 'C' WITH (isstrict, iscachable);
CREATE OPERATOR @ (
LEFTARG = ltree, RIGHTARG = ltxtquery, PROCEDURE = ltxtq_exec,
LEFTARG = ltree,
RIGHTARG = ltxtquery,
PROCEDURE = ltxtq_exec,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR @ (
LEFTARG = ltxtquery, RIGHTARG = ltree, PROCEDURE = ltxtq_rexec,
LEFTARG = ltxtquery,
RIGHTARG = ltree,
PROCEDURE = ltxtq_rexec,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
--not-indexed
CREATE OPERATOR ^@ (
LEFTARG = ltree, RIGHTARG = ltxtquery, PROCEDURE = ltxtq_exec,
LEFTARG = ltree,
RIGHTARG = ltxtquery,
PROCEDURE = ltxtq_exec,
COMMUTATOR = '^@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^@ (
LEFTARG = ltxtquery, RIGHTARG = ltree, PROCEDURE = ltxtq_rexec,
LEFTARG = ltxtquery,
RIGHTARG = ltree,
PROCEDURE = ltxtq_rexec,
COMMUTATOR = '^@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
--GiST support for ltree
CREATE FUNCTION ltree_gist_in(cstring)
RETURNS ltree_gist
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE FUNCTION ltree_gist_out(ltree_gist)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' WITH (isstrict);
CREATE TYPE ltree_gist (
internallength = -1,
input = ltree_gist_in,
output = ltree_gist_out,
storage = plain
);
);
create function ltree_consistent(internal,internal,int2) returns bool as 'MODULE_PATHNAME' language 'C';
create function ltree_compress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
create function ltree_decompress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
create function ltree_penalty(internal,internal,internal) returns internal as 'MODULE_PATHNAME' language 'C' with(isstrict);
create function ltree_picksplit(internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
create function ltree_union(bytea, internal) returns int4 as 'MODULE_PATHNAME' language 'C';
create function ltree_same(internal, internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION ltree_consistent(internal,internal,int2)
RETURNS bool as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION ltree_compress(internal)
RETURNS internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION ltree_decompress(internal)
RETURNS internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION ltree_penalty(internal,internal,internal)
RETURNS internal as 'MODULE_PATHNAME' language 'C' with(isstrict);
CREATE FUNCTION ltree_picksplit(internal, internal)
RETURNS internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION ltree_union(bytea, internal)
RETURNS int4 as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION ltree_same(internal, internal, internal)
RETURNS internal as 'MODULE_PATHNAME' language 'C';
CREATE OPERATOR CLASS gist_ltree_ops
DEFAULT FOR TYPE ltree USING gist AS
@ -393,185 +467,259 @@ CREATE OPERATOR CLASS gist_ltree_ops
CREATE FUNCTION _ltree_isparent(_ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION _ltree_r_isparent(ltree,_ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION _ltree_risparent(_ltree,ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION _ltree_r_risparent(ltree,_ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION _ltq_regex(_ltree,lquery)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION _ltq_rregex(lquery,_ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE FUNCTION _ltxtq_exec(_ltree, ltxtquery)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict, iscachable);
LANGUAGE 'C' WITH (isstrict, iscachable);
CREATE FUNCTION _ltxtq_rexec(ltxtquery, _ltree)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict, iscachable);
LANGUAGE 'C' WITH (isstrict, iscachable);
CREATE OPERATOR @> (
LEFTARG = _ltree, RIGHTARG = ltree, PROCEDURE = _ltree_isparent,
LEFTARG = _ltree,
RIGHTARG = ltree,
PROCEDURE = _ltree_isparent,
COMMUTATOR = '<@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR <@ (
LEFTARG = ltree, RIGHTARG = _ltree, PROCEDURE = _ltree_r_isparent,
LEFTARG = ltree,
RIGHTARG = _ltree,
PROCEDURE = _ltree_r_isparent,
COMMUTATOR = '@>',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR <@ (
LEFTARG = _ltree, RIGHTARG = ltree, PROCEDURE = _ltree_risparent,
LEFTARG = _ltree,
RIGHTARG = ltree,
PROCEDURE = _ltree_risparent,
COMMUTATOR = '@>',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR @> (
LEFTARG = ltree, RIGHTARG = _ltree, PROCEDURE = _ltree_r_risparent,
LEFTARG = ltree,
RIGHTARG = _ltree,
PROCEDURE = _ltree_r_risparent,
COMMUTATOR = '<@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~ (
LEFTARG = _ltree, RIGHTARG = lquery, PROCEDURE = _ltq_regex,
LEFTARG = _ltree,
RIGHTARG = lquery,
PROCEDURE = _ltq_regex,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~ (
LEFTARG = lquery, RIGHTARG = _ltree, PROCEDURE = _ltq_rregex,
LEFTARG = lquery,
RIGHTARG = _ltree,
PROCEDURE = _ltq_rregex,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR @ (
LEFTARG = _ltree, RIGHTARG = ltxtquery, PROCEDURE = _ltxtq_exec,
LEFTARG = _ltree,
RIGHTARG = ltxtquery,
PROCEDURE = _ltxtq_exec,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR @ (
LEFTARG = ltxtquery, RIGHTARG = _ltree, PROCEDURE = _ltxtq_rexec,
LEFTARG = ltxtquery,
RIGHTARG = _ltree,
PROCEDURE = _ltxtq_rexec,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
--not indexed
CREATE OPERATOR ^@> (
LEFTARG = _ltree, RIGHTARG = ltree, PROCEDURE = _ltree_isparent,
LEFTARG = _ltree,
RIGHTARG = ltree,
PROCEDURE = _ltree_isparent,
COMMUTATOR = '^<@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^<@ (
LEFTARG = ltree, RIGHTARG = _ltree, PROCEDURE = _ltree_r_isparent,
LEFTARG = ltree,
RIGHTARG = _ltree,
PROCEDURE = _ltree_r_isparent,
COMMUTATOR = '^@>',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^<@ (
LEFTARG = _ltree, RIGHTARG = ltree, PROCEDURE = _ltree_risparent,
LEFTARG = _ltree,
RIGHTARG = ltree,
PROCEDURE = _ltree_risparent,
COMMUTATOR = '^@>',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^@> (
LEFTARG = ltree, RIGHTARG = _ltree, PROCEDURE = _ltree_r_risparent,
LEFTARG = ltree,
RIGHTARG = _ltree,
PROCEDURE = _ltree_r_risparent,
COMMUTATOR = '^<@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^~ (
LEFTARG = _ltree, RIGHTARG = lquery, PROCEDURE = _ltq_regex,
LEFTARG = _ltree,
RIGHTARG = lquery,
PROCEDURE = _ltq_regex,
COMMUTATOR = '^~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^~ (
LEFTARG = lquery, RIGHTARG = _ltree, PROCEDURE = _ltq_rregex,
LEFTARG = lquery,
RIGHTARG = _ltree,
PROCEDURE = _ltq_rregex,
COMMUTATOR = '^~',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^@ (
LEFTARG = _ltree, RIGHTARG = ltxtquery, PROCEDURE = _ltxtq_exec,
LEFTARG = _ltree,
RIGHTARG = ltxtquery,
PROCEDURE = _ltxtq_exec,
COMMUTATOR = '^@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ^@ (
LEFTARG = ltxtquery, RIGHTARG = _ltree, PROCEDURE = _ltxtq_rexec,
LEFTARG = ltxtquery,
RIGHTARG = _ltree,
PROCEDURE = _ltxtq_rexec,
COMMUTATOR = '^@',
RESTRICT = contsel, JOIN = contjoinsel
RESTRICT = contsel,
JOIN = contjoinsel
);
--extractors
CREATE FUNCTION _ltree_extract_isparent(_ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR ?@> (
LEFTARG = _ltree, RIGHTARG = ltree, PROCEDURE = _ltree_extract_isparent
LEFTARG = _ltree,
RIGHTARG = ltree,
PROCEDURE = _ltree_extract_isparent
);
CREATE FUNCTION _ltree_extract_risparent(_ltree,ltree)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR ?<@ (
LEFTARG = _ltree, RIGHTARG = ltree, PROCEDURE = _ltree_extract_risparent
LEFTARG = _ltree,
RIGHTARG = ltree,
PROCEDURE = _ltree_extract_risparent
);
CREATE FUNCTION _ltq_extract_regex(_ltree,lquery)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR ?~ (
LEFTARG = _ltree, RIGHTARG = lquery, PROCEDURE = _ltq_extract_regex
LEFTARG = _ltree,
RIGHTARG = lquery,
PROCEDURE = _ltq_extract_regex
);
CREATE FUNCTION _ltxtq_extract_exec(_ltree,ltxtquery)
RETURNS ltree
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict,iscachable);
LANGUAGE 'C' WITH (isstrict,iscachable);
CREATE OPERATOR ?@ (
LEFTARG = _ltree, RIGHTARG = ltxtquery, PROCEDURE = _ltxtq_extract_exec
LEFTARG = _ltree,
RIGHTARG = ltxtquery,
PROCEDURE = _ltxtq_extract_exec
);
--GiST support for ltree[]
create function _ltree_consistent(internal,internal,int2) returns bool as 'MODULE_PATHNAME' language 'C';
create function _ltree_compress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
create function _ltree_penalty(internal,internal,internal) returns internal as 'MODULE_PATHNAME' language 'C' with(isstrict);
create function _ltree_picksplit(internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
create function _ltree_union(bytea, internal) returns int4 as 'MODULE_PATHNAME' language 'C';
create function _ltree_same(internal, internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION _ltree_consistent(internal,internal,int2)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION _ltree_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION _ltree_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH(isstrict);
CREATE FUNCTION _ltree_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION _ltree_union(bytea, internal)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION _ltree_same(internal, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OPERATOR CLASS gist__ltree_ops
DEFAULT FOR TYPE _ltree USING gist AS
@ -589,6 +737,3 @@ CREATE OPERATOR CLASS gist__ltree_ops
FUNCTION 6 _ltree_picksplit (internal, internal),
FUNCTION 7 _ltree_same (internal, internal, internal),
STORAGE ltree_gist;
END;

View File

@ -1,16 +1,16 @@
create table test ( path ltree);
insert into test values ('Top');
insert into test values ('Top.Science');
insert into test values ('Top.Science.Astronomy');
insert into test values ('Top.Science.Astronomy.Astrophysics');
insert into test values ('Top.Science.Astronomy.Cosmology');
insert into test values ('Top.Hobbies');
insert into test values ('Top.Hobbies.Amateurs_Astronomy');
insert into test values ('Top.Collections');
insert into test values ('Top.Collections.Pictures');
insert into test values ('Top.Collections.Pictures.Astronomy');
insert into test values ('Top.Collections.Pictures.Astronomy.Stars');
insert into test values ('Top.Collections.Pictures.Astronomy.Galaxies');
insert into test values ('Top.Collections.Pictures.Astronomy.Astronauts');
create index path_gist_idx on test using gist(path);
create index path_idx on test using btree(path);
CREATE TABLE test ( path ltree);
INSERT INTO test VALUES ('Top');
INSERT INTO test VALUES ('Top.Science');
INSERT INTO test VALUES ('Top.Science.Astronomy');
INSERT INTO test VALUES ('Top.Science.Astronomy.Astrophysics');
INSERT INTO test VALUES ('Top.Science.Astronomy.Cosmology');
INSERT INTO test VALUES ('Top.Hobbies');
INSERT INTO test VALUES ('Top.Hobbies.Amateurs_Astronomy');
INSERT INTO test VALUES ('Top.Collections');
INSERT INTO test VALUES ('Top.Collections.Pictures');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Stars');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies');
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts');
CREATE INDEX path_gist_idx ON test USING gist(path);
CREATE INDEX path_idx ON test USING btree(path);

View File

@ -1,250 +1,252 @@
\set ECHO none
SET autocommit TO 'on';
\i ltree.sql
\set ECHO all
select ''::ltree;
select '1'::ltree;
select '1.2'::ltree;
select '1.2._3'::ltree;
SELECT ''::ltree;
SELECT '1'::ltree;
SELECT '1.2'::ltree;
SELECT '1.2._3'::ltree;
select subltree('Top.Child1.Child2',1,2);
select subpath('Top.Child1.Child2',1,2);
select subpath('Top.Child1.Child2',-1,1);
select subpath('Top.Child1.Child2',0,-2);
select subpath('Top.Child1.Child2',0,-1);
select subpath('Top.Child1.Child2',0,0);
select subpath('Top.Child1.Child2',1,0);
select subpath('Top.Child1.Child2',0);
select subpath('Top.Child1.Child2',1);
SELECT subltree('Top.Child1.Child2',1,2);
SELECT subpath('Top.Child1.Child2',1,2);
SELECT subpath('Top.Child1.Child2',-1,1);
SELECT subpath('Top.Child1.Child2',0,-2);
SELECT subpath('Top.Child1.Child2',0,-1);
SELECT subpath('Top.Child1.Child2',0,0);
SELECT subpath('Top.Child1.Child2',1,0);
SELECT subpath('Top.Child1.Child2',0);
SELECT subpath('Top.Child1.Child2',1);
select 'Top.Child1.Child2'::ltree || 'Child3'::text;
select 'Top.Child1.Child2'::ltree || 'Child3'::ltree;
select 'Top_0'::ltree || 'Top.Child1.Child2'::ltree;
select 'Top.Child1.Child2'::ltree || ''::ltree;
select ''::ltree || 'Top.Child1.Child2'::ltree;
SELECT 'Top.Child1.Child2'::ltree || 'Child3'::text;
SELECT 'Top.Child1.Child2'::ltree || 'Child3'::ltree;
SELECT 'Top_0'::ltree || 'Top.Child1.Child2'::ltree;
SELECT 'Top.Child1.Child2'::ltree || ''::ltree;
SELECT ''::ltree || 'Top.Child1.Child2'::ltree;
select lca('{la.2.3,1.2.3.4.5.6,}') is null;
select lca('{la.2.3,1.2.3.4.5.6}') is null;
select lca('{1.la.2.3,1.2.3.4.5.6}');
select lca('{1.2.3,1.2.3.4.5.6}');
select lca('1.la.2.3','1.2.3.4.5.6');
select lca('1.2.3','1.2.3.4.5.6');
select lca('1.2.2.3','1.2.3.4.5.6');
select lca('1.2.2.3','1.2.3.4.5.6','');
select lca('1.2.2.3','1.2.3.4.5.6','2');
select lca('1.2.2.3','1.2.3.4.5.6','1');
SELECT lca('{la.2.3,1.2.3.4.5.6,}') IS NULL;
SELECT lca('{la.2.3,1.2.3.4.5.6}') IS NULL;
SELECT lca('{1.la.2.3,1.2.3.4.5.6}');
SELECT lca('{1.2.3,1.2.3.4.5.6}');
SELECT lca('1.la.2.3','1.2.3.4.5.6');
SELECT lca('1.2.3','1.2.3.4.5.6');
SELECT lca('1.2.2.3','1.2.3.4.5.6');
SELECT lca('1.2.2.3','1.2.3.4.5.6','');
SELECT lca('1.2.2.3','1.2.3.4.5.6','2');
SELECT lca('1.2.2.3','1.2.3.4.5.6','1');
select '1'::lquery;
select '4|3|2'::lquery;
select '1.2'::lquery;
select '1.4|3|2'::lquery;
select '1.0'::lquery;
select '4|3|2.0'::lquery;
select '1.2.0'::lquery;
select '1.4|3|2.0'::lquery;
select '1.*'::lquery;
select '4|3|2.*'::lquery;
select '1.2.*'::lquery;
select '1.4|3|2.*'::lquery;
select '*.1.*'::lquery;
select '*.4|3|2.*'::lquery;
select '*.1.2.*'::lquery;
select '*.1.4|3|2.*'::lquery;
select '1.*.4|3|2'::lquery;
select '1.*.4|3|2.0'::lquery;
select '1.*.4|3|2.*{1,4}'::lquery;
select '1.*.4|3|2.*{,4}'::lquery;
select '1.*.4|3|2.*{1,}'::lquery;
select '1.*.4|3|2.*{1}'::lquery;
select 'qwerty%@*.tu'::lquery;
SELECT '1'::lquery;
SELECT '4|3|2'::lquery;
SELECT '1.2'::lquery;
SELECT '1.4|3|2'::lquery;
SELECT '1.0'::lquery;
SELECT '4|3|2.0'::lquery;
SELECT '1.2.0'::lquery;
SELECT '1.4|3|2.0'::lquery;
SELECT '1.*'::lquery;
SELECT '4|3|2.*'::lquery;
SELECT '1.2.*'::lquery;
SELECT '1.4|3|2.*'::lquery;
SELECT '*.1.*'::lquery;
SELECT '*.4|3|2.*'::lquery;
SELECT '*.1.2.*'::lquery;
SELECT '*.1.4|3|2.*'::lquery;
SELECT '1.*.4|3|2'::lquery;
SELECT '1.*.4|3|2.0'::lquery;
SELECT '1.*.4|3|2.*{1,4}'::lquery;
SELECT '1.*.4|3|2.*{,4}'::lquery;
SELECT '1.*.4|3|2.*{1,}'::lquery;
SELECT '1.*.4|3|2.*{1}'::lquery;
SELECT 'qwerty%@*.tu'::lquery;
select nlevel('1.2.3.4');
select '1.2'::ltree < '2.2'::ltree;
select '1.2'::ltree <= '2.2'::ltree;
select '2.2'::ltree = '2.2'::ltree;
select '3.2'::ltree >= '2.2'::ltree;
select '3.2'::ltree > '2.2'::ltree;
SELECT nlevel('1.2.3.4');
SELECT '1.2'::ltree < '2.2'::ltree;
SELECT '1.2'::ltree <= '2.2'::ltree;
SELECT '2.2'::ltree = '2.2'::ltree;
SELECT '3.2'::ltree >= '2.2'::ltree;
SELECT '3.2'::ltree > '2.2'::ltree;
select '1.2.3'::ltree @> '1.2.3.4'::ltree;
select '1.2.3.4'::ltree @> '1.2.3.4'::ltree;
select '1.2.3.4.5'::ltree @> '1.2.3.4'::ltree;
select '1.3.3'::ltree @> '1.2.3.4'::ltree;
SELECT '1.2.3'::ltree @> '1.2.3.4'::ltree;
SELECT '1.2.3.4'::ltree @> '1.2.3.4'::ltree;
SELECT '1.2.3.4.5'::ltree @> '1.2.3.4'::ltree;
SELECT '1.3.3'::ltree @> '1.2.3.4'::ltree;
select 'a.b.c.d.e'::ltree ~ 'a.b.c.d.e';
select 'a.b.c.d.e'::ltree ~ 'A.b.c.d.e';
select 'a.b.c.d.e'::ltree ~ 'A@.b.c.d.e';
select 'aa.b.c.d.e'::ltree ~ 'A@.b.c.d.e';
select 'aa.b.c.d.e'::ltree ~ 'A*.b.c.d.e';
select 'aa.b.c.d.e'::ltree ~ 'A*@.b.c.d.e';
select 'aa.b.c.d.e'::ltree ~ 'A*@|g.b.c.d.e';
select 'g.b.c.d.e'::ltree ~ 'A*@|g.b.c.d.e';
select 'a.b.c.d.e'::ltree ~ 'a.b.c.d.e';
select 'a.b.c.d.e'::ltree ~ 'a.*.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{3}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{2}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{4}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{,4}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{2,}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{2,4}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{2,3}.e';
select 'a.b.c.d.e'::ltree ~ 'a.*{2,3}';
select 'a.b.c.d.e'::ltree ~ 'a.*{2,4}';
select 'a.b.c.d.e'::ltree ~ 'a.*{2,5}';
select 'a.b.c.d.e'::ltree ~ '*{2,3}.e';
select 'a.b.c.d.e'::ltree ~ '*{2,4}.e';
select 'a.b.c.d.e'::ltree ~ '*{2,5}.e';
select 'a.b.c.d.e'::ltree ~ '*.e';
select 'a.b.c.d.e'::ltree ~ '*.e.*';
select 'a.b.c.d.e'::ltree ~ '*.d.*';
select 'a.b.c.d.e'::ltree ~ '*.a.*.d.*';
select 'a.b.c.d.e'::ltree ~ '*.!d.*';
select 'a.b.c.d.e'::ltree ~ '*.!d';
select 'a.b.c.d.e'::ltree ~ '!d.*';
select 'a.b.c.d.e'::ltree ~ '!a.*';
select 'a.b.c.d.e'::ltree ~ '*.!e';
select 'a.b.c.d.e'::ltree ~ '*.!e.*';
select 'a.b.c.d.e'::ltree ~ 'a.*.!e';
select 'a.b.c.d.e'::ltree ~ 'a.*.!d';
select 'a.b.c.d.e'::ltree ~ 'a.*.!d.*';
select 'a.b.c.d.e'::ltree ~ 'a.*.!f.*';
select 'a.b.c.d.e'::ltree ~ '*.a.*.!f.*';
select 'a.b.c.d.e'::ltree ~ '*.a.*.!d.*';
select 'a.b.c.d.e'::ltree ~ '*.a.!d.*';
select 'a.b.c.d.e'::ltree ~ '*.a.!d';
select 'a.b.c.d.e'::ltree ~ 'a.!d.*';
select 'a.b.c.d.e'::ltree ~ '*.a.*.!d.*';
select 'a.b.c.d.e'::ltree ~ '*.!b.*';
select 'a.b.c.d.e'::ltree ~ '*.!b.c.*';
select 'a.b.c.d.e'::ltree ~ '*.!b.*.c.*';
select 'a.b.c.d.e'::ltree ~ '!b.*.c.*';
select 'a.b.c.d.e'::ltree ~ '!b.b.*';
select 'a.b.c.d.e'::ltree ~ '!b.*.e';
select 'a.b.c.d.e'::ltree ~ '!b.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '!b.*.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '*{2}.!b.*.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '*{1}.!b.*.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '*{1}.!b.*{1}.!c.*.e';
select 'a.b.c.d.e'::ltree ~ 'a.!b.*{1}.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '!b.*{1}.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '*.!b.*{1}.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '*.!b.*.!c.*.e';
select 'a.b.c.d.e'::ltree ~ '!b.!c.*';
select 'a.b.c.d.e'::ltree ~ '!b.*.!c.*';
select 'a.b.c.d.e'::ltree ~ '*{2}.!b.*.!c.*';
select 'a.b.c.d.e'::ltree ~ '*{1}.!b.*.!c.*';
select 'a.b.c.d.e'::ltree ~ '*{1}.!b.*{1}.!c.*';
select 'a.b.c.d.e'::ltree ~ 'a.!b.*{1}.!c.*';
select 'a.b.c.d.e'::ltree ~ '!b.*{1}.!c.*';
select 'a.b.c.d.e'::ltree ~ '*.!b.*{1}.!c.*';
select 'a.b.c.d.e'::ltree ~ '*.!b.*.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ 'a.b.c.d.e';
SELECT 'a.b.c.d.e'::ltree ~ 'A.b.c.d.e';
SELECT 'a.b.c.d.e'::ltree ~ 'A@.b.c.d.e';
SELECT 'aa.b.c.d.e'::ltree ~ 'A@.b.c.d.e';
SELECT 'aa.b.c.d.e'::ltree ~ 'A*.b.c.d.e';
SELECT 'aa.b.c.d.e'::ltree ~ 'A*@.b.c.d.e';
SELECT 'aa.b.c.d.e'::ltree ~ 'A*@|g.b.c.d.e';
SELECT 'g.b.c.d.e'::ltree ~ 'A*@|g.b.c.d.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.b.c.d.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{3}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{4}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{,4}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2,}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2,4}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2,3}.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2,3}';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2,4}';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*{2,5}';
SELECT 'a.b.c.d.e'::ltree ~ '*{2,3}.e';
SELECT 'a.b.c.d.e'::ltree ~ '*{2,4}.e';
SELECT 'a.b.c.d.e'::ltree ~ '*{2,5}.e';
SELECT 'a.b.c.d.e'::ltree ~ '*.e';
SELECT 'a.b.c.d.e'::ltree ~ '*.e.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.a.*.d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!d';
SELECT 'a.b.c.d.e'::ltree ~ '!d.*';
SELECT 'a.b.c.d.e'::ltree ~ '!a.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!e';
SELECT 'a.b.c.d.e'::ltree ~ '*.!e.*';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*.!e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*.!d';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*.!d.*';
SELECT 'a.b.c.d.e'::ltree ~ 'a.*.!f.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.a.*.!f.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.a.*.!d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.a.!d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.a.!d';
SELECT 'a.b.c.d.e'::ltree ~ 'a.!d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.a.*.!d.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.c.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.*.c.*';
SELECT 'a.b.c.d.e'::ltree ~ '!b.*.c.*';
SELECT 'a.b.c.d.e'::ltree ~ '!b.b.*';
SELECT 'a.b.c.d.e'::ltree ~ '!b.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '!b.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '!b.*.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '*{2}.!b.*.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '*{1}.!b.*.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '*{1}.!b.*{1}.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ 'a.!b.*{1}.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '!b.*{1}.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.*{1}.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.*.!c.*.e';
SELECT 'a.b.c.d.e'::ltree ~ '!b.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '!b.*.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '*{2}.!b.*.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '*{1}.!b.*.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '*{1}.!b.*{1}.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ 'a.!b.*{1}.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '!b.*{1}.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.*{1}.!c.*';
SELECT 'a.b.c.d.e'::ltree ~ '*.!b.*.!c.*';
select 'QWER_TY'::ltree ~ 'q%@*';
select 'QWER_TY'::ltree ~ 'Q_t%@*';
select 'QWER_GY'::ltree ~ 'q_t%@*';
SELECT 'QWER_TY'::ltree ~ 'q%@*';
SELECT 'QWER_TY'::ltree ~ 'Q_t%@*';
SELECT 'QWER_GY'::ltree ~ 'q_t%@*';
--ltxtquery
select '!tree & aWdf@*'::ltxtquery;
select 'tree & aw_qw%*'::ltxtquery;
select 'ltree.awdfg'::ltree @ '!tree & aWdf@*'::ltxtquery;
select 'tree.awdfg'::ltree @ '!tree & aWdf@*'::ltxtquery;
select 'tree.awdfg'::ltree @ '!tree | aWdf@*'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree | aWdf@*'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree & aWdf@*'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree & aWdf@'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree & aWdf*'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree & aWdf'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree & awdf*'::ltxtquery;
select 'tree.awdfg'::ltree @ 'tree & aWdfg@'::ltxtquery;
select 'tree.awdfg_qwerty'::ltree @ 'tree & aw_qw%*'::ltxtquery;
select 'tree.awdfg_qwerty'::ltree @ 'tree & aw_rw%*'::ltxtquery;
SELECT '!tree & aWdf@*'::ltxtquery;
SELECT 'tree & aw_qw%*'::ltxtquery;
SELECT 'ltree.awdfg'::ltree @ '!tree & aWdf@*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ '!tree & aWdf@*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ '!tree | aWdf@*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree | aWdf@*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree & aWdf@*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree & aWdf@'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree & aWdf*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree & aWdf'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree & awdf*'::ltxtquery;
SELECT 'tree.awdfg'::ltree @ 'tree & aWdfg@'::ltxtquery;
SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_qw%*'::ltxtquery;
SELECT 'tree.awdfg_qwerty'::ltree @ 'tree & aw_rw%*'::ltxtquery;
--arrays
select '{1.2.3}'::ltree[] @> '1.2.3.4';
select '{1.2.3.4}'::ltree[] @> '1.2.3.4';
select '{1.2.3.4.5}'::ltree[] @> '1.2.3.4';
select '{1.3.3}'::ltree[] @> '1.2.3.4';
select '{5.67.8, 1.2.3}'::ltree[] @> '1.2.3.4';
select '{5.67.8, 1.2.3.4}'::ltree[] @> '1.2.3.4';
select '{5.67.8, 1.2.3.4.5}'::ltree[] @> '1.2.3.4';
select '{5.67.8, 1.3.3}'::ltree[] @> '1.2.3.4';
select '{1.2.3, 7.12.asd}'::ltree[] @> '1.2.3.4';
select '{1.2.3.4, 7.12.asd}'::ltree[] @> '1.2.3.4';
select '{1.2.3.4.5, 7.12.asd}'::ltree[] @> '1.2.3.4';
select '{1.3.3, 7.12.asd}'::ltree[] @> '1.2.3.4';
select '{ltree.asd, tree.awdfg}'::ltree[] @ 'tree & aWdfg@'::ltxtquery;
select '{j.k.l.m, g.b.c.d.e}'::ltree[] ~ 'A*@|g.b.c.d.e';
SELECT '{1.2.3}'::ltree[] @> '1.2.3.4';
SELECT '{1.2.3.4}'::ltree[] @> '1.2.3.4';
SELECT '{1.2.3.4.5}'::ltree[] @> '1.2.3.4';
SELECT '{1.3.3}'::ltree[] @> '1.2.3.4';
SELECT '{5.67.8, 1.2.3}'::ltree[] @> '1.2.3.4';
SELECT '{5.67.8, 1.2.3.4}'::ltree[] @> '1.2.3.4';
SELECT '{5.67.8, 1.2.3.4.5}'::ltree[] @> '1.2.3.4';
SELECT '{5.67.8, 1.3.3}'::ltree[] @> '1.2.3.4';
SELECT '{1.2.3, 7.12.asd}'::ltree[] @> '1.2.3.4';
SELECT '{1.2.3.4, 7.12.asd}'::ltree[] @> '1.2.3.4';
SELECT '{1.2.3.4.5, 7.12.asd}'::ltree[] @> '1.2.3.4';
SELECT '{1.3.3, 7.12.asd}'::ltree[] @> '1.2.3.4';
SELECT '{ltree.asd, tree.awdfg}'::ltree[] @ 'tree & aWdfg@'::ltxtquery;
SELECT '{j.k.l.m, g.b.c.d.e}'::ltree[] ~ 'A*@|g.b.c.d.e';
--exractors
select ('{3456,1.2.3.34}'::ltree[] ?@> '1.2.3.4') is null;
select '{3456,1.2.3}'::ltree[] ?@> '1.2.3.4';
select '{3456,1.2.3.4}'::ltree[] ?<@ '1.2.3';
select ('{3456,1.2.3.4}'::ltree[] ?<@ '1.2.5') is null;
select '{ltree.asd, tree.awdfg}'::ltree[] ?@ 'tree & aWdfg@'::ltxtquery;
select '{j.k.l.m, g.b.c.d.e}'::ltree[] ?~ 'A*@|g.b.c.d.e';
SELECT ('{3456,1.2.3.34}'::ltree[] ?@> '1.2.3.4') is null;
SELECT '{3456,1.2.3}'::ltree[] ?@> '1.2.3.4';
SELECT '{3456,1.2.3.4}'::ltree[] ?<@ '1.2.3';
SELECT ('{3456,1.2.3.4}'::ltree[] ?<@ '1.2.5') is null;
SELECT '{ltree.asd, tree.awdfg}'::ltree[] ?@ 'tree & aWdfg@'::ltxtquery;
SELECT '{j.k.l.m, g.b.c.d.e}'::ltree[] ?~ 'A*@|g.b.c.d.e';
create table ltreetest (t ltree);
\copy ltreetest from 'data/ltree.data'
CREATE TABLE ltreetest (t ltree);
\copy ltreetest FROM 'data/ltree.data'
select * from ltreetest where t < '12.3' order by t asc;
select * from ltreetest where t <= '12.3' order by t asc;
select * from ltreetest where t = '12.3' order by t asc;
select * from ltreetest where t >= '12.3' order by t asc;
select * from ltreetest where t > '12.3' order by t asc;
select * from ltreetest where t @> '1.1.1' order by t asc;
select * from ltreetest where t <@ '1.1.1' order by t asc;
select * from ltreetest where t ~ '1.1.1.*' order by t asc;
select * from ltreetest where t ~ '*.1' order by t asc;
select * from ltreetest where t ~ '23.*.1' order by t asc;
select * from ltreetest where t ~ '23.*{1}.1' order by t asc;
select * from ltreetest where t @ '23 & 1' order by t asc;
SELECT * FROM ltreetest WHERE t < '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t <= '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t = '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t >= '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t > '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t @> '1.1.1' order by t asc;
SELECT * FROM ltreetest WHERE t <@ '1.1.1' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '1.1.1.*' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '23.*.1' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '23.*{1}.1' order by t asc;
SELECT * FROM ltreetest WHERE t @ '23 & 1' order by t asc;
create unique index tstidx on ltreetest (t);
set enable_seqscan=off;
select * from ltreetest where t < '12.3' order by t asc;
select * from ltreetest where t <= '12.3' order by t asc;
select * from ltreetest where t = '12.3' order by t asc;
select * from ltreetest where t >= '12.3' order by t asc;
select * from ltreetest where t > '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t < '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t <= '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t = '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t >= '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t > '12.3' order by t asc;
drop index tstidx;
create index tstidx on ltreetest using gist (t);
set enable_seqscan=off;
select * from ltreetest where t < '12.3' order by t asc;
select * from ltreetest where t <= '12.3' order by t asc;
select * from ltreetest where t = '12.3' order by t asc;
select * from ltreetest where t >= '12.3' order by t asc;
select * from ltreetest where t > '12.3' order by t asc;
select * from ltreetest where t @> '1.1.1' order by t asc;
select * from ltreetest where t <@ '1.1.1' order by t asc;
select * from ltreetest where t ~ '1.1.1.*' order by t asc;
select * from ltreetest where t ~ '*.1' order by t asc;
select * from ltreetest where t ~ '23.*.1' order by t asc;
select * from ltreetest where t ~ '23.*{1}.1' order by t asc;
select * from ltreetest where t @ '23 & 1' order by t asc;
SELECT * FROM ltreetest WHERE t < '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t <= '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t = '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t >= '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t > '12.3' order by t asc;
SELECT * FROM ltreetest WHERE t @> '1.1.1' order by t asc;
SELECT * FROM ltreetest WHERE t <@ '1.1.1' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '1.1.1.*' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '23.*.1' order by t asc;
SELECT * FROM ltreetest WHERE t ~ '23.*{1}.1' order by t asc;
SELECT * FROM ltreetest WHERE t @ '23 & 1' order by t asc;
create table _ltreetest (t ltree[]);
\copy _ltreetest from 'data/_ltree.data'
\copy _ltreetest FROM 'data/_ltree.data'
select count(*) from _ltreetest where t @> '1.1.1' ;
select count(*) from _ltreetest where t <@ '1.1.1' ;
select count(*) from _ltreetest where t ~ '1.1.1.*' ;
select count(*) from _ltreetest where t ~ '*.1' ;
select count(*) from _ltreetest where t ~ '23.*.1' ;
select count(*) from _ltreetest where t ~ '23.*{1}.1' ;
select count(*) from _ltreetest where t @ '23 & 1' ;
SELECT count(*) FROM _ltreetest WHERE t @> '1.1.1' ;
SELECT count(*) FROM _ltreetest WHERE t <@ '1.1.1' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '1.1.1.*' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '*.1' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '23.*.1' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '23.*{1}.1' ;
SELECT count(*) FROM _ltreetest WHERE t @ '23 & 1' ;
create index _tstidx on _ltreetest using gist (t);
set enable_seqscan=off;
select count(*) from _ltreetest where t @> '1.1.1' ;
select count(*) from _ltreetest where t <@ '1.1.1' ;
select count(*) from _ltreetest where t ~ '1.1.1.*' ;
select count(*) from _ltreetest where t ~ '*.1' ;
select count(*) from _ltreetest where t ~ '23.*.1' ;
select count(*) from _ltreetest where t ~ '23.*{1}.1' ;
select count(*) from _ltreetest where t @ '23 & 1' ;
SELECT count(*) FROM _ltreetest WHERE t @> '1.1.1' ;
SELECT count(*) FROM _ltreetest WHERE t <@ '1.1.1' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '1.1.1.*' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '*.1' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '23.*.1' ;
SELECT count(*) FROM _ltreetest WHERE t ~ '23.*{1}.1' ;
SELECT count(*) FROM _ltreetest WHERE t @ '23 & 1' ;

View File

@ -9,38 +9,48 @@
-- Return the pid of the backend.
--
create function backend_pid() returns int4
as 'MODULE_PATHNAME'
language 'C';
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION backend_pid()
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Unlisten from a relation.
--
create function "unlisten"(name) returns int4
as 'MODULE_PATHNAME'
language 'C';
CREATE OR REPLACE FUNCTION "unlisten"(name)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Unlisten from all relations for this backend.
--
create function "unlisten"() returns int4
as 'select "unlisten"(''*'')'
language 'sql';
CREATE OR REPLACE FUNCTION "unlisten"()
RETURNS int4
AS 'SELECT "unlisten"(''*'')'
LANGUAGE 'SQL';
-- min(x,y)
--
create function min(int4,int4) returns int4
as 'MODULE_PATHNAME'
language 'C';
CREATE OR REPLACE FUNCTION min(int4,int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- max(x,y)
--
create function max(int4,int4) returns int4
as 'MODULE_PATHNAME'
language 'C';
CREATE OR REPLACE FUNCTION max(int4,int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Return the number of active listeners on a relation
--
create function active_listeners(text) returns int4
as 'MODULE_PATHNAME'
language 'C';
-- end of file
CREATE OR REPLACE FUNCTION active_listeners(text)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -1,6 +1,9 @@
DROP FUNCTION noup ();
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION noup ()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION noup ()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -245,6 +245,10 @@ sql_conn(const char *dbName, struct options * my_opts)
if (pgpass != NULL)
free(pgpass);
sql_exec(conn, "SET search_path = public;", 0);
sql_exec(conn, "SET autocommit TO 'on';", 0);
/* return the conn if good */
return conn;
}

View File

@ -1,7 +1,7 @@
/* -------------------------------------------------------------------------
* pg_dumplo
*
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/main.c,v 1.12 2002/09/05 21:01:16 tgl Exp $
* $Header: /cvsroot/pgsql/contrib/pg_dumplo/Attic/main.c,v 1.13 2002/10/18 18:41:20 momjian Exp $
*
* Karel Zak 1999-2000
* -------------------------------------------------------------------------
@ -191,6 +191,10 @@ main(int argc, char **argv)
if (pgLO->action != ACTION_SHOW)
index_file(pgLO);
PQexec(pgLO->conn, "SET search_path = public");
PQexec(pgLO->conn, "SET autocommit TO 'on'");
PQexec(pgLO->conn, "BEGIN");
switch (pgLO->action)

View File

@ -1,5 +1,5 @@
/*
* $Header: /cvsroot/pgsql/contrib/pgbench/pgbench.c,v 1.20 2002/10/07 05:10:02 ishii Exp $
* $Header: /cvsroot/pgsql/contrib/pgbench/pgbench.c,v 1.21 2002/10/18 18:41:20 momjian Exp $
*
* pgbench: a simple TPC-B like benchmark program for PostgreSQL
* written by Tatsuo Ishii
@ -117,7 +117,8 @@ static PGconn *
doConnect()
{
PGconn *con;
PGresult *res;
con = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName,
login, pwd);
if (con == NULL)
@ -138,6 +139,22 @@ doConnect()
return (NULL);
}
res = PQexec(con, "SET search_path = public");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "%s", PQerrorMessage(con));
exit(1);
}
PQclear(res);
res = PQexec(con, "SET autocommit TO 'on'");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "%s", PQerrorMessage(con));
exit(1);
}
PQclear(res);
return (con);
}
@ -499,6 +516,7 @@ init(void)
fprintf(stderr, "%s", PQerrorMessage(con));
exit(1);
}
PQclear(res);
for (i = 0; i < nbranches * tps; i++)
{
@ -589,6 +607,7 @@ init(void)
fprintf(stderr, "%s", PQerrorMessage(con));
exit(1);
}
PQclear(res);
#endif /* NOT_USED */
}
}
@ -601,6 +620,7 @@ init(void)
fprintf(stderr, "%s", PQerrorMessage(con));
exit(1);
}
PQclear(res);
fprintf(stderr, "done.\n");
PQfinish(con);
@ -833,6 +853,7 @@ main(int argc, char **argv)
fprintf(stderr, "%s", PQerrorMessage(con));
exit(1);
}
PQclear(res);
tps = atoi(PQgetvalue(res, 0, 0));
if (tps < 0)
{

View File

@ -1,8 +1,9 @@
--
-- Blowfish cipher
--
SET autocommit TO 'on';
-- some standard Blowfish testvalues
select encode(encrypt(
SELECT encode(encrypt(
decode('0000000000000000', 'hex'),
decode('0000000000000000', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -11,7 +12,7 @@ decode('0000000000000000', 'hex'),
4ef997456198dd78
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('ffffffffffffffff', 'hex'),
decode('ffffffffffffffff', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -20,7 +21,7 @@ decode('ffffffffffffffff', 'hex'),
51866fd5b85ecb8a
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('1000000000000001', 'hex'),
decode('3000000000000000', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -29,7 +30,7 @@ decode('3000000000000000', 'hex'),
7d856f9a613063f2
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('1111111111111111', 'hex'),
decode('1111111111111111', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -38,7 +39,7 @@ decode('1111111111111111', 'hex'),
2466dd878b963c9d
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('0123456789abcdef', 'hex'),
decode('fedcba9876543210', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -47,7 +48,7 @@ decode('fedcba9876543210', 'hex'),
0aceab0fc6a0a28d
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('01a1d6d039776742', 'hex'),
decode('fedcba9876543210', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -56,7 +57,7 @@ decode('fedcba9876543210', 'hex'),
3273b8badc9e9e15
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('ffffffffffffffff', 'hex'),
decode('0000000000000000', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -66,7 +67,7 @@ decode('0000000000000000', 'hex'),
(1 row)
-- setkey
select encode(encrypt(
SELECT encode(encrypt(
decode('fedcba9876543210', 'hex'),
decode('f0e1d2c3b4a5968778695a4b3c2d1e0f', 'hex'),
'bf-ecb/pad:none'), 'hex');
@ -76,7 +77,7 @@ decode('f0e1d2c3b4a5968778695a4b3c2d1e0f', 'hex'),
(1 row)
-- with padding
select encode(encrypt(
SELECT encode(encrypt(
decode('01234567890123456789', 'hex'),
decode('33443344334433443344334433443344', 'hex'),
'bf-ecb'), 'hex');
@ -87,7 +88,7 @@ decode('33443344334433443344334433443344', 'hex'),
-- cbc
-- 28 bytes key
select encode(encrypt(
SELECT encode(encrypt(
decode('6b77b4d63006dee605b156e27403979358deb9e7154616d959f1652bd5', 'hex'),
decode('37363534333231204e6f77206973207468652074696d6520666f7220', 'hex'),
'bf-cbc'), 'hex');
@ -97,7 +98,7 @@ decode('37363534333231204e6f77206973207468652074696d6520666f7220', 'hex'),
(1 row)
-- 29 bytes key
select encode(encrypt(
SELECT encode(encrypt(
decode('6b77b4d63006dee605b156e27403979358deb9e7154616d959f1652bd5ff92cc', 'hex'),
decode('37363534333231204e6f77206973207468652074696d6520666f722000', 'hex'),
'bf-cbc'), 'hex');

View File

@ -1,26 +1,28 @@
--
-- crypt() and gen_salt(): bcrypt
--
select crypt('', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
SET autocommit TO 'on';
SELECT crypt('', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
crypt
--------------------------------------------------------------
$2a$06$RQiOJ.3ELirrXwxIZY8q0OlGbBEpDmx7IRZlNYvGJ1SHXwNi2cEKK
(1 row)
select crypt('foox', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
SELECT crypt('foox', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
crypt
--------------------------------------------------------------
$2a$06$RQiOJ.3ELirrXwxIZY8q0OR3CVJrAfda1z26CCHPnB6mmVZD8p0/C
(1 row)
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
update ctest set salt = gen_salt('bf', 8);
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
UPDATE ctest SET salt = gen_salt('bf', 8);
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
worked
--------
t
(1 row)
drop table ctest;
DROP TABLE ctest;

View File

@ -1,26 +1,28 @@
--
-- crypt() and gen_salt(): crypt-des
--
select crypt('', 'NB');
SET autocommit TO 'on';
SELECT crypt('', 'NB');
crypt
---------------
NBPx/38Y48kHg
(1 row)
select crypt('foox', 'NB');
SELECT crypt('foox', 'NB');
crypt
---------------
NB53EGGqrrb5E
(1 row)
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
update ctest set salt = gen_salt('des');
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
UPDATE ctest SET salt = gen_salt('des');
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
worked
--------
t
(1 row)
drop table ctest;
DROP TABLE ctest;

View File

@ -1,26 +1,28 @@
--
-- crypt() and gen_salt(): md5
--
select crypt('', '$1$Szzz0yzz');
SET autocommit TO 'on';
SELECT crypt('', '$1$Szzz0yzz');
crypt
------------------------------------
$1$Szzz0yzz$To38XrR3BsbXQW2ZpfKjF1
(1 row)
select crypt('foox', '$1$Szzz0yzz');
SELECT crypt('foox', '$1$Szzz0yzz');
crypt
------------------------------------
$1$Szzz0yzz$IYL49cd3t9bllsA7Jmz1M1
(1 row)
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
update ctest set salt = gen_salt('md5');
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
UPDATE ctest SET salt = gen_salt('md5');
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
worked
--------
t
(1 row)
drop table ctest;
DROP TABLE ctest;

View File

@ -1,26 +1,28 @@
--
-- crypt() and gen_salt(): extended des
--
select crypt('', '_J9..j2zz');
SET autocommit TO 'on';
SELECT crypt('', '_J9..j2zz');
crypt
----------------------
_J9..j2zzR/nIRDK3pPc
(1 row)
select crypt('foox', '_J9..j2zz');
SELECT crypt('foox', '_J9..j2zz');
crypt
----------------------
_J9..j2zzAYKMvO2BYRY
(1 row)
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
update ctest set salt = gen_salt('xdes', 1001);
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
UPDATE ctest SET salt = gen_salt('xdes', 1001);
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
worked
--------
t
(1 row)
drop table ctest;
DROP TABLE ctest;

View File

@ -1,7 +1,8 @@
--
-- HMAC-MD5
--
select encode(hmac(
SET autocommit TO 'on';
SELECT encode(hmac(
'Hi There',
decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'),
'md5'), 'hex');
@ -11,7 +12,7 @@ decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'),
(1 row)
-- 2
select encode(hmac(
SELECT encode(hmac(
'Jefe',
'what do ya want for nothing?',
'md5'), 'hex');
@ -21,7 +22,7 @@ select encode(hmac(
(1 row)
-- 3
select encode(hmac(
SELECT encode(hmac(
decode('dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', 'hex'),
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'md5'), 'hex');
@ -31,7 +32,7 @@ decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
(1 row)
-- 4
select encode(hmac(
SELECT encode(hmac(
decode('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', 'hex'),
decode('0102030405060708090a0b0c0d0e0f10111213141516171819', 'hex'),
'md5'), 'hex');
@ -41,7 +42,7 @@ decode('0102030405060708090a0b0c0d0e0f10111213141516171819', 'hex'),
(1 row)
-- 5
select encode(hmac(
SELECT encode(hmac(
'Test With Truncation',
decode('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'),
'md5'), 'hex');
@ -51,7 +52,7 @@ decode('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'),
(1 row)
-- 6
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key - Hash Key First',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'md5'), 'hex');
@ -61,7 +62,7 @@ decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(1 row)
-- 7
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'md5'), 'hex');

View File

@ -1,7 +1,8 @@
--
-- HMAC-MD5
--
select encode(hmac(
SET autocommit TO 'on';
SELECT encode(hmac(
'Hi There',
decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'),
'sha1'), 'hex');
@ -11,7 +12,7 @@ decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'),
(1 row)
-- 2
select encode(hmac(
SELECT encode(hmac(
'Jefe',
'what do ya want for nothing?',
'sha1'), 'hex');
@ -21,7 +22,7 @@ select encode(hmac(
(1 row)
-- 3
select encode(hmac(
SELECT encode(hmac(
decode('dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', 'hex'),
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'sha1'), 'hex');
@ -31,7 +32,7 @@ decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
(1 row)
-- 4
select encode(hmac(
SELECT encode(hmac(
decode('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', 'hex'),
decode('0102030405060708090a0b0c0d0e0f10111213141516171819', 'hex'),
'sha1'), 'hex');
@ -41,7 +42,7 @@ decode('0102030405060708090a0b0c0d0e0f10111213141516171819', 'hex'),
(1 row)
-- 5
select encode(hmac(
SELECT encode(hmac(
'Test With Truncation',
decode('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'),
'sha1'), 'hex');
@ -51,7 +52,7 @@ decode('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'),
(1 row)
-- 6
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key - Hash Key First',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'sha1'), 'hex');
@ -61,7 +62,7 @@ decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(1 row)
-- 7
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'sha1'), 'hex');

View File

@ -3,13 +3,13 @@
--
\set ECHO none
-- check for encoding fn's
select encode('foo', 'hex');
SELECT encode('foo', 'hex');
encode
--------
666f6f
(1 row)
select decode('666f6f', 'hex');
SELECT decode('666f6f', 'hex');
decode
--------
foo

View File

@ -1,43 +1,44 @@
--
-- MD5 message digest
--
select encode(digest('', 'md5'), 'hex');
SET autocommit TO 'on';
SELECT encode(digest('', 'md5'), 'hex');
encode
----------------------------------
d41d8cd98f00b204e9800998ecf8427e
(1 row)
select encode(digest('a', 'md5'), 'hex');
SELECT encode(digest('a', 'md5'), 'hex');
encode
----------------------------------
0cc175b9c0f1b6a831c399e269772661
(1 row)
select encode(digest('abc', 'md5'), 'hex');
SELECT encode(digest('abc', 'md5'), 'hex');
encode
----------------------------------
900150983cd24fb0d6963f7d28e17f72
(1 row)
select encode(digest('message digest', 'md5'), 'hex');
SELECT encode(digest('message digest', 'md5'), 'hex');
encode
----------------------------------
f96b697d7cb7938d525a2f31aaf161d0
(1 row)
select encode(digest('abcdefghijklmnopqrstuvwxyz', 'md5'), 'hex');
SELECT encode(digest('abcdefghijklmnopqrstuvwxyz', 'md5'), 'hex');
encode
----------------------------------
c3fcd3d76192e4007dfb496cca67e13b
(1 row)
select encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'md5'), 'hex');
SELECT encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'md5'), 'hex');
encode
----------------------------------
d174ab98d277d9f5a5611c2c9f419d9f
(1 row)
select encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'md5'), 'hex');
SELECT encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'md5'), 'hex');
encode
----------------------------------
57edf4a22be3c955ac49da2e2107b67a

View File

@ -1,8 +1,9 @@
--
-- AES / Rijndael-128 cipher
--
SET autocommit TO 'on';
-- some standard Rijndael testvalues
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f', 'hex'),
'aes-ecb/pad:none'), 'hex');
@ -11,7 +12,7 @@ decode('000102030405060708090a0b0c0d0e0f', 'hex'),
69c4e0d86a7b0430d8cdb78070b4c55a
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f1011121314151617', 'hex'),
'aes-ecb/pad:none'), 'hex');
@ -20,7 +21,7 @@ decode('000102030405060708090a0b0c0d0e0f1011121314151617', 'hex'),
dda97ca4864cdfe06eaf70a0ec0d7191
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'hex'),
'aes-ecb/pad:none'), 'hex');
@ -30,7 +31,7 @@ decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'hex'
(1 row)
-- cbc
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'hex'),
'aes-cbc/pad:none'), 'hex');
@ -40,7 +41,7 @@ decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'hex'
(1 row)
-- key padding
select encode(encrypt(
SELECT encode(encrypt(
decode('0011223344', 'hex'),
decode('000102030405', 'hex'),
'aes-cbc'), 'hex');
@ -49,7 +50,7 @@ decode('000102030405', 'hex'),
189a28932213f017b246678dbc28655f
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('0011223344', 'hex'),
decode('000102030405060708090a0b0c0d0e0f10111213', 'hex'),
'aes-cbc'), 'hex');
@ -58,7 +59,7 @@ decode('000102030405060708090a0b0c0d0e0f10111213', 'hex'),
3b02279162d15580e069d3a71407a556
(1 row)
select encode(encrypt(
SELECT encode(encrypt(
decode('0011223344', 'hex'),
decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b', 'hex'),
'aes-cbc'), 'hex');

View File

@ -1,43 +1,44 @@
--
-- SHA1 message digest
--
select encode(digest('', 'sha1'), 'hex');
SET autocommit TO 'on';
SELECT encode(digest('', 'sha1'), 'hex');
encode
------------------------------------------
da39a3ee5e6b4b0d3255bfef95601890afd80709
(1 row)
select encode(digest('a', 'sha1'), 'hex');
SELECT encode(digest('a', 'sha1'), 'hex');
encode
------------------------------------------
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
(1 row)
select encode(digest('abc', 'sha1'), 'hex');
SELECT encode(digest('abc', 'sha1'), 'hex');
encode
------------------------------------------
a9993e364706816aba3e25717850c26c9cd0d89d
(1 row)
select encode(digest('message digest', 'sha1'), 'hex');
SELECT encode(digest('message digest', 'sha1'), 'hex');
encode
------------------------------------------
c12252ceda8be8994d5fa0290a47231c1d16aae3
(1 row)
select encode(digest('abcdefghijklmnopqrstuvwxyz', 'sha1'), 'hex');
SELECT encode(digest('abcdefghijklmnopqrstuvwxyz', 'sha1'), 'hex');
encode
------------------------------------------
32d10c7b8cf96570ca04ce37f2a19d84240d3a89
(1 row)
select encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'sha1'), 'hex');
SELECT encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'sha1'), 'hex');
encode
------------------------------------------
761c457bf73b14d27e9e9265c46f4b4dda11f940
(1 row)
select encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'sha1'), 'hex');
SELECT encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'sha1'), 'hex');
encode
------------------------------------------
50abf5706a150990a08b2c5ea40fa0e585554732

View File

@ -1,75 +1,76 @@
-- Adjust this setting to control where the objects get created.
SET search_path = public;
-- drop function digest(text, text);
-- drop function digest(bytea, text);
-- drop function digest_exists(text);
-- drop function hmac(text, text, text);
-- drop function hmac(bytea, bytea, text);
-- drop function hmac_exists(text);
-- drop function crypt(text, text);
-- drop function gen_salt(text);
-- drop function gen_salt(text, int4);
-- drop function encrypt(bytea, bytea, text);
-- drop function decrypt(bytea, bytea, text);
-- drop function encrypt_iv(bytea, bytea, bytea, text);
-- drop function decrypt_iv(bytea, bytea, bytea, text);
-- drop function cipher_exists(text);
CREATE FUNCTION digest(text, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_digest' LANGUAGE 'C';
CREATE FUNCTION digest(bytea, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_digest' LANGUAGE 'C';
CREATE FUNCTION digest_exists(text) RETURNS bool
AS 'MODULE_PATHNAME',
'pg_digest_exists' LANGUAGE 'C';
CREATE FUNCTION hmac(text, text, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_hmac' LANGUAGE 'C';
CREATE FUNCTION hmac(bytea, bytea, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_hmac' LANGUAGE 'C';
CREATE FUNCTION hmac_exists(text) RETURNS bool
AS 'MODULE_PATHNAME',
'pg_hmac_exists' LANGUAGE 'C';
CREATE FUNCTION crypt(text, text) RETURNS text
AS 'MODULE_PATHNAME',
'pg_crypt' LANGUAGE 'C';
CREATE FUNCTION gen_salt(text) RETURNS text
AS 'MODULE_PATHNAME',
'pg_gen_salt' LANGUAGE 'C';
CREATE FUNCTION gen_salt(text, int4) RETURNS text
AS 'MODULE_PATHNAME',
'pg_gen_salt_rounds' LANGUAGE 'C';
CREATE FUNCTION encrypt(bytea, bytea, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_encrypt' LANGUAGE 'C';
CREATE FUNCTION decrypt(bytea, bytea, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_decrypt' LANGUAGE 'C';
CREATE FUNCTION encrypt_iv(bytea, bytea, bytea, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_encrypt_iv' LANGUAGE 'C';
CREATE FUNCTION decrypt_iv(bytea, bytea, bytea, text) RETURNS bytea
AS 'MODULE_PATHNAME',
'pg_decrypt_iv' LANGUAGE 'C';
CREATE FUNCTION cipher_exists(text) RETURNS bool
AS 'MODULE_PATHNAME',
'pg_cipher_exists' LANGUAGE 'C';
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION digest(text, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_digest'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION digest(bytea, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_digest'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION digest_exists(text)
RETURNS bool
AS 'MODULE_PATHNAME', 'pg_digest_exists'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION hmac(text, text, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_hmac'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION hmac(bytea, bytea, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_hmac'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION hmac_exists(text)
RETURNS bool
AS 'MODULE_PATHNAME', 'pg_hmac_exists'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION crypt(text, text)
RETURNS text
AS 'MODULE_PATHNAME', 'pg_crypt'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION gen_salt(text)
RETURNS text
AS 'MODULE_PATHNAME', 'pg_gen_salt'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION gen_salt(text, int4)
RETURNS text
AS 'MODULE_PATHNAME', 'pg_gen_salt_rounds'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION encrypt(bytea, bytea, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_encrypt'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION decrypt(bytea, bytea, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_decrypt'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION encrypt_iv(bytea, bytea, bytea, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_encrypt_iv'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION decrypt_iv(bytea, bytea, bytea, text)
RETURNS bytea
AS 'MODULE_PATHNAME', 'pg_decrypt_iv'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION cipher_exists(text)
RETURNS bool
AS 'MODULE_PATHNAME', 'pg_cipher_exists'
LANGUAGE 'C';

View File

@ -2,50 +2,52 @@
-- Blowfish cipher
--
SET autocommit TO 'on';
-- some standard Blowfish testvalues
select encode(encrypt(
SELECT encode(encrypt(
decode('0000000000000000', 'hex'),
decode('0000000000000000', 'hex'),
'bf-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('ffffffffffffffff', 'hex'),
decode('ffffffffffffffff', 'hex'),
'bf-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('1000000000000001', 'hex'),
decode('3000000000000000', 'hex'),
'bf-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('1111111111111111', 'hex'),
decode('1111111111111111', 'hex'),
'bf-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('0123456789abcdef', 'hex'),
decode('fedcba9876543210', 'hex'),
'bf-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('01a1d6d039776742', 'hex'),
decode('fedcba9876543210', 'hex'),
'bf-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('ffffffffffffffff', 'hex'),
decode('0000000000000000', 'hex'),
'bf-ecb/pad:none'), 'hex');
-- setkey
select encode(encrypt(
SELECT encode(encrypt(
decode('fedcba9876543210', 'hex'),
decode('f0e1d2c3b4a5968778695a4b3c2d1e0f', 'hex'),
'bf-ecb/pad:none'), 'hex');
-- with padding
select encode(encrypt(
SELECT encode(encrypt(
decode('01234567890123456789', 'hex'),
decode('33443344334433443344334433443344', 'hex'),
'bf-ecb'), 'hex');
@ -53,13 +55,13 @@ decode('33443344334433443344334433443344', 'hex'),
-- cbc
-- 28 bytes key
select encode(encrypt(
SELECT encode(encrypt(
decode('6b77b4d63006dee605b156e27403979358deb9e7154616d959f1652bd5', 'hex'),
decode('37363534333231204e6f77206973207468652074696d6520666f7220', 'hex'),
'bf-cbc'), 'hex');
-- 29 bytes key
select encode(encrypt(
SELECT encode(encrypt(
decode('6b77b4d63006dee605b156e27403979358deb9e7154616d959f1652bd5ff92cc', 'hex'),
decode('37363534333231204e6f77206973207468652074696d6520666f722000', 'hex'),
'bf-cbc'), 'hex');

View File

@ -2,16 +2,19 @@
-- crypt() and gen_salt(): bcrypt
--
select crypt('', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
SET autocommit TO 'on';
select crypt('foox', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
SELECT crypt('', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
SELECT crypt('foox', '$2a$06$RQiOJ.3ELirrXwxIZY8q0O');
update ctest set salt = gen_salt('bf', 8);
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
drop table ctest;
UPDATE ctest SET salt = gen_salt('bf', 8);
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
DROP TABLE ctest;

View File

@ -2,16 +2,19 @@
-- crypt() and gen_salt(): crypt-des
--
select crypt('', 'NB');
SET autocommit TO 'on';
select crypt('foox', 'NB');
SELECT crypt('', 'NB');
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
SELECT crypt('foox', 'NB');
update ctest set salt = gen_salt('des');
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
drop table ctest;
UPDATE ctest SET salt = gen_salt('des');
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
DROP TABLE ctest;

View File

@ -2,16 +2,19 @@
-- crypt() and gen_salt(): md5
--
select crypt('', '$1$Szzz0yzz');
SET autocommit TO 'on';
select crypt('foox', '$1$Szzz0yzz');
SELECT crypt('', '$1$Szzz0yzz');
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
SELECT crypt('foox', '$1$Szzz0yzz');
update ctest set salt = gen_salt('md5');
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
drop table ctest;
UPDATE ctest SET salt = gen_salt('md5');
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
DROP TABLE ctest;

View File

@ -2,16 +2,19 @@
-- crypt() and gen_salt(): extended des
--
select crypt('', '_J9..j2zz');
SET autocommit TO 'on';
select crypt('foox', '_J9..j2zz');
SELECT crypt('', '_J9..j2zz');
create table ctest (data text, res text, salt text);
insert into ctest values ('password', '', '');
SELECT crypt('foox', '_J9..j2zz');
update ctest set salt = gen_salt('xdes', 1001);
update ctest set res = crypt(data, salt);
select res = crypt(data, res) as "worked" from ctest;
CREATE TABLE ctest (data text, res text, salt text);
INSERT INTO ctest VALUES ('password', '', '');
drop table ctest;
UPDATE ctest SET salt = gen_salt('xdes', 1001);
UPDATE ctest SET res = crypt(data, salt);
SELECT res = crypt(data, res) AS "worked"
FROM ctest;
DROP TABLE ctest;

View File

@ -2,43 +2,45 @@
-- HMAC-MD5
--
select encode(hmac(
SET autocommit TO 'on';
SELECT encode(hmac(
'Hi There',
decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'),
'md5'), 'hex');
-- 2
select encode(hmac(
SELECT encode(hmac(
'Jefe',
'what do ya want for nothing?',
'md5'), 'hex');
-- 3
select encode(hmac(
SELECT encode(hmac(
decode('dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', 'hex'),
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'md5'), 'hex');
-- 4
select encode(hmac(
SELECT encode(hmac(
decode('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', 'hex'),
decode('0102030405060708090a0b0c0d0e0f10111213141516171819', 'hex'),
'md5'), 'hex');
-- 5
select encode(hmac(
SELECT encode(hmac(
'Test With Truncation',
decode('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'),
'md5'), 'hex');
-- 6
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key - Hash Key First',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'md5'), 'hex');
-- 7
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'md5'), 'hex');

View File

@ -2,43 +2,45 @@
-- HMAC-MD5
--
select encode(hmac(
SET autocommit TO 'on';
SELECT encode(hmac(
'Hi There',
decode('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'),
'sha1'), 'hex');
-- 2
select encode(hmac(
SELECT encode(hmac(
'Jefe',
'what do ya want for nothing?',
'sha1'), 'hex');
-- 3
select encode(hmac(
SELECT encode(hmac(
decode('dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', 'hex'),
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'sha1'), 'hex');
-- 4
select encode(hmac(
SELECT encode(hmac(
decode('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', 'hex'),
decode('0102030405060708090a0b0c0d0e0f10111213141516171819', 'hex'),
'sha1'), 'hex');
-- 5
select encode(hmac(
SELECT encode(hmac(
'Test With Truncation',
decode('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'),
'sha1'), 'hex');
-- 6
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key - Hash Key First',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'sha1'), 'hex');
-- 7
select encode(hmac(
SELECT encode(hmac(
'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data',
decode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'),
'sha1'), 'hex');

View File

@ -3,10 +3,11 @@
--
\set ECHO none
SET autocommit TO 'on';
\i pgcrypto.sql
\set ECHO all
-- check for encoding fn's
select encode('foo', 'hex');
select decode('666f6f', 'hex');
SELECT encode('foo', 'hex');
SELECT decode('666f6f', 'hex');

View File

@ -2,11 +2,13 @@
-- MD5 message digest
--
select encode(digest('', 'md5'), 'hex');
select encode(digest('a', 'md5'), 'hex');
select encode(digest('abc', 'md5'), 'hex');
select encode(digest('message digest', 'md5'), 'hex');
select encode(digest('abcdefghijklmnopqrstuvwxyz', 'md5'), 'hex');
select encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'md5'), 'hex');
select encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'md5'), 'hex');
SET autocommit TO 'on';
SELECT encode(digest('', 'md5'), 'hex');
SELECT encode(digest('a', 'md5'), 'hex');
SELECT encode(digest('abc', 'md5'), 'hex');
SELECT encode(digest('message digest', 'md5'), 'hex');
SELECT encode(digest('abcdefghijklmnopqrstuvwxyz', 'md5'), 'hex');
SELECT encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'md5'), 'hex');
SELECT encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'md5'), 'hex');

View File

@ -2,41 +2,43 @@
-- AES / Rijndael-128 cipher
--
SET autocommit TO 'on';
-- some standard Rijndael testvalues
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f', 'hex'),
'aes-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f1011121314151617', 'hex'),
'aes-ecb/pad:none'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'hex'),
'aes-ecb/pad:none'), 'hex');
-- cbc
select encode(encrypt(
SELECT encode(encrypt(
decode('00112233445566778899aabbccddeeff', 'hex'),
decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', 'hex'),
'aes-cbc/pad:none'), 'hex');
-- key padding
select encode(encrypt(
SELECT encode(encrypt(
decode('0011223344', 'hex'),
decode('000102030405', 'hex'),
'aes-cbc'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('0011223344', 'hex'),
decode('000102030405060708090a0b0c0d0e0f10111213', 'hex'),
'aes-cbc'), 'hex');
select encode(encrypt(
SELECT encode(encrypt(
decode('0011223344', 'hex'),
decode('000102030405060708090a0b0c0d0e0f101112131415161718191a1b', 'hex'),
'aes-cbc'), 'hex');

View File

@ -2,11 +2,13 @@
-- SHA1 message digest
--
select encode(digest('', 'sha1'), 'hex');
select encode(digest('a', 'sha1'), 'hex');
select encode(digest('abc', 'sha1'), 'hex');
select encode(digest('message digest', 'sha1'), 'hex');
select encode(digest('abcdefghijklmnopqrstuvwxyz', 'sha1'), 'hex');
select encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'sha1'), 'hex');
select encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'sha1'), 'hex');
SET autocommit TO 'on';
SELECT encode(digest('', 'sha1'), 'hex');
SELECT encode(digest('a', 'sha1'), 'hex');
SELECT encode(digest('abc', 'sha1'), 'hex');
SELECT encode(digest('message digest', 'sha1'), 'hex');
SELECT encode(digest('abcdefghijklmnopqrstuvwxyz', 'sha1'), 'hex');
SELECT encode(digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'sha1'), 'hex');
SELECT encode(digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'sha1'), 'hex');

View File

@ -1,17 +1,22 @@
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
DROP TYPE pgstattuple_type CASCADE;
CREATE TYPE pgstattuple_type AS (
table_len BIGINT, -- physical table length in bytes
tuple_count BIGINT, -- number of live tuples
tuple_len BIGINT, -- total tuples length in bytes
tuple_percent FLOAT, -- live tuples in %
dead_tuple_count BIGINT, -- number of dead tuples
dead_tuple_len BIGINT, -- total dead tuples length in bytes
dead_tuple_percent FLOAT, -- dead tuples in %
free_space BIGINT, -- free space in bytes
free_percent FLOAT -- free space in %
table_len BIGINT, -- physical table length in bytes
tuple_count BIGINT, -- number of live tuples
tuple_len BIGINT, -- total tuples length in bytes
tuple_percent FLOAT, -- live tuples in %
dead_tuple_count BIGINT, -- number of dead tuples
dead_tuple_len BIGINT, -- total dead tuples length in bytes
dead_tuple_percent FLOAT, -- dead tuples in %
free_space BIGINT, -- free space in bytes
free_percent FLOAT -- free space in %
);
CREATE OR REPLACE FUNCTION pgstattuple(text) RETURNS pgstattuple_type
AS 'MODULE_PATHNAME', 'pgstattuple'
LANGUAGE 'c' WITH (isstrict);
GRANT EXECUTE ON FUNCTION pgstattuple(text) TO PUBLIC;
CREATE OR REPLACE FUNCTION pgstattuple(text)
RETURNS pgstattuple_type
AS 'MODULE_PATHNAME', 'pgstattuple'
LANGUAGE 'C' WITH (isstrict);

View File

@ -1,6 +1,6 @@
#!/bin/sh
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
# Package : reindexdb Version : $Revision: 1.1 $
# Package : reindexdb Version : $Revision: 1.2 $
# Date : 05/08/2002 Author : Shaun Thomas
# Req : psql, sh, perl, sed Type : Utility
#
@ -184,11 +184,11 @@ fi
# If index was set, reindex that index.
if [ "$index" ]; then
$PSQL $PSQLOPT $ECHOOPT -c "REINDEX INDEX $index" -d $dbname
$PSQL $PSQLOPT $ECHOOPT -c "SET autocommit TO 'on';REINDEX INDEX $index" -d $dbname
# Ok, no index. Is there a specific table to reindex?
elif [ "$table" ]; then
$PSQL $PSQLOPT $ECHOOPT -c "REINDEX TABLE \"$table\"" -d $dbname
$PSQL $PSQLOPT $ECHOOPT -c "SET autocommit TO 'on';REINDEX TABLE \"$table\"" -d $dbname
# No specific table, no specific index, either we have a specific database,
# or were told to do all databases. Do it!
@ -204,9 +204,9 @@ else
# Ok, reindex every table in the database. Use the same method
# we used to get a list of databases, and get a list of tables in this
# database that we may reindex.
tables=`$PSQL $PSQLOPT -q -t -A -d $db -c "$sql"`
tables=`$PSQL $PSQLOPT -q -t -A -d $db -c "SET autocommit TO 'on';$sql"`
for tab in $tables; do
$PSQL $PSQLOPT $ECHOOPT -c "REINDEX TABLE \"$tab\"" -d $db
$PSQL $PSQLOPT $ECHOOPT -c "SET autocommit TO 'on';REINDEX TABLE \"$tab\"" -d $db
done
done

View File

@ -25,6 +25,20 @@ EOT
$opt{d} ||= 'TEST';
my $dbi=DBI->connect('DBI:Pg:dbname='.$opt{d}) || die "Couldn't connect DB: $opt{d} !\n";
my $setsql = qq{
SET search_path = public;
};
my $sth = $dbi->prepare($setsql);
$sth->execute();
my $setsql2 = qq{
SET autocommit TO 'on';
};
my $sth2 = $dbi->prepare($setsql2);
$sth2->execute();
my $sql;
my $notice;
my $sss = '(3000,3000,2990,2990)';

View File

@ -2,11 +2,11 @@
use strict;
my $NUM = 20000;
print "drop table boxtmp;\n";
print "drop table boxtmp2;\n";
print "DROP TABLE boxtmp;\n";
print "DROP TABLE boxtmp2;\n";
print "create table boxtmp (b box);\n";
print "create table boxtmp2 (b box);\n";
print "CREATE TABLE boxtmp (b box);\n";
print "CREATE TABLE boxtmp2 (b box);\n";
srand(1);
open(DAT,">bbb.dat") || die;
@ -26,20 +26,20 @@ foreach ( 1..$NUM ) {
}
close DAT;
print "copy boxtmp from stdin;\n";
print "COPY boxtmp FROM stdin;\n";
open(DAT,"bbb.dat") || die;
while(<DAT>) { print; }
close DAT;
print "\\.\n";
print "copy boxtmp2 from stdin;\n";
print "COPY boxtmp2 FROM stdin;\n";
open(DAT,"bbb.dat") || die;
while(<DAT>) { print; }
close DAT;
print "\\.\n";
print "create index bix on boxtmp using gist (b gist_box_ops);\n";
print "create index bix2 on boxtmp2 using rtree (b box_ops);\n";
print "CREATE INDEX bix ON boxtmp USING gist (b gist_box_ops);\n";
print "CREATE INDEX bix2 ON boxtmp2 USING rtree (b box_ops);\n";
sub min {

View File

@ -3,41 +3,51 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
create table boxtmp (b box);
CREATE TABLE boxtmp (b box);
\copy boxtmp from 'data/test_box.data'
select count(*) from boxtmp where b && '(1000,1000,0,0)'::box;
SELECT count(*)
FROM boxtmp
WHERE b && '(1000,1000,0,0)'::box;
count
-------
2
(1 row)
create index bix on boxtmp using rtree (b);
select count(*) from boxtmp where b && '(1000,1000,0,0)'::box;
CREATE INDEX bix ON boxtmp USING rtree (b);
SELECT count(*)
FROM boxtmp
WHERE b && '(1000,1000,0,0)'::box;
count
-------
2
(1 row)
drop index bix;
create index bix on boxtmp using gist (b);
select count(*) from boxtmp where b && '(1000,1000,0,0)'::box;
DROP INDEX bix;
CREATE INDEX bix ON boxtmp USING gist (b);
SELECT count(*)
FROM boxtmp
WHERE b && '(1000,1000,0,0)'::box;
count
-------
2
(1 row)
create table polytmp (p polygon);
CREATE TABLE polytmp (p polygon);
\copy polytmp from 'data/test_box.data'
create index pix on polytmp using rtree (p);
select count(*) from polytmp where p && '(1000,1000),(0,0)'::polygon;
CREATE INDEX pix ON polytmp USING rtree (p);
SELECT count(*)
FROM polytmp
WHERE p && '(1000,1000),(0,0)'::polygon;
count
-------
2
(1 row)
drop index pix;
create index pix on polytmp using gist (p);
select count(*) from polytmp where p && '(1000,1000),(0,0)'::polygon;
DROP INDEX pix;
CREATE INDEX pix ON polytmp USING gist (p);
SELECT count(*)
FROM polytmp
WHERE p && '(1000,1000),(0,0)'::polygon;
count
-------
2

View File

@ -1,8 +1,8 @@
begin transaction;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
--
--
--
@ -11,23 +11,45 @@ SET search_path = public;
--
--
-- define the GiST support methods
create function gbox_consistent(internal,box,int4) returns bool as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gbox_consistent(internal,box,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gbox_compress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gbox_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function rtree_decompress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION rtree_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gbox_penalty(internal,internal,internal) returns internal as 'MODULE_PATHNAME' language 'C' with (isstrict);
CREATE FUNCTION gbox_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
create function gbox_picksplit(internal, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gbox_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gbox_union(bytea, internal) returns box as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gbox_union(bytea, internal)
RETURNS box
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gbox_same(box, box, internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gbox_same(box, box, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- create the operator class
CREATE OPERATOR CLASS gist_box_ops
DEFAULT FOR TYPE box USING gist AS
DEFAULT FOR TYPE box USING gist
AS
OPERATOR 1 << ,
OPERATOR 2 &< ,
OPERATOR 3 && ,
@ -53,21 +75,28 @@ CREATE OPERATOR CLASS gist_box_ops
--
--
-- define the GiST support methods
create function gpoly_consistent(internal,polygon,int4) returns bool as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gpoly_consistent(internal,polygon,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function gpoly_compress(internal) returns internal as 'MODULE_PATHNAME' language 'C';
CREATE FUNCTION gpoly_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- create the operator class
CREATE OPERATOR CLASS gist_poly_ops
DEFAULT FOR TYPE polygon USING gist AS
OPERATOR 1 << RECHECK ,
OPERATOR 2 &< RECHECK ,
OPERATOR 3 && RECHECK ,
OPERATOR 4 &> RECHECK ,
OPERATOR 5 >> RECHECK ,
OPERATOR 6 ~= RECHECK ,
OPERATOR 7 ~ RECHECK ,
OPERATOR 8 @ RECHECK ,
DEFAULT FOR TYPE polygon USING gist
AS
OPERATOR 1 << RECHECK,
OPERATOR 2 &< RECHECK,
OPERATOR 3 && RECHECK,
OPERATOR 4 &> RECHECK,
OPERATOR 5 >> RECHECK,
OPERATOR 6 ~= RECHECK,
OPERATOR 7 ~ RECHECK,
OPERATOR 8 @ RECHECK,
FUNCTION 1 gpoly_consistent (internal, polygon, int4),
FUNCTION 2 gbox_union (bytea, internal),
FUNCTION 3 gpoly_compress (internal),
@ -76,6 +105,3 @@ CREATE OPERATOR CLASS gist_poly_ops
FUNCTION 6 gbox_picksplit (internal, internal),
FUNCTION 7 gbox_same (box, box, internal),
STORAGE box;
end transaction;

View File

@ -3,36 +3,46 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i rtree_gist.sql
\set ECHO all
create table boxtmp (b box);
CREATE TABLE boxtmp (b box);
\copy boxtmp from 'data/test_box.data'
select count(*) from boxtmp where b && '(1000,1000,0,0)'::box;
SELECT count(*)
FROM boxtmp
WHERE b && '(1000,1000,0,0)'::box;
create index bix on boxtmp using rtree (b);
CREATE INDEX bix ON boxtmp USING rtree (b);
select count(*) from boxtmp where b && '(1000,1000,0,0)'::box;
SELECT count(*)
FROM boxtmp
WHERE b && '(1000,1000,0,0)'::box;
drop index bix;
DROP INDEX bix;
create index bix on boxtmp using gist (b);
CREATE INDEX bix ON boxtmp USING gist (b);
select count(*) from boxtmp where b && '(1000,1000,0,0)'::box;
SELECT count(*)
FROM boxtmp
WHERE b && '(1000,1000,0,0)'::box;
create table polytmp (p polygon);
CREATE TABLE polytmp (p polygon);
\copy polytmp from 'data/test_box.data'
create index pix on polytmp using rtree (p);
CREATE INDEX pix ON polytmp USING rtree (p);
select count(*) from polytmp where p && '(1000,1000),(0,0)'::polygon;
SELECT count(*)
FROM polytmp
WHERE p && '(1000,1000),(0,0)'::polygon;
drop index pix;
DROP INDEX pix;
create index pix on polytmp using gist (p);
select count(*) from polytmp where p && '(1000,1000),(0,0)'::polygon;
CREATE INDEX pix ON polytmp USING gist (p);
SELECT count(*)
FROM polytmp
WHERE p && '(1000,1000),(0,0)'::polygon;

View File

@ -6,8 +6,8 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
psql:seg.sql:11: WARNING: ProcedureCreate: type seg is not yet defined
psql:seg.sql:16: WARNING: Argument type "seg" is only a shell
psql:seg.sql:12: WARNING: ProcedureCreate: type seg is not yet defined
psql:seg.sql:17: WARNING: Argument type "seg" is only a shell
--
-- testing the input and output functions
--

View File

@ -1,24 +1,25 @@
-- Create the user-defined type for 1-D floating point intervals (seg)
--
BEGIN TRANSACTION;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE FUNCTION seg_in(cstring)
RETURNS seg
AS 'MODULE_PATHNAME'
LANGUAGE 'c';
LANGUAGE 'C';
CREATE FUNCTION seg_out(seg)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c';
LANGUAGE 'C';
CREATE TYPE seg (
internallength = 12,
input = seg_in,
output = seg_out
INTERNALLENGTH = 12,
INPUT = seg_in,
OUTPUT = seg_out
);
COMMENT ON TYPE seg IS
@ -30,26 +31,34 @@ COMMENT ON TYPE seg IS
-- Left/Right methods
CREATE FUNCTION seg_over_left(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_over_left(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_over_left(seg, seg) IS
'is over and left of';
CREATE FUNCTION seg_over_right(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_over_right(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_over_right(seg, seg) IS
'is over and right of';
CREATE FUNCTION seg_left(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_left(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_left(seg, seg) IS
'is left of';
CREATE FUNCTION seg_right(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_right(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_right(seg, seg) IS
'is right of';
@ -57,78 +66,106 @@ COMMENT ON FUNCTION seg_right(seg, seg) IS
-- Comparison methods
CREATE FUNCTION seg_lt(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_lt(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_lt(seg, seg) IS
'less than';
CREATE FUNCTION seg_le(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_le(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_le(seg, seg) IS
'less than or equal';
CREATE FUNCTION seg_gt(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_gt(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_gt(seg, seg) IS
'greater than';
CREATE FUNCTION seg_ge(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_ge(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_ge(seg, seg) IS
'greater than or equal';
CREATE FUNCTION seg_contains(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_contains(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_contains(seg, seg) IS
'contains';
CREATE FUNCTION seg_contained(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_contained(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_contained(seg, seg) IS
'contained in';
CREATE FUNCTION seg_overlap(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_overlap(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_overlap(seg, seg) IS
'overlaps';
CREATE FUNCTION seg_same(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_same(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_same(seg, seg) IS
'same as';
CREATE FUNCTION seg_different(seg, seg) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_different(seg, seg)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION seg_different(seg, seg) IS
'different';
-- support routines for indexing
CREATE FUNCTION seg_union(seg, seg) RETURNS seg
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_union(seg, seg)
RETURNS seg
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION seg_inter(seg, seg) RETURNS seg
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_inter(seg, seg)
RETURNS seg
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION seg_size(seg) RETURNS float4
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_size(seg)
RETURNS float4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
-- miscellaneous
CREATE FUNCTION seg_upper(seg) RETURNS float4
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_upper(seg)
RETURNS float4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION seg_lower(seg) RETURNS float4
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION seg_lower(seg)
RETURNS float4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
--
@ -136,112 +173,173 @@ CREATE FUNCTION seg_lower(seg) RETURNS float4
--
CREATE OPERATOR < (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_lt,
COMMUTATOR = '>', NEGATOR = '>=',
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_lt,
COMMUTATOR = '>',
NEGATOR = '>=',
RESTRICT = scalarltsel,
JOIN = scalarltjoinsel
);
CREATE OPERATOR <= (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_le,
COMMUTATOR = '>=', NEGATOR = '>',
RESTRICT = scalarltsel, JOIN = scalarltjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_le,
COMMUTATOR = '>=',
NEGATOR = '>',
RESTRICT = scalarltsel,
JOIN = scalarltjoinsel
);
CREATE OPERATOR > (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_gt,
COMMUTATOR = '<', NEGATOR = '<=',
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_gt,
COMMUTATOR = '<',
NEGATOR = '<=',
RESTRICT = scalargtsel,
JOIN = scalargtjoinsel
);
CREATE OPERATOR >= (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_ge,
COMMUTATOR = '<=', NEGATOR = '<',
RESTRICT = scalargtsel, JOIN = scalargtjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_ge,
COMMUTATOR = '<=',
NEGATOR = '<',
RESTRICT = scalargtsel,
JOIN = scalargtjoinsel
);
CREATE OPERATOR << (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_left,
COMMUTATOR = '>>',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_left,
COMMUTATOR = '>>',
RESTRICT = positionsel,
JOIN = positionjoinsel
);
CREATE OPERATOR &< (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_over_left,
COMMUTATOR = '&>',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_over_left,
COMMUTATOR = '&>',
RESTRICT = positionsel,
JOIN = positionjoinsel
);
CREATE OPERATOR && (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_overlap,
COMMUTATOR = '&&',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_overlap,
COMMUTATOR = '&&',
RESTRICT = positionsel,
JOIN = positionjoinsel
);
CREATE OPERATOR &> (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_over_right,
COMMUTATOR = '&<',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_over_right,
COMMUTATOR = '&<',
RESTRICT = positionsel,
JOIN = positionjoinsel
);
CREATE OPERATOR >> (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_right,
COMMUTATOR = '<<',
RESTRICT = positionsel, JOIN = positionjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_right,
COMMUTATOR = '<<',
RESTRICT = positionsel,
JOIN = positionjoinsel
);
CREATE OPERATOR = (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_same,
COMMUTATOR = '=', NEGATOR = '<>',
RESTRICT = eqsel, JOIN = eqjoinsel,
SORT1 = '<', SORT2 = '<'
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_same,
COMMUTATOR = '=',
NEGATOR = '<>',
RESTRICT = eqsel,
JOIN = eqjoinsel,
SORT1 = '<',
SORT2 = '<'
);
CREATE OPERATOR <> (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_different,
COMMUTATOR = '<>', NEGATOR = '=',
RESTRICT = neqsel, JOIN = neqjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_different,
COMMUTATOR = '<>',
NEGATOR = '=',
RESTRICT = neqsel,
JOIN = neqjoinsel
);
CREATE OPERATOR @ (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_contains,
COMMUTATOR = '~',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_contains,
COMMUTATOR = '~',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~ (
LEFTARG = seg, RIGHTARG = seg, PROCEDURE = seg_contained,
COMMUTATOR = '@',
RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = seg,
RIGHTARG = seg,
PROCEDURE = seg_contained,
COMMUTATOR = '@',
RESTRICT = contsel,
JOIN = contjoinsel
);
-- define the GiST support methods
CREATE FUNCTION gseg_consistent(internal,seg,int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gseg_consistent(internal,seg,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gseg_compress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gseg_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gseg_decompress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gseg_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gseg_penalty(internal,internal,internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION gseg_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION gseg_picksplit(internal, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gseg_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gseg_union(bytea, internal) RETURNS seg
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gseg_union(bytea, internal)
RETURNS seg
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gseg_same(seg, seg, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gseg_same(seg, seg, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- Create the operator class for indexing
CREATE OPERATOR CLASS gist_seg_ops
DEFAULT FOR TYPE seg USING gist AS
DEFAULT FOR TYPE seg USING gist
AS
OPERATOR 1 << ,
OPERATOR 2 &< ,
OPERATOR 3 && ,
@ -257,6 +355,3 @@ CREATE OPERATOR CLASS gist_seg_ops
FUNCTION 5 gseg_penalty (internal, internal, internal),
FUNCTION 6 gseg_picksplit (internal, internal),
FUNCTION 7 gseg_same (seg, seg, internal);
END TRANSACTION;

View File

@ -7,6 +7,7 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i seg.sql
\set ECHO all

View File

@ -1,6 +1,9 @@
DROP FUNCTION autoinc();
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION autoinc()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION autoinc()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -1,6 +1,9 @@
DROP FUNCTION insert_username();
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION insert_username()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION insert_username()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -1,6 +1,9 @@
DROP FUNCTION moddatetime();
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION moddatetime()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION moddatetime()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -1,12 +1,14 @@
DROP FUNCTION check_primary_key ();
DROP FUNCTION check_foreign_key ();
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION check_primary_key ()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
SET autocommit TO 'on';
CREATE FUNCTION check_foreign_key ()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION check_primary_key()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION check_foreign_key()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -1,12 +1,14 @@
DROP FUNCTION timetravel();
DROP FUNCTION set_timetravel(name, int4);
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION timetravel()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
SET autocommit TO 'on';
CREATE FUNCTION set_timetravel(name, int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);
CREATE OR REPLACE FUNCTION timetravel()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE OR REPLACE FUNCTION set_timetravel(name, int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C' WITH (isStrict);

View File

@ -9,71 +9,76 @@
-- Define the new output functions.
--
create function c_charout(bpchar) returns cstring
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION c_charout(bpchar)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function c_textout(text) returns cstring
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION c_textout(text)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
create function c_varcharout(varchar) returns cstring
as 'MODULE_PATHNAME'
language 'c';
CREATE FUNCTION c_varcharout(varchar)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- This is not needed because escapes are handled by the parser
--
-- create function c_textin(cstring)
-- returns text
-- as 'MODULE_PATHNAME'
-- language 'c';
-- CREATE FUNCTION c_textin(cstring)
-- RETURNS text
-- AS 'MODULE_PATHNAME'
-- LANGUAGE 'c';
-- Define a function which sets the new output routines for char types.
--
-- select c_mode();
-- SELECT c_mode();
--
create function c_mode() returns text
as 'update pg_type set typoutput=''c_textout'' where typname=''SET'';
update pg_type set typoutput=''c_varcharout'' where typname=''bpchar'';
update pg_type set typoutput=''c_textout'' where typname=''bytea'';
update pg_type set typoutput=''c_charout'' where typname=''char'';
update pg_type set typoutput=''c_textout'' where typname=''text'';
update pg_type set typoutput=''c_textout'' where typname=''unknown'';
update pg_type set typoutput=''c_varcharout'' where typname=''varchar'';
CREATE FUNCTION c_mode()
RETURNS text
AS ' UPDATE pg_type SET typoutput=''c_textout'' WHERE typname=''SET'';
UPDATE pg_type SET typoutput=''c_varcharout'' WHERE typname=''bpchar'';
UPDATE pg_type SET typoutput=''c_textout'' WHERE typname=''bytea'';
UPDATE pg_type SET typoutput=''c_charout'' WHERE typname=''char'';
UPDATE pg_type SET typoutput=''c_textout'' WHERE typname=''text'';
UPDATE pg_type SET typoutput=''c_textout'' WHERE typname=''unknown'';
UPDATE pg_type SET typoutput=''c_varcharout'' WHERE typname=''varchar'';
select ''c_mode''::text;'
language 'sql';
LANGUAGE 'SQL';
-- Define a function which restores the standard routines for char types.
--
-- select pg_mode();
-- SELECT pg_mode();
--
create function pg_mode() returns text
as 'update pg_type set typoutput=''textout'' where typname=''SET'';
update pg_type set typoutput=''varcharout'' where typname=''bpchar'';
update pg_type set typoutput=''textout'' where typname=''bytea'';
update pg_type set typoutput=''charout'' where typname=''char'';
update pg_type set typoutput=''textout'' where typname=''text'';
update pg_type set typoutput=''textout'' where typname=''unknown'';
update pg_type set typoutput=''varcharout'' where typname=''varchar'';
CREATE FUNCTION pg_mode()
RETURNS text
AS ' UPDATE pg_type SET typoutput=''textout'' WHERE typname=''SET'';
UPDATE pg_type SET typoutput=''varcharout'' WHERE typname=''bpchar'';
UPDATE pg_type SET typoutput=''textout'' WHERE typname=''bytea'';
UPDATE pg_type SET typoutput=''charout'' WHERE typname=''char'';
UPDATE pg_type SET typoutput=''textout'' WHERE typname=''text'';
UPDATE pg_type SET typoutput=''textout'' WHERE typname=''unknown'';
UPDATE pg_type SET typoutput=''varcharout'' WHERE typname=''varchar'';
select ''pg_mode''::text;'
language 'sql';
LANGUAGE 'SQL';
-- Use these to do the changes manually.
--
-- update pg_type set typoutput='textout' where typname='SET';
-- update pg_type set typoutput='varcharout' where typname='bpchar';
-- update pg_type set typoutput='textout' where typname='bytea';
-- update pg_type set typoutput='charout' where typname='char';
-- update pg_type set typoutput='textout' where typname='text';
-- update pg_type set typoutput='textout' where typname='unknown';
-- update pg_type set typoutput='varcharout' where typname='varchar';
-- UPDATE pg_type SET typoutput='textout' WHERE typname='SET';
-- UPDATE pg_type SET typoutput='varcharout' WHERE typname='bpchar';
-- UPDATE pg_type SET typoutput='textout' WHERE typname='bytea';
-- UPDATE pg_type SET typoutput='charout' WHERE typname='char';
-- UPDATE pg_type SET typoutput='textout' WHERE typname='text';
-- UPDATE pg_type SET typoutput='textout' WHERE typname='unknown';
-- UPDATE pg_type SET typoutput='varcharout' WHERE typname='varchar';
--
-- update pg_type set typoutput='c_textout' where typname='SET';
-- update pg_type set typoutput='c_varcharout' where typname='bpchar';
-- update pg_type set typoutput='c_textout' where typname='bytea';
-- update pg_type set typoutput='c_charout' where typname='char';
-- update pg_type set typoutput='c_textout' where typname='text';
-- update pg_type set typoutput='c_textout' where typname='unknown';
-- update pg_type set typoutput='c_varcharout' where typname='varchar';
-- UPDATE pg_type SET typoutput='c_textout' WHERE typname='SET';
-- UPDATE pg_type SET typoutput='c_varcharout' WHERE typname='bpchar';
-- UPDATE pg_type SET typoutput='c_textout' WHERE typname='bytea';
-- UPDATE pg_type SET typoutput='c_charout' WHERE typname='char';
-- UPDATE pg_type SET typoutput='c_textout' WHERE typname='text';
-- UPDATE pg_type SET typoutput='c_textout' WHERE typname='unknown';
-- UPDATE pg_type SET typoutput='c_varcharout' WHERE typname='varchar';
-- end of file

View File

@ -16,107 +16,107 @@ SELECT avg(normal_rand)::int FROM normal_rand(100, 250, 0.2, EXTRACT(SECONDS FRO
--
-- crosstab()
--
create table ct(id int, rowclass text, rowid text, attribute text, value text);
CREATE TABLE ct(id int, rowclass text, rowid text, attribute text, value text);
\copy ct from 'data/ct.data'
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;');
row_name | category_1 | category_2
----------+------------+------------
test1 | val2 | val3
test2 | val6 | val7
(2 rows)
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') order by 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3
----------+------------+------------+------------
test1 | val2 | val3 |
test2 | val6 | val7 |
(2 rows)
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') order by 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3 | category_4
----------+------------+------------+------------+------------
test1 | val2 | val3 | |
test2 | val6 | val7 | |
(2 rows)
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;');
row_name | category_1 | category_2
----------+------------+------------
test1 | val1 | val2
test2 | val5 | val6
(2 rows)
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3
----------+------------+------------+------------
test1 | val1 | val2 | val3
test2 | val5 | val6 | val7
(2 rows)
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3 | category_4
----------+------------+------------+------------+------------
test1 | val1 | val2 | val3 | val4
test2 | val5 | val6 | val7 | val8
(2 rows)
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') ORDER BY 1,2;');
row_name | category_1 | category_2
----------+------------+------------
test3 | val1 | val2
test4 | val4 | val5
(2 rows)
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') order by 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3
----------+------------+------------+------------
test3 | val1 | val2 |
test4 | val4 | val5 |
(2 rows)
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') order by 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3 | category_4
----------+------------+------------+------------+------------
test3 | val1 | val2 | |
test4 | val4 | val5 | |
(2 rows)
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group2'' order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' ORDER BY 1,2;');
row_name | category_1 | category_2
----------+------------+------------
test3 | val1 | val2
test4 | val4 | val5
(2 rows)
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group2'' order by 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3
----------+------------+------------+------------
test3 | val1 | val2 | val3
test4 | val4 | val5 | val6
(2 rows)
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group2'' order by 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' ORDER BY 1,2;');
row_name | category_1 | category_2 | category_3 | category_4
----------+------------+------------+------------+------------
test3 | val1 | val2 | val3 |
test4 | val4 | val5 | val6 |
(2 rows)
select * from crosstab('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;', 2) as c(rowid text, att1 text, att2 text);
SELECT * FROM crosstab('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;', 2) AS c(rowid text, att1 text, att2 text);
rowid | att1 | att2
-------+------+------
test1 | val1 | val2
test2 | val5 | val6
(2 rows)
select * from crosstab('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;', 3) as c(rowid text, att1 text, att2 text, att3 text);
SELECT * FROM crosstab('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;', 3) AS c(rowid text, att1 text, att2 text, att3 text);
rowid | att1 | att2 | att3
-------+------+------+------
test1 | val1 | val2 | val3
test2 | val5 | val6 | val7
(2 rows)
select * from crosstab('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;', 4) as c(rowid text, att1 text, att2 text, att3 text, att4 text);
SELECT * FROM crosstab('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;', 4) AS c(rowid text, att1 text, att2 text, att3 text, att4 text);
rowid | att1 | att2 | att3 | att4
-------+------+------+------+------
test1 | val1 | val2 | val3 | val4

View File

@ -3,6 +3,7 @@
-- does not depend on contents of tablefunc.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i tablefunc.sql
\set ECHO all
@ -15,28 +16,28 @@ SELECT avg(normal_rand)::int FROM normal_rand(100, 250, 0.2, EXTRACT(SECONDS FRO
--
-- crosstab()
--
create table ct(id int, rowclass text, rowid text, attribute text, value text);
CREATE TABLE ct(id int, rowclass text, rowid text, attribute text, value text);
\copy ct from 'data/ct.data'
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') order by 1,2;');
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') order by 1,2;');
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;');
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;');
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;');
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;');
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') order by 1,2;');
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') order by 1,2;');
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') ORDER BY 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') ORDER BY 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' and (attribute = ''att1'' or attribute = ''att2'') ORDER BY 1,2;');
select * from crosstab2('select rowid, attribute, value from ct where rowclass = ''group2'' order by 1,2;');
select * from crosstab3('select rowid, attribute, value from ct where rowclass = ''group2'' order by 1,2;');
select * from crosstab4('select rowid, attribute, value from ct where rowclass = ''group2'' order by 1,2;');
SELECT * FROM crosstab2('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' ORDER BY 1,2;');
SELECT * FROM crosstab3('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' ORDER BY 1,2;');
SELECT * FROM crosstab4('SELECT rowid, attribute, value FROM ct where rowclass = ''group2'' ORDER BY 1,2;');
select * from crosstab('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;', 2) as c(rowid text, att1 text, att2 text);
select * from crosstab('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;', 3) as c(rowid text, att1 text, att2 text, att3 text);
select * from crosstab('select rowid, attribute, value from ct where rowclass = ''group1'' order by 1,2;', 4) as c(rowid text, att1 text, att2 text, att3 text, att4 text);
SELECT * FROM crosstab('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;', 2) AS c(rowid text, att1 text, att2 text);
SELECT * FROM crosstab('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;', 3) AS c(rowid text, att1 text, att2 text, att3 text);
SELECT * FROM crosstab('SELECT rowid, attribute, value FROM ct where rowclass = ''group1'' ORDER BY 1,2;', 4) AS c(rowid text, att1 text, att2 text, att3 text, att4 text);
-- test connectby with text based hierarchy
CREATE TABLE connectby_text(keyid text, parent_keyid text);

View File

@ -1,59 +1,63 @@
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION normal_rand(int4, float8, float8, int4)
RETURNS setof float8
AS 'MODULE_PATHNAME','normal_rand' LANGUAGE 'c' VOLATILE STRICT;
RETURNS setof float8
AS 'MODULE_PATHNAME','normal_rand'
LANGUAGE 'C' VOLATILE STRICT;
CREATE TYPE tablefunc_crosstab_2 AS
(
row_name TEXT,
category_1 TEXT,
category_2 TEXT
row_name TEXT,
category_1 TEXT,
category_2 TEXT
);
CREATE TYPE tablefunc_crosstab_3 AS
(
row_name TEXT,
category_1 TEXT,
category_2 TEXT,
category_3 TEXT
row_name TEXT,
category_1 TEXT,
category_2 TEXT,
category_3 TEXT
);
CREATE TYPE tablefunc_crosstab_4 AS
(
row_name TEXT,
category_1 TEXT,
category_2 TEXT,
category_3 TEXT,
category_4 TEXT
row_name TEXT,
category_1 TEXT,
category_2 TEXT,
category_3 TEXT,
category_4 TEXT
);
CREATE OR REPLACE FUNCTION crosstab2(text)
RETURNS setof tablefunc_crosstab_2
AS 'MODULE_PATHNAME','crosstab' LANGUAGE 'c' STABLE STRICT;
RETURNS setof tablefunc_crosstab_2
AS 'MODULE_PATHNAME','crosstab'
LANGUAGE 'C' STABLE STRICT;
CREATE OR REPLACE FUNCTION crosstab3(text)
RETURNS setof tablefunc_crosstab_3
AS 'MODULE_PATHNAME','crosstab' LANGUAGE 'c' STABLE STRICT;
RETURNS setof tablefunc_crosstab_3
AS 'MODULE_PATHNAME','crosstab'
LANGUAGE 'C' STABLE STRICT;
CREATE OR REPLACE FUNCTION crosstab4(text)
RETURNS setof tablefunc_crosstab_4
AS 'MODULE_PATHNAME','crosstab' LANGUAGE 'c' STABLE STRICT;
RETURNS setof tablefunc_crosstab_4
AS 'MODULE_PATHNAME','crosstab'
LANGUAGE 'C' STABLE STRICT;
CREATE OR REPLACE FUNCTION crosstab(text,int)
RETURNS setof record
AS 'MODULE_PATHNAME','crosstab' LANGUAGE 'c' STABLE STRICT;
RETURNS setof record
AS 'MODULE_PATHNAME','crosstab'
LANGUAGE 'C' STABLE STRICT;
CREATE OR REPLACE FUNCTION connectby(text,text,text,text,int,text)
RETURNS setof record
AS 'MODULE_PATHNAME','connectby_text' LANGUAGE 'c' STABLE STRICT;
RETURNS setof record
AS 'MODULE_PATHNAME','connectby_text'
LANGUAGE 'C' STABLE STRICT;
CREATE OR REPLACE FUNCTION connectby(text,text,text,text,int)
RETURNS setof record
AS 'MODULE_PATHNAME','connectby_text' LANGUAGE 'c' STABLE STRICT;
GRANT EXECUTE ON FUNCTION normal_rand(int4, float8, float8, int4) TO PUBLIC;
GRANT EXECUTE ON FUNCTION crosstab2(text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION crosstab3(text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION crosstab4(text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION crosstab(text,int) TO PUBLIC;
GRANT EXECUTE ON FUNCTION connectby(text,text,text,text,int,text) TO PUBLIC;
GRANT EXECUTE ON FUNCTION connectby(text,text,text,text,int) TO PUBLIC;
RETURNS setof record
AS 'MODULE_PATHNAME','connectby_text'
LANGUAGE 'C' STABLE STRICT;

View File

@ -9,539 +9,539 @@ psql:tsearch.sql:40: WARNING: ProcedureCreate: type query_txt is not yet define
psql:tsearch.sql:45: WARNING: Argument type "query_txt" is only a shell
psql:tsearch.sql:57: WARNING: ProcedureCreate: type mquery_txt is not yet defined
psql:tsearch.sql:63: WARNING: Argument type "mquery_txt" is only a shell
psql:tsearch.sql:133: WARNING: ProcedureCreate: type gtxtidx is not yet defined
psql:tsearch.sql:138: WARNING: Argument type "gtxtidx" is only a shell
psql:tsearch.sql:158: WARNING: ProcedureCreate: type gtxtidx is not yet defined
psql:tsearch.sql:163: WARNING: Argument type "gtxtidx" is only a shell
--txtidx
select '1'::txtidx;
SELECT '1'::txtidx;
txtidx
--------
'1'
(1 row)
select '1 '::txtidx;
SELECT '1 '::txtidx;
txtidx
--------
'1'
(1 row)
select ' 1'::txtidx;
SELECT ' 1'::txtidx;
txtidx
--------
'1'
(1 row)
select ' 1 '::txtidx;
SELECT ' 1 '::txtidx;
txtidx
--------
'1'
(1 row)
select '1 2'::txtidx;
SELECT '1 2'::txtidx;
txtidx
---------
'1' '2'
(1 row)
select '\'1 2\''::txtidx;
SELECT '\'1 2\''::txtidx;
txtidx
--------
'1 2'
(1 row)
select '\'1 \\\'2\''::txtidx;
SELECT '\'1 \\\'2\''::txtidx;
txtidx
---------
'1 \'2'
(1 row)
select '\'1 \\\'2\'3'::txtidx;
SELECT '\'1 \\\'2\'3'::txtidx;
txtidx
-------------
'3' '1 \'2'
(1 row)
select '\'1 \\\'2\' 3'::txtidx;
SELECT '\'1 \\\'2\' 3'::txtidx;
txtidx
-------------
'3' '1 \'2'
(1 row)
select '\'1 \\\'2\' \' 3\' 4 '::txtidx;
SELECT '\'1 \\\'2\' \' 3\' 4 '::txtidx;
txtidx
------------------
'4' ' 3' '1 \'2'
(1 row)
--query_txt
select '1'::query_txt;
SELECT '1'::query_txt;
query_txt
-----------
'1'
(1 row)
select '1 '::query_txt;
SELECT '1 '::query_txt;
query_txt
-----------
'1'
(1 row)
select ' 1'::query_txt;
SELECT ' 1'::query_txt;
query_txt
-----------
'1'
(1 row)
select ' 1 '::query_txt;
SELECT ' 1 '::query_txt;
query_txt
-----------
'1'
(1 row)
select '\'1 2\''::query_txt;
SELECT '\'1 2\''::query_txt;
query_txt
-----------
'1 2'
(1 row)
select '\'1 \\\'2\''::query_txt;
SELECT '\'1 \\\'2\''::query_txt;
query_txt
-----------
'1 \'2'
(1 row)
select '!1'::query_txt;
SELECT '!1'::query_txt;
query_txt
-----------
!'1'
(1 row)
select '1|2'::query_txt;
SELECT '1|2'::query_txt;
query_txt
-----------
'1' | '2'
(1 row)
select '1|!2'::query_txt;
SELECT '1|!2'::query_txt;
query_txt
------------
'1' | !'2'
(1 row)
select '!1|2'::query_txt;
SELECT '!1|2'::query_txt;
query_txt
------------
!'1' | '2'
(1 row)
select '!1|!2'::query_txt;
SELECT '!1|!2'::query_txt;
query_txt
-------------
!'1' | !'2'
(1 row)
select '!(!1|!2)'::query_txt;
SELECT '!(!1|!2)'::query_txt;
query_txt
------------------
!( !'1' | !'2' )
(1 row)
select '!(!1|2)'::query_txt;
SELECT '!(!1|2)'::query_txt;
query_txt
-----------------
!( !'1' | '2' )
(1 row)
select '!(1|!2)'::query_txt;
SELECT '!(1|!2)'::query_txt;
query_txt
-----------------
!( '1' | !'2' )
(1 row)
select '!(1|2)'::query_txt;
SELECT '!(1|2)'::query_txt;
query_txt
----------------
!( '1' | '2' )
(1 row)
select '1&2'::query_txt;
SELECT '1&2'::query_txt;
query_txt
-----------
'1' & '2'
(1 row)
select '!1&2'::query_txt;
SELECT '!1&2'::query_txt;
query_txt
------------
!'1' & '2'
(1 row)
select '1&!2'::query_txt;
SELECT '1&!2'::query_txt;
query_txt
------------
'1' & !'2'
(1 row)
select '!1&!2'::query_txt;
SELECT '!1&!2'::query_txt;
query_txt
-------------
!'1' & !'2'
(1 row)
select '(1&2)'::query_txt;
SELECT '(1&2)'::query_txt;
query_txt
-----------
'1' & '2'
(1 row)
select '1&(2)'::query_txt;
SELECT '1&(2)'::query_txt;
query_txt
-----------
'1' & '2'
(1 row)
select '!(1)&2'::query_txt;
SELECT '!(1)&2'::query_txt;
query_txt
------------
!'1' & '2'
(1 row)
select '!(1&2)'::query_txt;
SELECT '!(1&2)'::query_txt;
query_txt
----------------
!( '1' & '2' )
(1 row)
select '1|2&3'::query_txt;
SELECT '1|2&3'::query_txt;
query_txt
-----------------
'1' | '2' & '3'
(1 row)
select '1|(2&3)'::query_txt;
SELECT '1|(2&3)'::query_txt;
query_txt
-----------------
'1' | '2' & '3'
(1 row)
select '(1|2)&3'::query_txt;
SELECT '(1|2)&3'::query_txt;
query_txt
---------------------
( '1' | '2' ) & '3'
(1 row)
select '1|2&!3'::query_txt;
SELECT '1|2&!3'::query_txt;
query_txt
------------------
'1' | '2' & !'3'
(1 row)
select '1|!2&3'::query_txt;
SELECT '1|!2&3'::query_txt;
query_txt
------------------
'1' | !'2' & '3'
(1 row)
select '!1|2&3'::query_txt;
SELECT '!1|2&3'::query_txt;
query_txt
------------------
!'1' | '2' & '3'
(1 row)
select '!1|(2&3)'::query_txt;
SELECT '!1|(2&3)'::query_txt;
query_txt
------------------
!'1' | '2' & '3'
(1 row)
select '!(1|2)&3'::query_txt;
SELECT '!(1|2)&3'::query_txt;
query_txt
----------------------
!( '1' | '2' ) & '3'
(1 row)
select '(!1|2)&3'::query_txt;
SELECT '(!1|2)&3'::query_txt;
query_txt
----------------------
( !'1' | '2' ) & '3'
(1 row)
select '1|(2|(4|(5|6)))'::query_txt;
SELECT '1|(2|(4|(5|6)))'::query_txt;
query_txt
-----------------------------------------
'1' | ( '2' | ( '4' | ( '5' | '6' ) ) )
(1 row)
select '1|2|4|5|6'::query_txt;
SELECT '1|2|4|5|6'::query_txt;
query_txt
-----------------------------------------
( ( ( '1' | '2' ) | '4' ) | '5' ) | '6'
(1 row)
select '1&(2&(4&(5&6)))'::query_txt;
SELECT '1&(2&(4&(5&6)))'::query_txt;
query_txt
-----------------------------
'1' & '2' & '4' & '5' & '6'
(1 row)
select '1&2&4&5&6'::query_txt;
SELECT '1&2&4&5&6'::query_txt;
query_txt
-----------------------------
'1' & '2' & '4' & '5' & '6'
(1 row)
select '1&(2&(4&(5|6)))'::query_txt;
SELECT '1&(2&(4&(5|6)))'::query_txt;
query_txt
---------------------------------
'1' & '2' & '4' & ( '5' | '6' )
(1 row)
select '1&(2&(4&(5|!6)))'::query_txt;
SELECT '1&(2&(4&(5|!6)))'::query_txt;
query_txt
----------------------------------
'1' & '2' & '4' & ( '5' | !'6' )
(1 row)
select '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::query_txt;
SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::query_txt;
query_txt
------------------------------------------
'1' & '2' & ' 4' & ( '|5' | '6 \' !|&' )
(1 row)
select '1'::mquery_txt;
SELECT '1'::mquery_txt;
mquery_txt
------------
'1'
(1 row)
select '1 '::mquery_txt;
SELECT '1 '::mquery_txt;
mquery_txt
------------
'1'
(1 row)
select ' 1'::mquery_txt;
SELECT ' 1'::mquery_txt;
mquery_txt
------------
'1'
(1 row)
select ' 1 '::mquery_txt;
SELECT ' 1 '::mquery_txt;
mquery_txt
------------
'1'
(1 row)
select '\'1 2\''::mquery_txt;
SELECT '\'1 2\''::mquery_txt;
mquery_txt
------------
'1' & '2'
(1 row)
select '\'1 \\\'2\''::mquery_txt;
SELECT '\'1 \\\'2\''::mquery_txt;
mquery_txt
------------
'1' & '2'
(1 row)
select '!1'::mquery_txt;
SELECT '!1'::mquery_txt;
mquery_txt
------------
!'1'
(1 row)
select '1|2'::mquery_txt;
SELECT '1|2'::mquery_txt;
mquery_txt
------------
'1' | '2'
(1 row)
select '1|!2'::mquery_txt;
SELECT '1|!2'::mquery_txt;
mquery_txt
------------
'1' | !'2'
(1 row)
select '!1|2'::mquery_txt;
SELECT '!1|2'::mquery_txt;
mquery_txt
------------
!'1' | '2'
(1 row)
select '!1|!2'::mquery_txt;
SELECT '!1|!2'::mquery_txt;
mquery_txt
-------------
!'1' | !'2'
(1 row)
select '!(!1|!2)'::mquery_txt;
SELECT '!(!1|!2)'::mquery_txt;
mquery_txt
------------------
!( !'1' | !'2' )
(1 row)
select '!(!1|2)'::mquery_txt;
SELECT '!(!1|2)'::mquery_txt;
mquery_txt
-----------------
!( !'1' | '2' )
(1 row)
select '!(1|!2)'::mquery_txt;
SELECT '!(1|!2)'::mquery_txt;
mquery_txt
-----------------
!( '1' | !'2' )
(1 row)
select '!(1|2)'::mquery_txt;
SELECT '!(1|2)'::mquery_txt;
mquery_txt
----------------
!( '1' | '2' )
(1 row)
select '1&2'::mquery_txt;
SELECT '1&2'::mquery_txt;
mquery_txt
------------
'1' & '2'
(1 row)
select '!1&2'::mquery_txt;
SELECT '!1&2'::mquery_txt;
mquery_txt
------------
!'1' & '2'
(1 row)
select '1&!2'::mquery_txt;
SELECT '1&!2'::mquery_txt;
mquery_txt
------------
'1' & !'2'
(1 row)
select '!1&!2'::mquery_txt;
SELECT '!1&!2'::mquery_txt;
mquery_txt
-------------
!'1' & !'2'
(1 row)
select '(1&2)'::mquery_txt;
SELECT '(1&2)'::mquery_txt;
mquery_txt
------------
'1' & '2'
(1 row)
select '1&(2)'::mquery_txt;
SELECT '1&(2)'::mquery_txt;
mquery_txt
------------
'1' & '2'
(1 row)
select '!(1)&2'::mquery_txt;
SELECT '!(1)&2'::mquery_txt;
mquery_txt
------------
!'1' & '2'
(1 row)
select '!(1&2)'::mquery_txt;
SELECT '!(1&2)'::mquery_txt;
mquery_txt
----------------
!( '1' & '2' )
(1 row)
select '1|2&3'::mquery_txt;
SELECT '1|2&3'::mquery_txt;
mquery_txt
-----------------
'1' | '2' & '3'
(1 row)
select '1|(2&3)'::mquery_txt;
SELECT '1|(2&3)'::mquery_txt;
mquery_txt
-----------------
'1' | '2' & '3'
(1 row)
select '(1|2)&3'::mquery_txt;
SELECT '(1|2)&3'::mquery_txt;
mquery_txt
---------------------
( '1' | '2' ) & '3'
(1 row)
select '1|2&!3'::mquery_txt;
SELECT '1|2&!3'::mquery_txt;
mquery_txt
------------------
'1' | '2' & !'3'
(1 row)
select '1|!2&3'::mquery_txt;
SELECT '1|!2&3'::mquery_txt;
mquery_txt
------------------
'1' | !'2' & '3'
(1 row)
select '!1|2&3'::mquery_txt;
SELECT '!1|2&3'::mquery_txt;
mquery_txt
------------------
!'1' | '2' & '3'
(1 row)
select '!1|(2&3)'::mquery_txt;
SELECT '!1|(2&3)'::mquery_txt;
mquery_txt
------------------
!'1' | '2' & '3'
(1 row)
select '!(1|2)&3'::mquery_txt;
SELECT '!(1|2)&3'::mquery_txt;
mquery_txt
----------------------
!( '1' | '2' ) & '3'
(1 row)
select '(!1|2)&3'::mquery_txt;
SELECT '(!1|2)&3'::mquery_txt;
mquery_txt
----------------------
( !'1' | '2' ) & '3'
(1 row)
select '1|(2|(4|(5|6)))'::mquery_txt;
SELECT '1|(2|(4|(5|6)))'::mquery_txt;
mquery_txt
-----------------------------------------
'1' | ( '2' | ( '4' | ( '5' | '6' ) ) )
(1 row)
select '1|2|4|5|6'::mquery_txt;
SELECT '1|2|4|5|6'::mquery_txt;
mquery_txt
-----------------------------------------
( ( ( '1' | '2' ) | '4' ) | '5' ) | '6'
(1 row)
select '1&(2&(4&(5&6)))'::mquery_txt;
SELECT '1&(2&(4&(5&6)))'::mquery_txt;
mquery_txt
-----------------------------
'1' & '2' & '4' & '5' & '6'
(1 row)
select '1&2&4&5&6'::mquery_txt;
SELECT '1&2&4&5&6'::mquery_txt;
mquery_txt
-----------------------------
'1' & '2' & '4' & '5' & '6'
(1 row)
select '1&(2&(4&(5|6)))'::mquery_txt;
SELECT '1&(2&(4&(5|6)))'::mquery_txt;
mquery_txt
---------------------------------
'1' & '2' & '4' & ( '5' | '6' )
(1 row)
select '1&(2&(4&(5|!6)))'::mquery_txt;
SELECT '1&(2&(4&(5|!6)))'::mquery_txt;
mquery_txt
----------------------------------
'1' & '2' & '4' & ( '5' | !'6' )
(1 row)
select '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::mquery_txt;
SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::mquery_txt;
mquery_txt
---------------------------------
'1' & '2' & '4' & ( '5' | '6' )
(1 row)
select 'querty-fgries | http://www.google.com/index.html | www.rambler.ru/index.shtml'::mquery_txt;
SELECT 'querty-fgries | http://www.google.com/index.html | www.rambler.ru/index.shtml'::mquery_txt;
mquery_txt
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
( 'querty-fgri' & 'querti' & 'fgri' | 'www.google.com/index.html' & 'www.google.com' & '/index.html' ) | 'www.rambler.ru/index.shtml' & 'www.rambler.ru' & '/index.shtml'
@ -694,7 +694,7 @@ SELECT count(*) FROM test_txtidx WHERE a ## '(eq|yt)&(wR|qh)';
11
(1 row)
select txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
SELECT txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
<i <b> wow < jqw <> qwerty');
txt2txtidx
@ -702,13 +702,13 @@ select txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&
'ad' 'dw' 'jf' '234' '345' '4.2' '455' 'jqw' 'qwe' 'wer' 'wow' 'asdf' 'ewr1' 'qwer' 'sdjk' '5.005' 'ewri2' 'qwqwe' 'wefjn' 'gist.c' 'gist.h' 'qwerti' '234.435' ':8100/?' 'qwe-wer' 'readlin' 'www.com' '+4.0e-10' 'gist.h.c' 'rewt/ewr' 'qwe@efd.r' 'readline-4' '/?ad=qwe&dw' '/wqe-324/ewr' 'aew.werc.ewr' '1aew.werc.ewr' '2aew.werc.ewr' '3aew.werc.ewr' '4aew.werc.ewr' '5aew.werc.ewr' '6aew.werc.ewr' '7aew.werc.ewr' '/usr/local/fff' '/awdf/dwqe/4325' ':8100/?ad=qwe&dw' 'teodor@stack.net' '5aew.werc.ewr:8100/?' ':8100/?ad=qwe&dw=%20%32' 'aew.werc.ewr/?ad=qwe&dw' '1aew.werc.ewr/?ad=qwe&dw' '3aew.werc.ewr/?ad=qwe&dw' '6aew.werc.ewr:8100/?ad=qwe&dw' '7aew.werc.ewr:8100/?ad=qwe&dw=%20%32'
(1 row)
select txtidxsize(txt2txtidx('345 qw'));
SELECT txtidxsize(txt2txtidx('345 qw'));
txtidxsize
------------
2
(1 row)
select txtidxsize(txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
SELECT txtidxsize(txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
<i <b> wow < jqw <> qwerty'));
txtidxsize
@ -716,30 +716,31 @@ select txtidxsize(txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.e
53
(1 row)
insert into test_txtidx (a) values ('345 qwerty');
create trigger txtidxupdate before update or insert on test_txtidx
for each row execute procedure tsearch(a, t);
insert into test_txtidx (t) values ('345 qwerty');
select count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
INSERT INTO test_txtidx (a) VALUES ('345 qwerty');
CREATE TRIGGER txtidxupdate
BEFORE UPDATE OR INSERT ON test_txtidx
FOR EACH ROW EXECUTE PROCEDURE tsearch(a, t);
INSERT INTO test_txtidx (t) VALUES ('345 qwerty');
SELECT count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
count
-------
1
(1 row)
select count(*) FROM test_txtidx WHERE a ## '345&qwerty';
SELECT count(*) FROM test_txtidx WHERE a ## '345&qwerty';
count
-------
1
(1 row)
update test_txtidx set t = null where t = '345 qwerty';
select count(*) FROM test_txtidx WHERE a ## '345&qwerty';
UPDATE test_txtidx SET t = null WHERE t = '345 qwerty';
SELECT count(*) FROM test_txtidx WHERE a ## '345&qwerty';
count
-------
0
(1 row)
select count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
SELECT count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
count
-------
1

View File

@ -3,101 +3,102 @@
-- does not depend on contents of seg.sql.
--
\set ECHO none
SET autocommit TO 'on';
\i tsearch.sql
\set ECHO all
--txtidx
select '1'::txtidx;
select '1 '::txtidx;
select ' 1'::txtidx;
select ' 1 '::txtidx;
select '1 2'::txtidx;
select '\'1 2\''::txtidx;
select '\'1 \\\'2\''::txtidx;
select '\'1 \\\'2\'3'::txtidx;
select '\'1 \\\'2\' 3'::txtidx;
select '\'1 \\\'2\' \' 3\' 4 '::txtidx;
SELECT '1'::txtidx;
SELECT '1 '::txtidx;
SELECT ' 1'::txtidx;
SELECT ' 1 '::txtidx;
SELECT '1 2'::txtidx;
SELECT '\'1 2\''::txtidx;
SELECT '\'1 \\\'2\''::txtidx;
SELECT '\'1 \\\'2\'3'::txtidx;
SELECT '\'1 \\\'2\' 3'::txtidx;
SELECT '\'1 \\\'2\' \' 3\' 4 '::txtidx;
--query_txt
select '1'::query_txt;
select '1 '::query_txt;
select ' 1'::query_txt;
select ' 1 '::query_txt;
select '\'1 2\''::query_txt;
select '\'1 \\\'2\''::query_txt;
select '!1'::query_txt;
select '1|2'::query_txt;
select '1|!2'::query_txt;
select '!1|2'::query_txt;
select '!1|!2'::query_txt;
select '!(!1|!2)'::query_txt;
select '!(!1|2)'::query_txt;
select '!(1|!2)'::query_txt;
select '!(1|2)'::query_txt;
select '1&2'::query_txt;
select '!1&2'::query_txt;
select '1&!2'::query_txt;
select '!1&!2'::query_txt;
select '(1&2)'::query_txt;
select '1&(2)'::query_txt;
select '!(1)&2'::query_txt;
select '!(1&2)'::query_txt;
select '1|2&3'::query_txt;
select '1|(2&3)'::query_txt;
select '(1|2)&3'::query_txt;
select '1|2&!3'::query_txt;
select '1|!2&3'::query_txt;
select '!1|2&3'::query_txt;
select '!1|(2&3)'::query_txt;
select '!(1|2)&3'::query_txt;
select '(!1|2)&3'::query_txt;
select '1|(2|(4|(5|6)))'::query_txt;
select '1|2|4|5|6'::query_txt;
select '1&(2&(4&(5&6)))'::query_txt;
select '1&2&4&5&6'::query_txt;
select '1&(2&(4&(5|6)))'::query_txt;
select '1&(2&(4&(5|!6)))'::query_txt;
select '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::query_txt;
select '1'::mquery_txt;
select '1 '::mquery_txt;
select ' 1'::mquery_txt;
select ' 1 '::mquery_txt;
select '\'1 2\''::mquery_txt;
select '\'1 \\\'2\''::mquery_txt;
select '!1'::mquery_txt;
select '1|2'::mquery_txt;
select '1|!2'::mquery_txt;
select '!1|2'::mquery_txt;
select '!1|!2'::mquery_txt;
select '!(!1|!2)'::mquery_txt;
select '!(!1|2)'::mquery_txt;
select '!(1|!2)'::mquery_txt;
select '!(1|2)'::mquery_txt;
select '1&2'::mquery_txt;
select '!1&2'::mquery_txt;
select '1&!2'::mquery_txt;
select '!1&!2'::mquery_txt;
select '(1&2)'::mquery_txt;
select '1&(2)'::mquery_txt;
select '!(1)&2'::mquery_txt;
select '!(1&2)'::mquery_txt;
select '1|2&3'::mquery_txt;
select '1|(2&3)'::mquery_txt;
select '(1|2)&3'::mquery_txt;
select '1|2&!3'::mquery_txt;
select '1|!2&3'::mquery_txt;
select '!1|2&3'::mquery_txt;
select '!1|(2&3)'::mquery_txt;
select '!(1|2)&3'::mquery_txt;
select '(!1|2)&3'::mquery_txt;
select '1|(2|(4|(5|6)))'::mquery_txt;
select '1|2|4|5|6'::mquery_txt;
select '1&(2&(4&(5&6)))'::mquery_txt;
select '1&2&4&5&6'::mquery_txt;
select '1&(2&(4&(5|6)))'::mquery_txt;
select '1&(2&(4&(5|!6)))'::mquery_txt;
select '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::mquery_txt;
select 'querty-fgries | http://www.google.com/index.html | www.rambler.ru/index.shtml'::mquery_txt;
SELECT '1'::query_txt;
SELECT '1 '::query_txt;
SELECT ' 1'::query_txt;
SELECT ' 1 '::query_txt;
SELECT '\'1 2\''::query_txt;
SELECT '\'1 \\\'2\''::query_txt;
SELECT '!1'::query_txt;
SELECT '1|2'::query_txt;
SELECT '1|!2'::query_txt;
SELECT '!1|2'::query_txt;
SELECT '!1|!2'::query_txt;
SELECT '!(!1|!2)'::query_txt;
SELECT '!(!1|2)'::query_txt;
SELECT '!(1|!2)'::query_txt;
SELECT '!(1|2)'::query_txt;
SELECT '1&2'::query_txt;
SELECT '!1&2'::query_txt;
SELECT '1&!2'::query_txt;
SELECT '!1&!2'::query_txt;
SELECT '(1&2)'::query_txt;
SELECT '1&(2)'::query_txt;
SELECT '!(1)&2'::query_txt;
SELECT '!(1&2)'::query_txt;
SELECT '1|2&3'::query_txt;
SELECT '1|(2&3)'::query_txt;
SELECT '(1|2)&3'::query_txt;
SELECT '1|2&!3'::query_txt;
SELECT '1|!2&3'::query_txt;
SELECT '!1|2&3'::query_txt;
SELECT '!1|(2&3)'::query_txt;
SELECT '!(1|2)&3'::query_txt;
SELECT '(!1|2)&3'::query_txt;
SELECT '1|(2|(4|(5|6)))'::query_txt;
SELECT '1|2|4|5|6'::query_txt;
SELECT '1&(2&(4&(5&6)))'::query_txt;
SELECT '1&2&4&5&6'::query_txt;
SELECT '1&(2&(4&(5|6)))'::query_txt;
SELECT '1&(2&(4&(5|!6)))'::query_txt;
SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::query_txt;
SELECT '1'::mquery_txt;
SELECT '1 '::mquery_txt;
SELECT ' 1'::mquery_txt;
SELECT ' 1 '::mquery_txt;
SELECT '\'1 2\''::mquery_txt;
SELECT '\'1 \\\'2\''::mquery_txt;
SELECT '!1'::mquery_txt;
SELECT '1|2'::mquery_txt;
SELECT '1|!2'::mquery_txt;
SELECT '!1|2'::mquery_txt;
SELECT '!1|!2'::mquery_txt;
SELECT '!(!1|!2)'::mquery_txt;
SELECT '!(!1|2)'::mquery_txt;
SELECT '!(1|!2)'::mquery_txt;
SELECT '!(1|2)'::mquery_txt;
SELECT '1&2'::mquery_txt;
SELECT '!1&2'::mquery_txt;
SELECT '1&!2'::mquery_txt;
SELECT '!1&!2'::mquery_txt;
SELECT '(1&2)'::mquery_txt;
SELECT '1&(2)'::mquery_txt;
SELECT '!(1)&2'::mquery_txt;
SELECT '!(1&2)'::mquery_txt;
SELECT '1|2&3'::mquery_txt;
SELECT '1|(2&3)'::mquery_txt;
SELECT '(1|2)&3'::mquery_txt;
SELECT '1|2&!3'::mquery_txt;
SELECT '1|!2&3'::mquery_txt;
SELECT '!1|2&3'::mquery_txt;
SELECT '!1|(2&3)'::mquery_txt;
SELECT '!(1|2)&3'::mquery_txt;
SELECT '(!1|2)&3'::mquery_txt;
SELECT '1|(2|(4|(5|6)))'::mquery_txt;
SELECT '1|2|4|5|6'::mquery_txt;
SELECT '1&(2&(4&(5&6)))'::mquery_txt;
SELECT '1&2&4&5&6'::mquery_txt;
SELECT '1&(2&(4&(5|6)))'::mquery_txt;
SELECT '1&(2&(4&(5|!6)))'::mquery_txt;
SELECT '1&(\'2\'&(\' 4\'&(\\|5 | \'6 \\\' !|&\')))'::mquery_txt;
SELECT 'querty-fgries | http://www.google.com/index.html | www.rambler.ru/index.shtml'::mquery_txt;
CREATE TABLE test_txtidx( t text, a txtidx );
@ -133,30 +134,31 @@ SELECT count(*) FROM test_txtidx WHERE a ## 'eq|yt';
SELECT count(*) FROM test_txtidx WHERE a ## '(eq&yt)|(wR&qh)';
SELECT count(*) FROM test_txtidx WHERE a ## '(eq|yt)&(wR|qh)';
select txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
SELECT txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
<i <b> wow < jqw <> qwerty');
select txtidxsize(txt2txtidx('345 qw'));
SELECT txtidxsize(txt2txtidx('345 qw'));
select txtidxsize(txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
SELECT txtidxsize(txt2txtidx('345 qwe@efd.r \' http://www.com/ http://aew.werc.ewr/?ad=qwe&dw 1aew.werc.ewr/?ad=qwe&dw 2aew.werc.ewr http://3aew.werc.ewr/?ad=qwe&dw http://4aew.werc.ewr http://5aew.werc.ewr:8100/? ad=qwe&dw 6aew.werc.ewr:8100/?ad=qwe&dw 7aew.werc.ewr:8100/?ad=qwe&dw=%20%32 +4.0e-10 qwe qwe qwqwe 234.435 455 5.005 teodor@stack.net qwe-wer asdf <fr>qwer jf sdjk<we hjwer <werrwe> ewr1> ewri2 <a href="qwe<qwe>">
/usr/local/fff /awdf/dwqe/4325 rewt/ewr wefjn /wqe-324/ewr gist.h gist.h.c gist.c. readline 4.2 4.2. 4.2, readline-4.2 readline-4.2. 234
<i <b> wow < jqw <> qwerty'));
insert into test_txtidx (a) values ('345 qwerty');
INSERT INTO test_txtidx (a) VALUES ('345 qwerty');
create trigger txtidxupdate before update or insert on test_txtidx
for each row execute procedure tsearch(a, t);
CREATE TRIGGER txtidxupdate
BEFORE UPDATE OR INSERT ON test_txtidx
FOR EACH ROW EXECUTE PROCEDURE tsearch(a, t);
insert into test_txtidx (t) values ('345 qwerty');
INSERT INTO test_txtidx (t) VALUES ('345 qwerty');
select count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
SELECT count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
select count(*) FROM test_txtidx WHERE a ## '345&qwerty';
SELECT count(*) FROM test_txtidx WHERE a ## '345&qwerty';
update test_txtidx set t = null where t = '345 qwerty';
UPDATE test_txtidx SET t = null WHERE t = '345 qwerty';
select count(*) FROM test_txtidx WHERE a ## '345&qwerty';
SELECT count(*) FROM test_txtidx WHERE a ## '345&qwerty';
select count(*) FROM test_txtidx WHERE a @@ '345&qwerty';
SELECT count(*) FROM test_txtidx WHERE a @@ '345&qwerty';

View File

@ -1,173 +1,213 @@
BEGIN TRANSACTION;
-- Adjust this setting to control where the objects get created.
SET search_path = public;
SET autocommit TO 'on';
-- TXTIDX type
CREATE FUNCTION txtidx_in(cstring)
RETURNS txtidx
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION txtidx_out(txtidx)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE TYPE txtidx (
internallength = -1,
input = txtidx_in,
output = txtidx_out,
storage = extended
INTERNALLENGTH = -1,
INPUT = txtidx_in,
OUTPUT = txtidx_out,
STORAGE = extended
);
CREATE FUNCTION txt2txtidx(text)
RETURNS txtidx
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION txtidxsize(txtidx)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
--QUERYTYPES
--without morphology
CREATE FUNCTION qtxt_in(cstring)
RETURNS query_txt
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION qtxt_out(query_txt)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE TYPE query_txt (
internallength = -1,
input = qtxt_in,
output = qtxt_out
INTERNALLENGTH = -1,
INPUT = qtxt_in,
OUTPUT = qtxt_out
);
--with morphology
CREATE FUNCTION mqtxt_in(cstring)
RETURNS mquery_txt
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
--same C output function as for query_txt
CREATE FUNCTION mqtxt_out(mquery_txt)
RETURNS cstring
AS 'MODULE_PATHNAME', 'qtxt_out'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE TYPE mquery_txt (
internallength = -1,
input = mqtxt_in,
output = mqtxt_out
INTERNALLENGTH = -1,
INPUT = mqtxt_in,
OUTPUT = mqtxt_out
);
--only for debug
CREATE FUNCTION querytree(query_txt)
RETURNS text
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION querytree(mquery_txt)
RETURNS text
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
--operations
CREATE FUNCTION execqtxt(txtidx, query_txt) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION execqtxt(txtidx, query_txt)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION execqtxt(txtidx, query_txt) IS 'boolean operation with text index';
CREATE FUNCTION execqtxt(txtidx, mquery_txt) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION execqtxt(txtidx, mquery_txt)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION execqtxt(txtidx, mquery_txt) IS 'boolean operation with text index';
CREATE FUNCTION rexecqtxt(query_txt, txtidx) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION rexecqtxt(query_txt, txtidx)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION rexecqtxt(query_txt, txtidx) IS 'boolean operation with text index';
CREATE FUNCTION rexecqtxt(mquery_txt, txtidx) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION rexecqtxt(mquery_txt, txtidx)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
COMMENT ON FUNCTION rexecqtxt(mquery_txt, txtidx) IS 'boolean operation with text index';
CREATE OPERATOR @@ (
LEFTARG = txtidx, RIGHTARG = query_txt, PROCEDURE = execqtxt,
COMMUTATOR = '~@', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = txtidx,
RIGHTARG = query_txt,
PROCEDURE = execqtxt,
COMMUTATOR = '~@',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~@ (
LEFTARG = query_txt, RIGHTARG = txtidx, PROCEDURE = rexecqtxt,
COMMUTATOR = '@@', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = query_txt,
RIGHTARG = txtidx,
PROCEDURE = rexecqtxt,
COMMUTATOR = '@@',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ## (
LEFTARG = txtidx, RIGHTARG = mquery_txt, PROCEDURE = execqtxt,
COMMUTATOR = '~#', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = txtidx,
RIGHTARG = mquery_txt,
PROCEDURE = execqtxt,
COMMUTATOR = '~#',
RESTRICT = contsel,
JOIN = contjoinsel
);
CREATE OPERATOR ~# (
LEFTARG = mquery_txt, RIGHTARG = txtidx, PROCEDURE = rexecqtxt,
COMMUTATOR = '##', RESTRICT = contsel, JOIN = contjoinsel
LEFTARG = mquery_txt,
RIGHTARG = txtidx,
PROCEDURE = rexecqtxt,
COMMUTATOR = '##',
RESTRICT = contsel,
JOIN = contjoinsel
);
--Trigger
create function tsearch() returns trigger as
'MODULE_PATHNAME'
language 'C';
CREATE FUNCTION tsearch()
RETURNS trigger
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
--GiST
--GiST key type
CREATE FUNCTION gtxtidx_in(cstring)
RETURNS gtxtidx
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION gtxtidx_out(gtxtidx)
RETURNS cstring
AS 'MODULE_PATHNAME'
LANGUAGE 'c' with (isstrict);
LANGUAGE 'C' with (isstrict);
CREATE TYPE gtxtidx (
internallength = -1,
input = gtxtidx_in,
output = gtxtidx_out
INTERNALLENGTH = -1,
INPUT = gtxtidx_in,
OUTPUT = gtxtidx_out
);
-- support functions
CREATE FUNCTION gtxtidx_consistent(gtxtidx,internal,int4) RETURNS bool
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gtxtidx_consistent(gtxtidx,internal,int4)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gtxtidx_compress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gtxtidx_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gtxtidx_decompress(internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gtxtidx_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gtxtidx_penalty(internal,internal,internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
CREATE FUNCTION gtxtidx_penalty(internal,internal,internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C' with (isstrict);
CREATE FUNCTION gtxtidx_picksplit(internal, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gtxtidx_picksplit(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gtxtidx_union(bytea, internal) RETURNS _int4
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gtxtidx_union(bytea, internal)
RETURNS _int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
CREATE FUNCTION gtxtidx_same(gtxtidx, gtxtidx, internal) RETURNS internal
AS 'MODULE_PATHNAME' LANGUAGE 'c';
CREATE FUNCTION gtxtidx_same(gtxtidx, gtxtidx, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- create the operator class
CREATE OPERATOR CLASS gist_txtidx_ops
DEFAULT FOR TYPE txtidx USING gist AS
DEFAULT FOR TYPE txtidx USING gist
AS
OPERATOR 1 @@ (txtidx, query_txt) RECHECK ,
OPERATOR 2 ## (txtidx, mquery_txt) RECHECK ,
FUNCTION 1 gtxtidx_consistent (gtxtidx, internal, int4),
@ -178,6 +218,3 @@ CREATE OPERATOR CLASS gist_txtidx_ops
FUNCTION 6 gtxtidx_picksplit (internal, internal),
FUNCTION 7 gtxtidx_same (gtxtidx, gtxtidx, internal),
STORAGE gtxtidx;
END TRANSACTION;

View File

@ -9,68 +9,82 @@
-- select user_lock(group,id,mode);
--
create function user_lock(int4,int4,int4) returns int4
as 'MODULE_PATHNAME'
language 'c';
-- Adjust this setting to control where the objects get created.
SET search_path = public;
-- select user_unlock(group,id,mode);
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION user_lock(int4,int4,int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- SELECT user_unlock(group,id,mode);
--
create function user_unlock(int4,int4,int4) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_unlock(int4,int4,int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_lock(group,id);
-- SELECT user_write_lock(group,id);
--
create function user_write_lock(int4,int4) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_lock(int4,int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_unlock(group,id);
-- SELECT user_write_unlock(group,id);
--
create function user_write_unlock(int4,int4) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_unlock(int4,int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_lock(group,oid);
-- SELECT user_write_lock(group,oid);
--
create function user_write_lock(int4,oid) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_lock(int4,oid)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_unlock(group,oid);
-- SELECT user_write_unlock(group,oid);
--
create function user_write_unlock(int4,oid) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_unlock(int4,oid)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_lock_oid(oid);
-- SELECT user_write_lock_oid(oid);
--
create function user_write_lock_oid(oid) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_lock_oid(oid)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_unlock_oid(oid);
-- SELECT user_write_unlock_oid(oid);
--
create function user_write_unlock_oid(oid) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_unlock_oid(oid)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_lock_oid(int4);
-- SELECT user_write_lock_oid(int4);
--
create function user_write_lock_oid(int4) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_lock_oid(int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_write_unlock_oid(int4);
-- SELECT user_write_unlock_oid(int4);
--
create function user_write_unlock_oid(int4) returns int4
as 'MODULE_PATHNAME'
language 'c';
CREATE OR REPLACE FUNCTION user_write_unlock_oid(int4)
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';
-- select user_unlock_all();
-- SELECT user_unlock_all();
--
create function user_unlock_all() returns int4
as 'MODULE_PATHNAME'
language 'c';
-- end of file
CREATE OR REPLACE FUNCTION user_unlock_all()
RETURNS int4
AS 'MODULE_PATHNAME'
LANGUAGE 'C';

View File

@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/contrib/vacuumlo/vacuumlo.c,v 1.16 2002/10/03 17:20:39 momjian Exp $
* $Header: /cvsroot/pgsql/contrib/vacuumlo/vacuumlo.c,v 1.17 2002/10/18 18:41:21 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -207,6 +207,28 @@ vacuumlo(char *database, struct _param * param)
fprintf(stdout, "Test run: no large objects will be removed!\n");
}
res = PQexec(conn, "SET search_path = public");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "Failed to set search_path on:\n");
fprintf(stderr, "%s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return -1;
}
PQclear(res);
res = PQexec(conn, "SET autocommit TO 'on'");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "Failed to set autocommit on:\n");
fprintf(stderr, "%s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return -1;
}
PQclear(res);
/*
* First we create and populate the LO temp table
*/

View File

@ -1,7 +1,16 @@
--SQL for XML parser
CREATE FUNCTION pgxml_parse(text) RETURNS bool
AS '_OBJWD_/pgxml_dom_DLSUFFIX_' LANGUAGE 'c' WITH (isStrict);
-- Adjust this setting to control where the objects get created.
SET search_path = public;
CREATE FUNCTION pgxml_xpath(text,text,text,text) RETURNS text
AS '_OBJWD_/pgxml_dom_DLSUFFIX_' LANGUAGE 'c' WITH (isStrict);
SET autocommit TO 'on';
CREATE OR REPLACE FUNCTION pgxml_parse(text)
RETURNS bool
AS '_OBJWD_/pgxml_dom_DLSUFFIX_'
LANGUAGE 'c' WITH (isStrict);
CREATE OR REPLACE FUNCTION pgxml_xpath(text,text,text,text)
RETURNS text
AS '_OBJWD_/pgxml_dom_DLSUFFIX_'
LANGUAGE 'c' WITH (isStrict);

View File

@ -5,7 +5,7 @@
# Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
# Portions Copyright (c) 1994, Regents of the University of California
#
# $Header: /cvsroot/pgsql/src/bin/scripts/Makefile,v 1.16 2002/08/27 03:38:27 momjian Exp $
# $Header: /cvsroot/pgsql/src/bin/scripts/Makefile,v 1.17 2002/10/18 18:41:22 momjian Exp $
#
#-------------------------------------------------------------------------
@ -19,9 +19,9 @@ SCRIPTS := createdb dropdb createuser dropuser createlang droplang vacuumdb \
all: $(SCRIPTS)
# we don't need this now, but we may need it some day, bjm 2002-01-03
createlang: createlang.sh
cp $< $@
chmod a+x $@
#createlang: createlang.sh
# cp $< $@
# chmod a+x $@
install: all installdirs
for i in $(filter-out createlang, $(SCRIPTS)); do \