تسليط الضوء على بناء جملة PostgreSQL

أسارع إلى مشاركة الأخبار السارة: أصبحت حياة مؤلفي المقالات حول PostgreSQL وقرائهم أفضل قليلاً.

كما يعلم كل habispisters ، لتصميم رمز المصدر ، يتم استخدام علامة <source> خاصة ، والتي تبرز بناء الجملة. ليس سراً أن الإضاءة الخلفية ليست مثالية دائمًا ، ثم يضطر المؤلفون (الذين يهتمون بمظهر مقالاتهم) للمشاركة في عروض الهواة - لتلوين التعليمات البرمجية الخاصة بهم باستخدام <font color=...> .

كان كل شيء حزينًا بشكل خاص مع PostgreSQL ، نظرًا لأن التظليل غطى SQL القياسي بشكل أو بآخر ولم يفهم تمامًا تفاصيل DBMS الخاصة بنا. مع مرور الوقت ، قام أليكسي بوم بوروم بتصحيح الخطوط بعناية إلى المصدر (وعادت) ، حتى أصبح من الواضح أن الإضاءة الخلفية بحاجة إلى الإصلاح . وأخيرًا ، اقترح Daler daleraliyorov مخرجًا : أضف دعم PostgreSQL إلى مكتبة highlightjs التي يستخدمها Habr. والآن - انتهى ، مرحبًا.

pgsql: SQL و PL / pgSQL و All-all-all


لذا ، فإن سر التمييز الصحيح هو في لغة pgsql الجديدة. يمكن تحديده في القائمة (زر "شفرة المصدر") أو تحديده يدويًا. في أتش تي أم أل تحتاج إلى الكتابة

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

بالطبع ، تعتمد اللغة المختارة فقط على ما هو مكتوب داخل الدولارات ، ولا يتم تحديدها بأي شكل من الأشكال بما يتم كتابته بعد اللغة.

بشكل عام ، يتوافق الضوء الخلفي مع الإصدار 11 الذي تم إصداره مؤخرًا من PostgreSQL.

كان هناك الكثير من الشك حول ميزات التمييز. لسوء الحظ ، للتمييز بين اسم وظيفة ، على سبيل المثال ، اسم جدول ، هناك حاجة إلى تحليل كامل ، ولكن لم يتم حل هذا ضمن تمييز بناء الجملة. يمكنك عمل قائمة طويلة من الوظائف القياسية ولونها ، ولكن ماذا عن الوظائف من ملحقات عديدة؟ ونتيجة لذلك ، قررت عدم التلوين على الإطلاق - على الرغم من كل شيء ، كل شيء يعتمد على الكلمات الرئيسية ، ويتم تقليل التنوع.

نص عادي: نص ، نص عادي


في بعض الأحيان ، يُطلب من المقالة إصدار نتائج الاستعلام. بالطبع ، لا توجد كلمات رئيسية هناك ، ولا حاجة إلى تسليط الضوء على أي شيء ، لكني أريد أن يبدو النص "وحدة تحكم" ، تمامًا مثل الشفرة. لهذا ، يمكنك الآن استخدام لغة النص الخاص. على سبيل المثال ، للحصول على

 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) ، وأنشئ مهمة على جيثوب المشروع ، والأفضل من ذلك ، اقترح حلًا.

سكرتير خاص لا تنسى مؤتمر PGConf ، الذي سيعقد في 4-6 فبراير في موسكو. يتم قبول طلبات التقارير حتى 5 ديسمبر!

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


All Articles