Fehler beim Erstellen eines Operators

Hi zusammen,

ich habe bei der Umstellung einer Applikation von einer anderen Datenbank auf die PostgreSQL folgendes Problem:

während die alten Datenbank für
‘ABC’ || NULL || ‘DEF’
das Ergebnis ‘ABCDEF’ lieferte

liefert die PostrgreSQL ja bekanntlich NULL, sobald einer der beteiligten String = NULL ist.
mir ist auch klar, dass ich das mit Coalesce(…) oder Case in den Griff bekommen kann, ich dachte mir aber ich könnte mir doch einfach einen Operator definieren, der mir das Verhalten der alten Datenbank nachbildet.
Folgender Plan: || soll durch |+ ersetzt werden, wenn als Ergebnis ein Varchar(254) herauskommen soll und |* soll das ganze als Text ohne Längenbegrenzung zurückgeben.
Dafür habe ich mir folgende Funktionen definiert:


CREATE OR REPLACE FUNCTION public.nv(text)
  RETURNS character varying AS
$BODY$
  Select Coalesce($1,'');
$BODY$
  LANGUAGE sql IMMUTABLE
  COST 100;

CREATE OR REPLACE FUNCTION public.base_ConcatNull(text, text)
  RETURNS character varying AS
$BODY$
  Select cast(NV($1) || NV($2) as varchar(254));
$BODY$
  LANGUAGE sql IMMUTABLE
  COST 100;

CREATE OR REPLACE FUNCTION public.base_ConcatNullLong(text, text)
  RETURNS Text AS
$BODY$
  Select NV($1) || NV($2);
$BODY$
  LANGUAGE sql IMMUTABLE
  COST 100;

Die erste Funktion ist nur als Abkürzung für Coalesce(…, ‘’ ) gedacht, damit das ganze übersichtlicher wird und dann die beiden ConcatFunktionen

Als nächstes kamen dann die Operatoren dran

CREATE OPERATOR public.|+ (
    leftarg = text,
    rightarg = text,
    procedure = base_ConcatNull,
    commutator = |+ );

CREATE OPERATOR public.|* (
    leftarg = text,
    rightarg = text,
    procedure = base_ConcatNullLong,
    commutator = |* );

getestet, läuft auf einer leeren Testdatenbank wunderbar
BSP: Select ‘ABC’ |+ NULL |+ ‘DEF’ ==> ‘ABCDEF’

Dann habe ich das gleiche Script auf meiner Entwicklungsdatenbank laufen lassen
und dort bekomme ich nur den Fehler

FEHLER: Operator ist nur eine Hülle: text |+ text
LINE 1: select ‘ABC’ |+ NULL |+ ‘DEF’

In Englisch lautet der Fehler “operator is only a shell”, hilft mir aber auch nicht weiter

Ich habe alles noch mal gedropt, wieder laufen lassen, keine Änderung. Auch in Netz finde ich zu dem Fehler recht wenig, bzw hier ist nur von einem Negator die Rede, aber was soll die Negation einer Concatenierung sein ?

Wenn mir da jemand helfen könnte ware das prima, denn ich komme hier einfach nicht weiter und es würde mir viel Arbeit ersparen, wenn ich die Änderung so machen könnte, wie hier gezeigt

Vielen Dank für die Mühe

JSpatz

Hallo,

na? hat keiner irgendwelche Erfahrungen mit Operatoren ? Schade

Nun, ich dachte, Du hättest Extending PostgreSQL - A better CONCAT operator | ROPARDO s.r.l. inzwischen schon selber gefunden.


Andreas

Hallo,

nein, hatte ich leider nicht gefunden, wobei das ja (mal abgesehen von den Namen) die gleiche Methode ist, wie ich es auch gemacht habe. Mich aber interessieren, welshalb das in der einen Datenbank geht und in der anderen nicht, bzw. was der angesprochene Fehler bedeutet.
Trotzdem Danke für den Hinweis.

JSpatz

Keine Ahnung, sorry. ich habe Dein Code aus dem ersten Posting mal geguttenbergt, geht problemlos.

Andreas