fqtn text;
cn name;
sql text;
- attr text;
+ attr text; srid integer;
BEGIN
fqtn := '';
IF length($1) > 0 THEN
END IF;
fqtn := fqtn || quote_ident($2);
+ sql := 'SELECT @extschema@.ST_SRID('
+ || quote_ident($3)
+ || ') FROM '
+ || fqtn
+ || ' LIMIT 1;';
+ EXECUTE sql INTO srid;
+
cn := 'enforce_max_extent_' || $3;
- sql := 'SELECT @extschema@.st_ashexewkb( @extschema@.st_envelope( @extschema@.st_union( @extschema@.st_envelope('
+ sql := 'SELECT @extschema@.st_ashexewkb( @extschema@.st_setsrid( @extschema@.st_extent( @extschema@.st_envelope('
|| quote_ident($3)
- || ')))) FROM '
+ || ')), ' || srid || ')) FROM '
|| fqtn;
EXECUTE sql INTO attr;
+ -- NOTE: I put NOT VALID to prevent the costly step of validating the constraint
sql := 'ALTER TABLE ' || fqtn
|| ' ADD CONSTRAINT ' || quote_ident(cn)
|| ' CHECK ( @extschema@.st_envelope('
|| quote_ident($3)
- || ') @ ''' || attr || '''::geometry)';
+ || ') @ ''' || attr || '''::geometry) NOT VALID';
RETURN @extschema@._add_raster_constraint(cn, sql);
END;
$$ LANGUAGE 'plpgsql' VOLATILE STRICT
- COST 100;
+ COST 9000;
CREATE OR REPLACE FUNCTION _drop_raster_constraint_extent(rastschema name, rasttable name, rastcolumn name)
RETURNS boolean AS