Der Parser

Ist die Abfrage erst einmal beim Server angekommen, wird der Parser aktiv. Die Aufgabe des Parsers ist es, das SQL-Statement in eine interne Struktur zu überführen und die syntaktische Prüfung vorzunehmen.

Der über ein Client-Interface angelieferte Query-String wird in postgres.c an den Parser übergeben:

/*
 * (1) parse the request string into a list of raw parse trees.
 */
raw_parsetree_list = pg_parse_query(query_string);

pg_parse_query liefert eine Liste von sogenannten Parse-Trees. Jeder Parse Tree dient zur Verarbeitung eines einzelnen SQL-Statements. Es ist zu beachten, dass PostgreSQL eine Liste von Bäumen erzeugt. Das ist wichtig, um verknüpfte Statements verarbeiten zu können:

SELECT 1+1; SELECT 2+2; SELECT 3+3;

Der Parser übernimmt also das Statement und zerlegt es erst in sogenannte Tokens. Diese Tokens werden dann für die weitere Verarbeitung herangezogen. Parser benötigen eine sogenannte Grammatik, die im Fall von PostgreSQL in src/backend/parser/gram.y zu finden ist. Die Grammatik ist vergleichsweise komplex und umfangreich. Dennoch ist der Code gut lesbar und sollte auch für Anfänger relativ gut verständlich sein.

Sehen wir uns anhand von LOCK TABLE an, in welche Strukturen ein Statement überführt wird. Das folgende Listing zeigt die Syntax von LOCK TABLE:

test=# \h LOCK
Command:     LOCK
Description: lock a table
Syntax:
LOCK [ TABLE ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ]

where lockmode is one of:

    ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
    | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

Die interne Struktur bildet im Prinzip lediglich die Struktur des entsprechenden Kommandos ab und ermöglicht so sinnvolles Arbeiten mit dem Befehl:

/* ----------------------
 *              LOCK Statement
 * ----------------------
 */
typedef struct LockStmt
{
        NodeTag         type;
        List       *relations;          /* relations to lock */
        int                     mode;   /* lock mode */
        bool            nowait;         /* no wait mode */
} LockStmt;

Die meisten Befehle weisen eine wesentlich komplexere Struktur auf als LOCK TABLE - das Prinzip ist aber letztendlich ident.


Cybertec Schönig & Schönig GmbH
PostgreSQL support, training, consulting
www.postgresql-support.de