xref: /Universal-ctags/man/ctags-lang-sql.7.rst.in (revision 49ac2085b4ee182d46990ef9a258c45aedb59788)
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