1e3413c40SMasatake YAMATO.. _ctags-lang-sql(7): 2e3413c40SMasatake YAMATO 3e3413c40SMasatake YAMATO============================================================== 4e3413c40SMasatake YAMATOctags-lang-sql 5e3413c40SMasatake YAMATO============================================================== 6e3413c40SMasatake YAMATO------------------------------------------------------------------- 7e3413c40SMasatake YAMATOThe man page of the SQL parser for Universal Ctags 8e3413c40SMasatake YAMATO------------------------------------------------------------------- 9e3413c40SMasatake YAMATO:Version: @VERSION@ 10e3413c40SMasatake YAMATO:Manual group: Universal Ctags 11e3413c40SMasatake YAMATO:Manual section: 7 12e3413c40SMasatake YAMATO 13e3413c40SMasatake YAMATOSYNOPSIS 14e3413c40SMasatake YAMATO-------- 15e3413c40SMasatake YAMATO| **@CTAGS_NAME_EXECUTABLE@** ... [--extras={guest}] --languages=+SQL ... 16e3413c40SMasatake YAMATO 17e3413c40SMasatake YAMATO 18e3413c40SMasatake YAMATODESCRIPTION 19e3413c40SMasatake YAMATO----------- 20e3413c40SMasatake YAMATOThe SQL parser supports various SQL dialects. PostgreSQL is one of them. 21e3413c40SMasatake YAMATO 22e3413c40SMasatake YAMATOPostgreSQL allows user-defined functions to be written in other 23e3413c40SMasatake YAMATOlanguages (*procedural languages*) besides SQL and C [PL]_. 24e3413c40SMasatake YAMATO 25e3413c40SMasatake YAMATOThe SQL parser makes tags for language objects in the user-defined 26e3413c40SMasatake YAMATOfunctions written in the procedural languages if the ``guest`` extra 27e3413c40SMasatake YAMATOis enabled. 28e3413c40SMasatake YAMATO 29e3413c40SMasatake YAMATOThe SQL parser looks for a token coming after ``LANGUAGE`` keyword in 30e3413c40SMasatake YAMATOthe source code to choose a proper guest parser. 31e3413c40SMasatake YAMATO 32e3413c40SMasatake YAMATO.. code-block:: SQL 33e3413c40SMasatake YAMATO 34e3413c40SMasatake YAMATO ... LANGUAGE plpythonu AS '... user-defined function ' ... 35e3413c40SMasatake YAMATO ... AS $$ user-defined function $$ LANGUAGE plv8 ... 36e3413c40SMasatake YAMATO 37e3413c40SMasatake YAMATOIn the above examples, ``plpythonu`` and ``plv8`` are the names of 38e3413c40SMasatake YAMATOprocedural languages. The SQL parser trims `pl` at the start and `u` 39*6cb2047fSMasatake YAMATOat the end of the name before finding a ctags parser. For 40*6cb2047fSMasatake YAMATO``plpythonu`` and ``plv8``, the SQL parser extracts ``python`` and 41e3413c40SMasatake YAMATO``v8`` as the candidates of guest parsers. 42e3413c40SMasatake YAMATO 43e3413c40SMasatake YAMATOFor ``plpythonu``, ctags can run its Python parser. ctags doesn't 44*6cb2047fSMasatake YAMATOhave a parser named ``v8``. However, the JavaScript parser in ctags has 45e3413c40SMasatake YAMATO``v8`` as an alias. So ctags can run the JavaScript parser as the 46e3413c40SMasatake YAMATOguest parser for ``plv8``. 47e3413c40SMasatake YAMATO 48e3413c40SMasatake YAMATOEXAMPLES 49e3413c40SMasatake YAMATO-------- 50e3413c40SMasatake YAMATOtagging code including a user-defined function in a string literal [GH3006]_: 51e3413c40SMasatake YAMATO 52e3413c40SMasatake YAMATO"input.sql" 53e3413c40SMasatake YAMATO 54e3413c40SMasatake YAMATO.. code-block:: SQL 55e3413c40SMasatake YAMATO 56e3413c40SMasatake YAMATO CREATE OR REPLACE FUNCTION fun1() RETURNS VARCHAR AS ' 57e3413c40SMasatake YAMATO DECLARE 58e3413c40SMasatake YAMATO test1_var1 VARCHAR(64) := $$ABC$$; 59e3413c40SMasatake YAMATO test1_var2 VARCHAR(64) := $xyz$XYZ$xyz$; 60e3413c40SMasatake YAMATO test1_var3 INTEGER := 1; 61e3413c40SMasatake YAMATO BEGIN 62e3413c40SMasatake YAMATO RETURN TO_CHAR(test_var3, ''000'') || test1_var1 || test1_var2; 63e3413c40SMasatake YAMATO END; 64e3413c40SMasatake YAMATO ' LANGUAGE plpgsql; 65e3413c40SMasatake YAMATO 66e3413c40SMasatake YAMATO"output.tags" 67e3413c40SMasatake YAMATOwith "--options=NONE -o - --sort=no --extras=+{guest} input.sql" 68e3413c40SMasatake YAMATO 69e3413c40SMasatake YAMATO.. code-block:: tags 70e3413c40SMasatake YAMATO 71e3413c40SMasatake YAMATO fun1 input.sql /^CREATE OR REPLACE FUNCTION fun1() RETURNS VARCHAR AS '$/;" f 72e3413c40SMasatake YAMATO test1_var1 input.sql /^ test1_var1 VARCHAR(64) := $$ABC$$;$/;" v 73e3413c40SMasatake YAMATO test1_var2 input.sql /^ test1_var2 VARCHAR(64) := $xyz$XYZ$xyz$;$/;" v 74e3413c40SMasatake YAMATO test1_var3 input.sql /^ test1_var3 INTEGER := 1;$/;" v 75e3413c40SMasatake YAMATO 76e3413c40SMasatake YAMATOtagging code including a user-defined function in a dollar quote [GH3006]_: 77e3413c40SMasatake YAMATO 78e3413c40SMasatake YAMATO"input.sql" 79e3413c40SMasatake YAMATO 80e3413c40SMasatake YAMATO.. code-block:: SQL 81e3413c40SMasatake YAMATO 82e3413c40SMasatake YAMATO CREATE OR REPLACE FUNCTION fun2() RETURNS VARCHAR LANGUAGE plpgsql AS $$ 83e3413c40SMasatake YAMATO DECLARE 84e3413c40SMasatake YAMATO test2_var1 VARCHAR(64) := 'ABC2'; 85e3413c40SMasatake YAMATO test2_var2 VARCHAR(64) := 'XYZ2'; 86e3413c40SMasatake YAMATO test2_var3 INTEGER := 2; 87e3413c40SMasatake YAMATO BEGIN 88e3413c40SMasatake YAMATO RETURN TO_CHAR(test2_var3, '000') || test2_var1 || test2_var2; 89e3413c40SMasatake YAMATO END; 90e3413c40SMasatake YAMATO $$; 91e3413c40SMasatake YAMATO 92e3413c40SMasatake YAMATO"output.tags" 93e3413c40SMasatake YAMATOwith "--options=NONE -o - --sort=no --extras=+{guest} input.sql" 94e3413c40SMasatake YAMATO 95e3413c40SMasatake YAMATO.. code-block:: tags 96e3413c40SMasatake YAMATO 97e3413c40SMasatake YAMATO fun2 input.sql /^CREATE OR REPLACE FUNCTION fun2() RETURNS VARCHAR LANGUAGE plpgsql AS $\$$/;" f 98e3413c40SMasatake YAMATO test2_var1 input.sql /^ test2_var1 VARCHAR(64) := 'ABC2';$/;" v 99e3413c40SMasatake YAMATO test2_var2 input.sql /^ test2_var2 VARCHAR(64) := 'XYZ2';$/;" v 100e3413c40SMasatake YAMATO test2_var3 input.sql /^ test2_var3 INTEGER := 2;$/;" v 101e3413c40SMasatake YAMATO 102e3413c40SMasatake YAMATOtagging code including a user-defined written in JavaScript: 103e3413c40SMasatake YAMATO 104e3413c40SMasatake YAMATO.. code-block:: SQL 105e3413c40SMasatake YAMATO 106e3413c40SMasatake YAMATO -- Derived from https://github.com/plv8/plv8/blob/r3.0alpha/sql/plv8.sql 107e3413c40SMasatake YAMATO CREATE FUNCTION test(keys text[], vals text[]) RETURNS text AS 108e3413c40SMasatake YAMATO $$ 109e3413c40SMasatake YAMATO var o = {}; 110e3413c40SMasatake YAMATO for (var i = 0; i < keys.length; i++) 111e3413c40SMasatake YAMATO o[keys[i]] = vals[i]; 112e3413c40SMasatake YAMATO return JSON.stringify(o); 113e3413c40SMasatake YAMATO $$ 114e3413c40SMasatake YAMATO LANGUAGE plv8 IMMUTABLE STRICT; 115e3413c40SMasatake YAMATO 116e3413c40SMasatake YAMATO"output.tags" 117e3413c40SMasatake YAMATOwith "--options=NONE -o - --sort=no --extras=+{guest} input.sql" 118e3413c40SMasatake YAMATO 119e3413c40SMasatake YAMATO.. code-block:: tags 120e3413c40SMasatake YAMATO 121e3413c40SMasatake YAMATO test input.sql /^CREATE FUNCTION test(keys text[], vals text[]) RETURNS text AS$/;" f 122e3413c40SMasatake YAMATO o input.sql /^ var o = {};$/;" v 123e3413c40SMasatake YAMATO 124e3413c40SMasatake YAMATOKNOWN BUGS 125e3413c40SMasatake YAMATO---------- 126e3413c40SMasatake YAMATOEscape sequences (`''`) in a string literal may make a guest parser confused. 127e3413c40SMasatake YAMATO 128e3413c40SMasatake YAMATOSEE ALSO 129e3413c40SMasatake YAMATO-------- 130e3413c40SMasatake YAMATOctags(1), ctags-client-tools(7) 131e3413c40SMasatake YAMATO 132e3413c40SMasatake YAMATOREFERENCES 133e3413c40SMasatake YAMATO---------- 134e3413c40SMasatake YAMATO 135e3413c40SMasatake YAMATO.. [PL] PostgreSQL 9.5.25 Documentation, "Chapter 39. Procedural Languages", https://www.postgresql.org/docs/9.5/xplang.html 136e3413c40SMasatake YAMATO 137e3413c40SMasatake YAMATO.. [GH3006] @bagl's comment submitted to https://github.com/universal-ctags/ctags/issues/3006 138