Hier wird erklärt, wie Sie vorgehen müssen, um eine neue native Funktion hinzuzufügen. Beachten Sie, dass Sie native Funktionen nicht in eine Binärdistribution einfügen können, da ein Eingriff in den Quellcode von MySQL notwendig ist. Sie müssen MySQL also selbst aus einer Quelldistribution kompilieren. Außerdem müssen Sie bei einer Umstellung auf eine andere MySQL-Version (beispielsweise wenn eine neue Version herauskommt) daran denken, die gesamte Prozedur mit der neuen Version zu wiederholen.
Um eine neue native MySQL-Funktion hinzuzufügen, verfahren Sie folgendermaßen:
Sie binden in lex.h
eine neue Zeile
ein, die den Namen der Funktion im Array
sql_functions[]
definiert.
Wenn der Funktionsprototyp einfach ist (nur null, ein, zwei
oder drei Argumente hat), geben Sie in
lex.h
als zweites Argument im Array
sql_functions[]
den Wert
SYM(FUNC_ARG
an (wobei N
)N
die Anzahl der
Argumente ist) und fügen eine Funktion hinzu, die ein
Funktionsobjekt in item_create.cc
erzeugt. Als Beispiele dafür können Sie sich
"ABS"
und
create_funcs_abs()
anschauen.
Ist der Funktionsprototyp komplizierter (wenn beispielsweise
die Funktion eine variable Anzahl Argumente entgegennimmt),
müssen Sie zwei neue Zeilen in
sql_yacc.yy
einfügen: Die eine gibt
ein Präprozessorsymbol an, das yacc
definieren sollte (diese sollte an den Anfang der Datei
eingefügt werden). Dann definieren Sie die
Funktionsparameter und fügen ein „item“ mit
diesen Parametern zu der Parsing-Regel für
simple_expr
Parametern hinzu. Als
Beispiel dafür, wie dies getan wird, können Sie die
diversen Exemplare von ATAN
in
sql_yacc.yy
anschauen.
Deklarieren Sie in item_func.h
eine
Klasse, die aus Item_num_func
oder
Item_str_func
erbt, je nachdem, ob Ihre
Funktion eine Zahl oder einen String zurückgibt.
In item_func.cc
fügen Sie eine der
folgenden Deklarationen ein, je nachdem, ob Sie eine
numerische oder eine String-Funktion definieren:
double Item_func_newname::val() longlong Item_func_newname::val_int() String *Item_func_newname::Str(String *str)
Wenn Sie Ihr Objekt aus einem der Standardelemente erben
(wie etwa Item_num_func
), müssen Sie
wahrscheinlich nur eine dieser Funktionen definieren und es
dann dem Parent-Objekt überlassen, sich um die übrigen
Funktionen zu kümmern. So definiert zum Beispiel die Klasse
Item_str_func
eine
val()
-Funktion, die
atof()
auf dem Rückgabewert von
::str()
ausführt.
Außerdem müssen Sie wahrscheinlich folgende Objektfunktion definieren:
void Item_func_newname::fix_length_and_dec()
Diese Funktion sollte zumindest
max_length
anhand der gegebenen Argumente
berechnen. max_length
gibt an, wie viele
Zeichen die Funktion höchstens zurückgeben kann. Diese
Funktion sollte überdies maybe_null = 0
einstellen, wenn die Hauptfunktion keinen
NULL
-Wert zurückgeben kann. Ob
irgendwelche Funktionsargumente NULL
zurückgeben könnten, prüft die Funktion anhand der
maybe_null
-Variablen dieser Argumente.
Ein typisches Beispiel dafür finden Sie in
Item_func_mod::fix_length_and_dec
.
Alle Funktionen müssen Thread-sicher sein. Mit anderen Worten: Sie dürfen keine globalen oder statischen Variablen in diesen Funktionen benutzen, ohne sie durch Mutex-Objekte zu schützen.
Wenn Sie NULL
aus einer
::val()
-, ::val_int()
-
oder ::str()
-Funktion zurückgeben möchten,
müssen Sie null_value
auf 1 setzen und 0
zurückliefern.
Für ::str()
-Objektfunktionen müssen Sie
sich darüber hinaus Folgendes merken:
Das String *str
-Argument liefert einen
String-Puffer, der genutzt werden kann, um das Ergebnis zu
speichern. (Um mehr über den Typ String
zu erfahren, werfen Sie einen Blick in die Datei
sql_string.h
.)
Die ::str()
-Funktion sollte den String
zurückgeben, der das Resultat speichert, oder
(char*) 0
, wenn das Resultat
NULL
ist.
Alle gegenwärtigen String-Funktionen versuchen, nur dann Speicher zu reservieren, wenn es absolut unumgänglich ist!
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.