Destaque da sintaxe do PostgreSQL

Corro para compartilhar as boas novas: a vida dos autores de artigos sobre o PostgreSQL e de seus leitores se tornou um pouco melhor.

Como todos os habispisters sabem, para projetar o código-fonte, é usada uma tag <source> especial, que destaca a sintaxe. Não é segredo que a luz de fundo nem sempre é perfeita e, em seguida, os autores (que se preocupam com a aparência de seus artigos) são forçados a se envolver em performances amadoras - para colorir seu código com <font color=...> .

Tudo ficou especialmente triste com o PostgreSQL, já que o destaque abrangeu mais ou menos o SQL padrão e categoricamente não entendeu as especificidades do nosso DBMS. Com o passar do tempo, Alexey boomburum cuidadosamente corrigiu minhas fontes para a fonte (e eu retornei), até ficar óbvio que a luz de fundo precisava ser corrigida. Por fim, Daler daleraliyorov sugeriu uma saída: adicione o suporte do PostgreSQL à biblioteca de destacarjs usada pelo Habr. E agora - pronto, seja bem-vindo.

pgsql: SQL, PL / pgSQL e tudo-tudo-tudo


Portanto, o segredo para o realce correto está na nova linguagem pgsql . Pode ser selecionado no menu (botão "código fonte") ou especificado manualmente. Em html você precisa escrever

<source lang="pgsql">

</source>

e em descontos como este:

```pgsql

```

Em princípio, o destacarjs pode determinar o idioma em si, mas normalmente funciona apenas para grandes fragmentos de código; em pedaços pequenos, a detecção automática geralmente falha. Além disso, a detecção automática leva tempo; portanto, se você especificar o idioma explicitamente, o código brilhará mais rapidamente.

Por exemplo, para obter

 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)) ); 

nós estamos escrevendo

<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>

A mesma linguagem pgsql também colore o código PL / pgSQL. Por exemplo, para obter

 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; 

escrever

<source lang="pgsql">
CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$
...
$$ LANGUAGE plpgsql;
</source>

Uma leve sutileza é que as seqüências de caracteres entre dólares sempre são destacadas como código e as seqüências de apóstrofos nunca são destacadas. Eu considerei opções diferentes, mas essa parecia a mais adequada.

A capacidade de destacarjs para detectar automaticamente o idioma de um fragmento permite destacar funções em outros idiomas. Por exemplo, tudo funcionará para 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; 

Você não precisa de nada de especial, basta escrever

<source lang="pgsql">
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
...
$$ LANGUAGE plperl;
</source>

Obviamente, o idioma escolhido depende apenas do que está escrito dentro dos dólares e de forma alguma é determinado pelo que está escrito após o LANGUAGE.

Em geral, a luz de fundo corresponde à 11ª versão lançada recentemente do PostgreSQL.

Havia muita dúvida sobre os recursos de destaque. Infelizmente, para distinguir um nome de função de, por exemplo, um nome de tabela, é necessária uma análise completa, mas isso não é resolvido no realce da sintaxe. Você pode fazer uma longa lista de funções padrão e colori-las, mas e as funções de várias extensões? Como resultado, eu decidi não colorir nada - mesmo assim, tudo depende de palavras-chave e a variação é reduzida.

texto sem formatação: texto, texto sem formatação


Às vezes, no artigo, é necessário formalizar os resultados da consulta. Obviamente, não há palavras-chave, nada precisa ser destacado, mas quero que o texto pareça “console”, assim como o código. Para isso, agora você pode usar a linguagem de texto simples especial. Por exemplo, para obter

 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) 

escrever

<source lang="pgsql">
WITH xmldata(data) AS (VALUES ($$
...
</source>
<source lang="plaintext">
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
</source>

O texto sem formatação deve sempre ser especificado explicitamente; não é detectado automaticamente.

Espero que você goste da inovação e seja útil. Se você encontrar um erro na maneira como o código é destacado (e os erros são inevitáveis, a sintaxe sensível ao contexto é demais para SQL), crie uma tarefa no github do projeto e, melhor ainda, proponha uma solução.

PS Não se esqueça da conferência PGConf , que será realizada de 4 a 6 de fevereiro em Moscou. Os pedidos de relatórios são aceitos até 5 de dezembro!

Source: https://habr.com/ru/post/pt430040/


All Articles