cubicweb/schemas/_regproc.postgres.sql
author Philippe Pepiot <philippe.pepiot@logilab.fr>
Wed, 11 Sep 2019 11:56:43 +0200
branch3.26
changeset 12726 1a2c7d6397ec
parent 11057 0b59724cb3f2
permissions -rw-r--r--
Avoid to update inlined relation column to NULL when deleting entities When deleting entities, cubicweb run a rql DELETE on all relations to trigger hooks. For an inlined relation this also mean set the column to NULL. This operation may fail if there's additional constraints on the column. Also this is a weird and useless behavior since deleting the entity row will by definition delete the relation. We still doesn't handle the case where both subject and object are going to be deleted because rows need to be deleted in a particular order that cubicweb doesn't handle. Add a test checking UPDATE does not occur but hooks are correctly called. Closes #17236690

/* -*- sql -*-

   postgres specific registered procedures,
   require the plpgsql language installed

*/

DROP FUNCTION IF EXISTS comma_join (anyarray) CASCADE;
CREATE FUNCTION comma_join (anyarray) RETURNS text AS $$
    SELECT array_to_string($1, ', ')
$$ LANGUAGE SQL;;


DROP FUNCTION IF EXISTS cw_array_append_unique (anyarray, anyelement) CASCADE;
CREATE FUNCTION cw_array_append_unique (anyarray, anyelement) RETURNS anyarray AS $$
    SELECT array_append($1, (SELECT $2 WHERE $2 <> ALL($1)))
$$ LANGUAGE SQL;;

DROP AGGREGATE IF EXISTS group_concat (anyelement) CASCADE;
CREATE AGGREGATE group_concat (
  basetype = anyelement,
  sfunc = cw_array_append_unique,
  stype = anyarray,
  finalfunc = comma_join,
  initcond = '{}'
);;


DROP FUNCTION IF EXISTS limit_size (fulltext text, format text, maxsize integer);
CREATE FUNCTION limit_size (fulltext text, format text, maxsize integer) RETURNS text AS $$
DECLARE
    plaintext text;
BEGIN
    IF char_length(fulltext) < maxsize THEN
       RETURN fulltext;
    END IF;
    IF format = 'text/html' OR format = 'text/xhtml' OR format = 'text/xml' THEN
       plaintext := regexp_replace(fulltext, '<[a-zA-Z/][^>]*>', '', 'g');
    ELSE
       plaintext := fulltext;
    END IF;
    IF char_length(plaintext) < maxsize THEN
       RETURN plaintext;
    ELSE
       RETURN substring(plaintext from 1 for maxsize) || '...';
    END IF;
END
$$ LANGUAGE plpgsql;;

DROP FUNCTION IF EXISTS text_limit_size (fulltext text, maxsize integer);
CREATE FUNCTION text_limit_size (fulltext text, maxsize integer) RETURNS text AS $$
BEGIN
    RETURN limit_size(fulltext, 'text/plain', maxsize);
END
$$ LANGUAGE plpgsql;;