From: Sandro Santilli Date: Tue, 1 Jun 2004 16:16:23 +0000 (+0000) Subject: Placed histogram2d type definition in a common place; X-Git-Tag: pgis_0_9_1~234 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1db62e335db2e6b6538b30b5c554011a549cf230;p=postgis Placed histogram2d type definition in a common place; added find_extent(schema, table, column) and build_histogram2d(histogram, schema, table, column); modified update_geometry_stats() to make use of available f_table_schema and to set statistical fields to NULL for stale records. Thanks to Carl Anderson for the ideas. git-svn-id: http://svn.osgeo.org/postgis/trunk@560 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis.sql.in b/postgis.sql.in index f6d531266..9aec0f379 100644 --- a/postgis.sql.in +++ b/postgis.sql.in @@ -7,7 +7,7 @@ -- Copyright 2001-2003 Refractions Research Inc. -- -- This is free software; you can redistribute and/or modify it under --- the terms of hte GNU General Public Licence. See the COPYING file. +-- the terms of the GNU General Public Licence. See the COPYING file. -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -23,22 +23,24 @@ BEGIN TRANSACTION; (select 'PL/PgSQL is installed.' as message from pg_language where lanname='plpgsql') union (select 'You must install PL/PgSQL before running this SQL file,\nor you will get an error. To install PL/PgSQL run:\n\tcreatelang plpgsql '::text as message) order by message limit 1; ------------------------------------------ --- THESE WERE postgis_sql_VER_start.sql.in ------------------------------------------ - -#if USE_VERSION == 71 - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- HISTOGRAM2D -CREATE FUNCTION histogram2d_in(opaque) - RETURNS opaque +#if USE_VERSION < 73 +# define HISTOGRAM_IN_REP opaque +# define HISTOGRAM_OUT_REP opaque +#else +# define HISTOGRAM_IN_REP histogram2d +# define HISTOGRAM_OUT_REP cstring +#endif + +CREATE FUNCTION histogram2d_in(HISTOGRAM_OUT_REP) + RETURNS HISTOGRAM_IN_REP AS '@MODULE_FILENAME@' LANGUAGE 'C' WITH (isstrict); -CREATE FUNCTION histogram2d_out(opaque) - RETURNS opaque +CREATE FUNCTION histogram2d_out(HISTOGRAM_IN_REP) + RETURNS HISTOGRAM_OUT_REP AS '@MODULE_FILENAME@' LANGUAGE 'C' WITH (isstrict); @@ -50,6 +52,14 @@ CREATE TYPE histogram2d ( storage = main ); + +----------------------------------------- +-- THESE WERE postgis_sql_VER_start.sql.in +----------------------------------------- + + +#if USE_VERSION == 71 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- BOX3D @@ -163,27 +173,6 @@ CREATE FUNCTION postgis_gist_sel(oid, oid, int2, opaque, int4) #elif USE_VERSION == 72 --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- HISTOGRAM2D - -CREATE FUNCTION histogram2d_in(opaque) - RETURNS opaque - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE FUNCTION histogram2d_out(opaque) - RETURNS opaque - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE TYPE histogram2d ( - alignment = double, - internallength = variable, - input = histogram2d_in, - output = histogram2d_out, - storage = main -); - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- BOX3D @@ -297,27 +286,6 @@ CREATE FUNCTION postgis_gist_sel(opaque, oid, opaque, int4) #elif USE_VERSION == 73 --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- HISTOGRAM2D - -CREATE FUNCTION histogram2d_in(cstring) - RETURNS histogram2d - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE FUNCTION histogram2d_out(histogram2d) - RETURNS cstring - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE TYPE histogram2d ( - alignment = double, - internallength = variable, - input = histogram2d_in, - output = histogram2d_out, - storage = main -); - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- BOX3D @@ -431,27 +399,6 @@ CREATE FUNCTION postgis_gist_sel (internal, oid, internal, int4) #elif USE_VERSION == 74 --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- HISTOGRAM2D - -CREATE FUNCTION histogram2d_in(cstring) - RETURNS histogram2d - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE FUNCTION histogram2d_out(histogram2d) - RETURNS cstring - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE TYPE histogram2d ( - alignment = double, - internallength = variable, - input = histogram2d_in, - output = histogram2d_out, - storage = main -); - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- BOX3D @@ -565,27 +512,6 @@ CREATE FUNCTION postgis_gist_sel (internal, oid, internal, int4) #elif USE_VERSION == 75 --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- HISTOGRAM2D - -CREATE FUNCTION histogram2d_in(cstring) - RETURNS histogram2d - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE FUNCTION histogram2d_out(histogram2d) - RETURNS cstring - AS '@MODULE_FILENAME@' - LANGUAGE 'C' WITH (isstrict); - -CREATE TYPE histogram2d ( - alignment = double, - internallength = variable, - input = histogram2d_in, - output = histogram2d_out, - storage = main -); - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- BOX3D @@ -855,8 +781,27 @@ END; ' LANGUAGE 'plpgsql' ; +----------------------------------------------------------------------- +-- FIND_EXTENT( , , ) --- - - - - - - - - - - - - - - - - - - - - - - - - - - - +CREATE FUNCTION find_extent(text,text,text) RETURNS box3d AS +' +DECLARE + schemaname alias for $1; + tablename alias for $2; + columnname alias for $3; + okay boolean; + myrec RECORD; + +BEGIN + FOR myrec IN EXECUTE ''SELECT extent("''||columnname||''") FROM "''||schemaname||''"."''||tablename||''"'' LOOP + return myrec.extent; + END LOOP; +END; +' +LANGUAGE 'plpgsql' WITH (isstrict); + +----------------------------------------------------------------------- -- FIND_EXTENT(
, ) CREATE FUNCTION find_extent(text,text) RETURNS box3d AS @@ -2121,75 +2066,6 @@ INSERT INTO pg_amproc (amid, amopclaid, amproc, amprocnum) #elif USE_VERSION == 72 --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS() - -CREATE FUNCTION update_geometry_stats() RETURNS text -AS -' -BEGIN - EXECUTE ''update geometry_columns set attrelid = (select pg_class.oid AS attrelid from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_GEOMETRY_column::name), varattnum = (select pg_attribute.attnum from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_GEOMETRY_column::name)''; - execute ''update geometry_columns set stats = (build_histogram2d( create_histogram2d(find_extent(f_table_name,f_GEOMETRY_column),40 ),f_table_name::text, f_GEOMETRY_column::text)) ''; - return ''done''; -END; -' -LANGUAGE 'plpgsql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS(
, ) - -CREATE FUNCTION update_geometry_stats(varchar,varchar) RETURNS text -AS -' -DECLARE - tablename aliAS for $1; - columnname aliAS for $2; - -BEGIN - EXECUTE ''update geometry_columns set attrelid = (select pg_class.oid AS attrelid from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_GEOMETRY_column::name), varattnum = (select pg_attribute.attnum from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_GEOMETRY_column::name)''; - execute ''update geometry_columns set stats = (build_histogram2d( create_histogram2d(find_extent(''|| quote_literal(tablename) || '',''||quote_literal(columnname) ||''),40 ),''|| quote_literal(tablename) || ''::text,''||quote_literal(columnname) ||''::text )) WHERE f_table_name=''|| quote_literal(tablename) || ''and f_GEOMETRY_column=''||quote_literal(columnname) ; - return ''done''; -END; -' -LANGUAGE 'plpgsql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- CREATE_HISTOGRAM2D( , ) --- --- Returns a histgram with 0s in all the boxes. - -CREATE FUNCTION create_histogram2d(box3d,int) - RETURNS histogram2d - AS '@MODULE_FILENAME@','create_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- BUILD_HISTOGRAM2D( , , ) --- - -CREATE FUNCTION build_histogram2d (HISTOGRAM2D,text,text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','build_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- EXPLODE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION explode_histogram2d (HISTOGRAM2D,text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','explode_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ESTIMATE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION estimate_histogram2d(HISTOGRAM2D,box) - RETURNS float8 - AS '@MODULE_FILENAME@','estimate_histogram2d' - LANGUAGE 'C' with (isstrict); - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - -- POSTGISCOSTESTIMATE() -- @@ -2425,76 +2301,6 @@ CREATE CAST ( wkb AS bytea ) WITH FUNCTION bytea(wkb) AS IMPLICIT; CREATE CAST ( box3d AS box ) WITH FUNCTION box3dtobox(box3d); CREATE CAST ( geometry AS text ) WITH FUNCTION astext(geometry); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS() - -CREATE FUNCTION update_geometry_stats() -RETURNS text -AS -' -BEGIN - EXECUTE ''update geometry_columns set attrelid = (select pg_class.oid AS attrelid from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name), varattnum = (select pg_attribute.attnum from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name)''; - execute ''update geometry_columns set stats = (build_histogram2d( create_histogram2d(find_extent(f_table_name,f_geometry_column),40 ),f_table_name::text, f_geometry_column::text)) ''; - return ''done''; -END; -' -LANGUAGE 'plpgsql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS(
, ) - -CREATE FUNCTION update_geometry_stats(varchar,varchar) -RETURNS text -AS -' -DECLARE - tablename aliAS for $1; - columnname aliAS for $2; - -BEGIN - EXECUTE ''update geometry_columns set attrelid = (select pg_class.oid AS attrelid from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name), varattnum = (select pg_attribute.attnum from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name)''; - execute ''update geometry_columns set stats = (build_histogram2d( create_histogram2d(find_extent(''|| quote_literal(tablename) || '',''||quote_literal(columnname) ||''),40 ),''|| quote_literal(tablename) || ''::text,''||quote_literal(columnname) ||''::text )) WHERE f_table_name=''|| quote_literal(tablename) || ''and f_geometry_column=''||quote_literal(columnname) ; - return ''done''; -END; -' -LANGUAGE 'plpgsql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- CREATE_HISTOGRAM2D( , ) --- --- Returns a histgram with 0s in all the boxes. - -CREATE FUNCTION create_histogram2d(box3d,int) - RETURNS histogram2d - AS '@MODULE_FILENAME@','create_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- BUILD_HISTOGRAM2D( , , ) --- - -CREATE FUNCTION build_histogram2d (histogram2d, text, text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','build_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- EXPLODE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION explode_histogram2d (histogram2d, text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','explode_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ESTIMATE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION estimate_histogram2d(histogram2d,box) - RETURNS float8 - AS '@MODULE_FILENAME@','estimate_histogram2d' - LANGUAGE 'C' with (isstrict); CREATE FUNCTION postgisgistcostestimate(internal,internal,internal,internal,internal,internal,internal,internal) RETURNS opaque @@ -2616,77 +2422,6 @@ CREATE CAST ( wkb AS bytea ) WITH FUNCTION bytea(wkb) AS IMPLICIT; CREATE CAST ( box3d AS box ) WITH FUNCTION box3dtobox(box3d); CREATE CAST ( geometry AS text ) WITH FUNCTION astext(geometry); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS() - -CREATE FUNCTION update_geometry_stats() -RETURNS text -AS -' -BEGIN - EXECUTE ''update geometry_columns set attrelid = (select pg_class.oid AS attrelid from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name), varattnum = (select pg_attribute.attnum from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name)''; - execute ''update geometry_columns set stats = (build_histogram2d( create_histogram2d(find_extent(f_table_name,f_geometry_column),40 ),f_table_name::text, f_geometry_column::text)) ''; - return ''done''; -END; -' -LANGUAGE 'plpgsql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS(
, ) - -CREATE FUNCTION update_geometry_stats(varchar,varchar) -RETURNS text -AS -' -DECLARE - tablename aliAS for $1; - columnname aliAS for $2; - -BEGIN - EXECUTE ''update geometry_columns set attrelid = (select pg_class.oid AS attrelid from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name), varattnum = (select pg_attribute.attnum from pg_class,pg_attribute where relname =geometry_columns.f_table_name::name and pg_attribute.attrelid = pg_class.oid and pg_attribute.attname = geometry_columns.f_geometry_column::name)''; - execute ''update geometry_columns set stats = (build_histogram2d( create_histogram2d(find_extent(''|| quote_literal(tablename) || '',''||quote_literal(columnname) ||''),40 ),''|| quote_literal(tablename) || ''::text,''||quote_literal(columnname) ||''::text )) WHERE f_table_name=''|| quote_literal(tablename) || ''and f_geometry_column=''||quote_literal(columnname) ; - return ''done''; -END; -' -LANGUAGE 'plpgsql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- CREATE_HISTOGRAM2D( , ) --- --- Returns a histgram with 0s in all the boxes. - -CREATE FUNCTION create_histogram2d(box3d,int) - RETURNS histogram2d - AS '@MODULE_FILENAME@','create_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- BUILD_HISTOGRAM2D( , , ) --- - -CREATE FUNCTION build_histogram2d (histogram2d, text, text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','build_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- EXPLODE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION explode_histogram2d (histogram2d, text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','explode_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ESTIMATE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION estimate_histogram2d(histogram2d,box) - RETURNS float8 - AS '@MODULE_FILENAME@','estimate_histogram2d' - LANGUAGE 'C' with (isstrict); - CREATE FUNCTION postgisgistcostestimate(internal,internal,internal,internal,internal,internal,internal,internal) RETURNS opaque AS '@MODULE_FILENAME@','postgisgistcostestimate' @@ -2817,67 +2552,6 @@ CREATE CAST ( wkb AS bytea ) WITH FUNCTION bytea(wkb) AS IMPLICIT; CREATE CAST ( box3d AS box ) WITH FUNCTION box3dtobox(box3d); CREATE CAST ( geometry AS text ) WITH FUNCTION astext(geometry); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- UPDATE_GEOMETRY_STATS() --- --- This is no more needed, running ANALYZE will store --- geometry attributes statistics in system tables. --- It is kept for back compatibility, will raise a message. --- - -CREATE FUNCTION update_geometry_stats() -RETURNS text -AS -' - SELECT ''update_geometry_stats() has been obsoleted. Statistics are automatically built running the ANALYZE command''::text -' -LANGUAGE 'sql' ; - -CREATE FUNCTION update_geometry_stats(varchar,varchar) -RETURNS text -AS -' - SELECT update_geometry_stats(); -' -LANGUAGE 'sql' ; - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- CREATE_HISTOGRAM2D( , ) --- --- Returns a histgram with 0s in all the boxes. - -CREATE FUNCTION create_histogram2d(box3d,int) - RETURNS histogram2d - AS '@MODULE_FILENAME@','create_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- BUILD_HISTOGRAM2D( , , ) --- - -CREATE FUNCTION build_histogram2d (histogram2d, text, text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','build_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- EXPLODE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION explode_histogram2d (histogram2d, text) - RETURNS histogram2d - AS '@MODULE_FILENAME@','explode_histogram2d' - LANGUAGE 'C' with (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ESTIMATE_HISTOGRAM2D( , ) --- - -CREATE FUNCTION estimate_histogram2d(histogram2d,box) - RETURNS float8 - AS '@MODULE_FILENAME@','estimate_histogram2d' - LANGUAGE 'C' with (isstrict); - -- -- 7.2 GiST support functions -- @@ -3278,6 +2952,165 @@ BEGIN END; ' LANGUAGE 'plpgsql' WITH (isstrict); + +----------------------------------------------------------------------- +-- UPDATE_GEOMETRY_STATS() +----------------------------------------------------------------------- +-- +-- Only meaningful for PG<75. +-- Gather statisticts about geometry columns for use +-- with cost estimator. +-- +-- It is defined also for PG>=75 for back-compatibility +-- +----------------------------------------------------------------------- +#if USE_VERSION >= 75 +CREATE FUNCTION update_geometry_stats() RETURNS text +AS ' SELECT ''update_geometry_stats() has been obsoleted. Statistics are automatically built running the ANALYZE command''::text' LANGUAGE 'sql'; +#else // USE_VERSION < 75 +CREATE FUNCTION update_geometry_stats() RETURNS text +AS +' + +BEGIN + + UPDATE geometry_columns SET + attrelid = NULL, + varattnum = NULL, + stats = NULL; + + UPDATE geometry_columns SET + attrelid = c.oid, + varattnum = a.attnum, +#if USE_VERSION >= 73 + stats = (build_histogram2d(create_histogram2d( + find_extent(f_table_schema, f_table_name, f_geometry_column), 40), f_table_schema, f_table_name, f_geometry_column)) + FROM pg_class c, pg_attribute a, pg_namespace n + WHERE n.nspname = f_table_schema::name + AND c.relname = f_table_name::name + AND a.attname = f_geometry_column::name + AND c.relnamespace = n.oid + AND a.attrelid = c.oid; +#else // USE_VERSION < 73 + stats = (build_histogram2d(create_histogram2d( + find_extent(f_table_name, f_geometry_column), + 40), f_table_name, f_geometry_column)) + FROM pg_class c, pg_attribute a + WHERE c.relname = f_table_name::name + AND a.attname = f_geometry_column::name + AND c.relnamespace = n.oid + AND a.attrelid = c.oid; +#endif + + return ''done''; +END; +' +LANGUAGE 'plpgsql' ; +#endif // USE_VERSION < 75 + +----------------------------------------------------------------------- +-- UPDATE_GEOMETRY_STATS(
, ) +----------------------------------------------------------------------- +-- +-- Only meaningful for PG<75. +-- Gather statisticts about a geometry column for use +-- with cost estimator. +-- +-- It is defined also for PG>=75 for back-compatibility +-- +----------------------------------------------------------------------- +#if USE_VERSION >= 75 +CREATE FUNCTION update_geometry_stats(varchar,varchar) RETURNS text +AS 'SELECT update_geometry_stats();' LANGUAGE 'sql' ; +#else +CREATE FUNCTION update_geometry_stats(varchar,varchar) RETURNS text +AS +' +DECLARE + tablename aliAS for $1; + columnname aliAS for $2; + +BEGIN + + EXECUTE ''UPDATE geometry_columns set + attrelid = ( + SELECT pg_class.oid AS attrelid + FROM pg_class, pg_attribute + WHERE relname = geometry_columns.f_table_name::name + AND pg_attribute.attrelid = pg_class.oid + AND pg_attribute.attname = geometry_columns.f_GEOMETRY_column::name), + varattnum = ( + SELECT pg_attribute.attnum + FROM pg_class,pg_attribute + WHERE relname = geometry_columns.f_table_name::name + AND pg_attribute.attrelid = pg_class.oid + AND pg_attribute.attname = geometry_columns.f_GEOMETRY_column::name), + stats = (build_histogram2d(create_histogram2d( + find_extent(''|| quote_literal(tablename) || + '',''||quote_literal(columnname) ||''),40 + ),''|| quote_literal(tablename) || ''::text, + ''||quote_literal(columnname) ||''::text )) + + WHERE f_table_name=''|| quote_literal(tablename) || '' + AND f_GEOMETRY_column=''||quote_literal(columnname) ; ''; + + return ''done''; +END; +' +LANGUAGE 'plpgsql' ; +#endif // USE_VERSION < 75 + +----------------------------------------------------------------------- +-- CREATE_HISTOGRAM2D( , ) +----------------------------------------------------------------------- +-- +-- Returns a histgram with 0s in all the boxes. +-- +----------------------------------------------------------------------- +CREATE FUNCTION create_histogram2d(box3d,int) + RETURNS histogram2d + AS '@MODULE_FILENAME@','create_histogram2d' + LANGUAGE 'C' with (isstrict); + +----------------------------------------------------------------------- +-- BUILD_HISTOGRAM2D( , , ) +----------------------------------------------------------------------- +CREATE FUNCTION build_histogram2d (histogram2d,text,text) + RETURNS histogram2d + AS '@MODULE_FILENAME@','build_histogram2d' + LANGUAGE 'C' with (isstrict); + +#if USE_VERSION >= 73 +----------------------------------------------------------------------- +-- BUILD_HISTOGRAM2D(,,,) +----------------------------------------------------------------------- +-- This is a wrapper to the omonimous schema unaware function, +-- thanks to Carl Anderson for the idea. +----------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION build_histogram2d (histogram2d,text,text,text) +RETURNS histogram2d +AS ' +BEGIN + EXECUTE ''SET search_path = ''||$2||'',public''; + RETURN public.build_histogram2d($1,$3,$4); +END +' LANGUAGE 'plpgsql' with (isstrict); +#endif // USE_VERSION >= 73 + +----------------------------------------------------------------------- +-- EXPLODE_HISTOGRAM2D( , ) +----------------------------------------------------------------------- +CREATE FUNCTION explode_histogram2d (HISTOGRAM2D,text) + RETURNS histogram2d + AS '@MODULE_FILENAME@','explode_histogram2d' + LANGUAGE 'C' with (isstrict); + ----------------------------------------------------------------------- +-- ESTIMATE_HISTOGRAM2D( , ) +----------------------------------------------------------------------- +CREATE FUNCTION estimate_histogram2d(HISTOGRAM2D,box) + RETURNS float8 + AS '@MODULE_FILENAME@','estimate_histogram2d' + LANGUAGE 'C' with (isstrict); END TRANSACTION;