PostgreSQL構文の強調表示

良いニュースを急いで共有します。PostgreSQLに関する記事の著者とその読者の生活が少し良くなりました。



すべてのhabipisterが知っているように、ソースコードを作成するために、構文を強調する特別な<source>



タグが使用されます。 バックライトが常に完璧であるとは限らないことは周知の事実であり、著者(記事の見た目を気にする人)はアマチュアの活動に従事することを余儀なくされ<font color=...>







強調表示は多かれ少なかれ標準的なSQLを網羅しており、DBMSの詳細を明確に理解していなかったため、PostgreSQLですべてが特に悲しかったです。 時間が経つにつれて 、Alexey boomburumは、バックライトを修正する必要があることが明らかになるまで、 フォントをソースに慎重に修正しました(そして私は戻りました)。 最後に、Daler daleraliyorovは、 Habrが使用するhighlightjsライブラリにPostgreSQLサポートを追加する方法を提案しました。 そして今-完了、ようこそ。



pgsql:SQL、PL / pgSQLおよびall-all-all



したがって、正しい強調表示の秘密は新しいpgsql言語にあります。 メニューで選択するか(「ソースコード」ボタン)、手動で指定できます。 htmlで書く必要があります



<source lang="pgsql">



</source>







マークダウンでは、次のようになります。



```pgsql



```







原則として、highlightjsは言語自体を判別できますが、通常は大きなコードフラグメントに対してのみ機能します。 小さな断片では、自動検出が失敗することがよくあります。 さらに、自動検出には時間がかかるため、言語を明示的に指定すると、色を使用したコードの再生が高速になります。



たとえば、取得するには



 CREATE TABLE aircrafts_data ( aircraft_code character(3) NOT NULL, model jsonb NOT NULL, range integer NOT NULL, CONSTRAINT aircrafts_range_check CHECK ((range > 0)) );
      
      





私たちは書いています



<source lang="pgsql">

CREATE TABLE aircrafts_data (

aircraft_code character(3) NOT NULL,

model jsonb NOT NULL,

range integer NOT NULL,

CONSTRAINT aircrafts_range_check CHECK ((range > 0))

);

</source>







同じpgsql言語もPL / pgSQLコードを色付けします。 たとえば、取得するには



 CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$ BEGIN RETURN QUERY SELECT flightid FROM flight WHERE flightdate >= $1 AND flightdate < ($1 + 1); IF NOT FOUND THEN RAISE EXCEPTION '   : %.', $1; END IF; RETURN; END $$ LANGUAGE plpgsql;
      
      





書きます



<source lang="pgsql">

CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$

...

$$ LANGUAGE plpgsql;

</source>







わずかな微妙な点は、ドルで囲まれた文字列が常にコードとして強調表示され、アポストロフィの文字列が強調表示されないことです。 さまざまなオプションを検討しましたが、これが最も適切と思われました。



フラグメントの言語を自動的に決定するhighlightjsの機能により、他の言語の関数を強調表示できます。 たとえば、すべてがPL / Perlで機能します。



 CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$ my ($x, $y) = @_; if (not defined $x) { return undef if not defined $y; return $y; } return $x if not defined $y; return $x if $x > $y; return $y; $$ LANGUAGE plperl;
      
      





特別なものは必要ありません



<source lang="pgsql">

CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$

...

$$ LANGUAGE plperl;

</source>







もちろん、選択された言語はドルの中に書かれているものだけに依存し、LANGUAGEの後に書かれているものによって決定されることは決してありません。



一般に、バックライトは最近リリースされたPostgreSQLの11番目のバージョンに対応しています。



強調表示機能には多くの疑問がありました。 残念ながら、関数名とテーブル名を区別するためには、本格的な解析が必要ですが、これは構文の強調表示のフレームワークでは解決されません。 標準関数の長いリストを作成して色を付けることができますが、多数の拡張機能の関数についてはどうでしょうか? その結果、私はまったく色を付けないことに決めました-すべて同じで、すべてがキーワードにかかっており、多彩さが減りました。



平文:テキスト、平文



記事では、クエリの結果を発行する必要がある場合があります。 もちろん、そこにキーワードはなく、何も強調表示する必要はありませんが、コードが「コンソール」に見えるようにしたいのです。 このために、特別なプレーンテキスト言語を使用できるようになりました。 たとえば、取得するには



 WITH xmldata(data) AS (VALUES ($$ <example xmlns="http://example.com/myns" xmlns:B="http://example.com/b"> <item foo="1" B:bar="2"/> <item foo="3" B:bar="4"/> <item foo="4" B:bar="5"/> </example>$$::xml) ) SELECT xmltable.* FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x, 'http://example.com/b' AS "B"), '/x:example/x:item' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '@foo', bar int PATH '@B:bar');
      
      





  foo | bar -----+----- 1 | 2 3 | 4 4 | 5 (3 rows)
      
      





書きます



<source lang="pgsql">

WITH xmldata(data) AS (VALUES ($$

...

</source>

<source lang="plaintext">

foo | bar

-----+-----

1 | 2

3 | 4

4 | 5

(3 rows)

</source>







平文は常に明示的に指定する必要があり、自動的には検出されません。



イノベーションを気に入って、あなたの役に立つことを願っています。 コードの強調表示でエラーが見つかった場合(エラーは避けられず、SQLには状況依存構文が多すぎる)、 プロジェクトのgithubでタスクを作成し、さらに良い方法として、ソリューションを提案します。



PS 2月4〜6日にモスクワで開催されるPGConf会議を忘れないでください。 レポートの申請は12月5日まで受け付けています!



All Articles