mirror of https://github.com/postgres/postgres
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:
parent
fb9bc342ff
commit
aa4c702eac
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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 = =,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
--
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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" ();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
|
||||
SET autocommit TO 'on';
|
||||
|
||||
CREATE FUNCTION "recordchange" () RETURNS trigger AS
|
||||
'/usr/local/pgsql/lib/pending.so', 'recordchange' LANGUAGE 'C';
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 "
|
||||
|
|
|
@ -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 (\"";
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)';
|
||||
|
||||
|
|
|
@ -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 = ,
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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' ;
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
--
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in New Issue