تحليل الاسم

ينطبق على:وضع علامة Databricks SQL وضع علامة Databricks Runtime

تحليل الاسم هو العملية التي يتم من خلالها حل المعرفات إلى أعمدة أو حقول أو معلمات أو مراجع جدول محددة.

عمود وحقل ومعلمة ودقة متغير

يمكن أن تكون المعرفات في التعبيرات مراجع إلى أي مما يلي:

  • اسم العمود استنادا إلى طريقة عرض أو جدول أو تعبير جدول شائع (CTE) أو column_alias.
  • اسم الحقل أو مفتاح الخريطة داخل بنية أو خريطة. لا يمكن أبدا أن تكون الحقول والمفاتيح غير مؤهلة.
  • اسم معلمة الدالة المعرفة من قبل مستخدم SQL.
  • اسم المتغير.
  • دالة خاصة مثل current_user أو current_date التي لا تتطلب استخدام ().
  • DEFAULT الكلمة الأساسية المستخدمة في سياق INSERTأو UPDATEMERGEأو أو SET VARIABLE لتعيين قيمة عمود أو متغير إلى القيمة الافتراضية الخاصة بها.

يطبق تحليل الاسم المبادئ التالية:

  • يفوز أقرب مرجع مطابق، و
  • تفوز الأعمدة والمعلمة على الحقول والمفاتيح.

بالتفصيل، يتبع حل المعرفات لمرجع معين هذه القواعد بالترتيب:

  1. المراجع المحلية

    1. مرجع العمود

      تطابق المعرف، الذي قد يكون مؤهلا، مع اسم عمود في مرجع جدول ل FROM clause.

      إذا كان هناك أكثر من تطابق واحد، فرفع خطأ AMBIGUOUS_COLUMN_OR_FIELD .

    2. مرجع دالة بلا معلمات

      إذا كان المعرف غير مؤهل ويطابق current_userأو current_dateأو current_timestamp: حله كأحد هذه الدالات.

    3. مواصفات العمود الافتراضي

      إذا كان المعرف غير مؤهل، يطابق default التعبير بأكمله في سياق UPDATE SET، INSERT VALUESأو ، أو MERGE WHEN [NOT] MATCHED: حل كقيمة المعنية DEFAULT للجدول الهدف من INSERT، UPDATE أو MERGE.

    4. مرجع مفتاح الخريطة أو حقل البنية

      إذا كان المعرف مؤهلا، فسعى لمطابقته مع حقل أو مفتاح خريطة وفقا للخطوات التالية:

      أ. أزل المعرف الأخير واعامله كحقل أو مفتاح. ب. مطابقة الباقي مع عمود في مرجع الجدول ل FROM clause.

      إذا كان هناك أكثر من تطابق واحد، فرفع خطأ AMBIGUOUS_COLUMN_OR_FIELD .

      إذا كان هناك تطابق والعمود هو:

      • STRUCT: تطابق الحقل.

        إذا تعذرت مطابقة الحقل، فرفع خطأ FIELD_NOT_FOUND .

        إذا كان هناك أكثر من حقل واحد، فرفع خطأ AMBIGUOUS_COLUMN_OR_FIELD .

      • MAP: رفع خطأ إذا كان المفتاح مؤهلا.

        قد يحدث خطأ وقت التشغيل إذا لم يكن المفتاح موجودا بالفعل في الخريطة.

      • أي نوع آخر: رفع خطأ. ج. كرر الخطوة السابقة لإزالة المعرف اللاحق كحقل. تطبيق القواعد (A) و(B) أثناء وجود معرف متبقي لتفسيره على أنه عمود.

  2. الاسم المستعار للعمود الجانبي

    ينطبق على:وضع علامة Databricks SQL وضع علامة Databricks Runtime 12.2 LTS وما فوق

    إذا كان التعبير داخل قائمةSELECT، فطابق المعرف البادئة مع اسم مستعار لعمود سابق في تلك SELECT القائمة.

    إذا كان هناك أكثر من تطابق واحد، فرفع خطأ AMBIGUOUS_LATERAL_COLUMN_ALIAS .

    قم بمطابقة كل معرف متبقي ك حقل أو مفتاح خريطة، وقم برفع FIELD_NOT_FOUND أو خطأ AMBIGUOUS_COLUMN_OR_FIELD إذا تعذرت مطابقته.

  3. الارتباط

    • الجانبي

      إذا كان الاستعلام مسبوقا بكلمة LATERAL أساسية، فطبق القواعد 1.a و1.d مع الأخذ في الاعتبار مراجع الجدول في FROM الذي يحتوي على الاستعلام ويسبق LATERAL.

    • عادي

      إذا كان الاستعلام عبارة عن استعلام فرعي عددي، INأو EXISTS استعلام فرعي، فطبق القواعد 1.a و1.d و2 مع مراعاة مراجع الجدول في عبارة الاستعلام FROM المضمنة.

  4. الارتباط المتداخل

    إعادة تطبيق القاعدة 3 بالتكرار عبر مستويات التداخل للاستعلام.

  5. المعلمات الروتينية

    إذا كان التعبير جزءا من عبارة CREATE FUNCTION :

    1. مطابقة المعرف مع اسم معلمة. إذا كان المعرف مؤهلا، يجب أن يتطابق المؤهل مع اسم الدالة.
    2. إذا كان المعرف مؤهلا، فتطابق مع حقل أو مفتاح خريطة لمعلمة تتبع القاعدة 1.c
  6. متغيرات

    1. مطابقة المعرف مع اسم متغير. إذا كان المعرف مؤهلا، يجب أن يكون session المؤهل أو system.session.
    2. إذا كان المعرف مؤهلا، فتطابق مع حقل أو مفتاح خريطة لمتغير يتبع القاعدة 1.c

القيود

لمنع تنفيذ الاستعلامات المرتبطة التي يحتمل أن تكون مكلفة، يحد Azure Databricks من الارتباط المدعوم بمستوى واحد. ينطبق هذا التقييد أيضا على مراجع المعلمات في وظائف SQL.

الأمثلة

-- Differentiating columns and fields
> SELECT a FROM VALUES(1) AS t(a);
 1

> SELECT t.a FROM VALUES(1) AS t(a);
 1

> SELECT t.a FROM VALUES(named_struct('a', 1)) AS t(t);
 1

-- A column takes precendece over a field
> SELECT t.a FROM VALUES(named_struct('a', 1), 2) AS t(t, a);
 2

-- Implict lateral column alias
> SELECT c1 AS a, a + c1 FROM VALUES(2) AS T(c1);
 2  4

-- A local column reference takes precedence, over a lateral column alias
> SELECT c1 AS a, a + c1 FROM VALUES(2, 3) AS T(c1, a);
 2  5

-- A scalar subquery correlation to S.c3
> SELECT (SELECT c1 FROM VALUES(1, 2) AS t(c1, c2)
           WHERE t.c2 * 2 = c3)
    FROM VALUES(4) AS s(c3);
 1

-- A local reference takes precedence over correlation
> SELECT (SELECT c1 FROM VALUES(1, 2, 2) AS t(c1, c2, c3)
           WHERE t.c2 * 2 = c3)
    FROM VALUES(4) AS s(c3);
  NULL

-- An explicit scalar subquery correlation to s.c3
> SELECT (SELECT c1 FROM VALUES(1, 2, 2) AS t(c1, c2, c3)
           WHERE t.c2 * 2 = s.c3)
    FROM VALUES(4) AS s(c3);
 1

-- Correlation from an EXISTS predicate to t.c2
> SELECT c1 FROM VALUES(1, 2) AS T(c1, c2)
    WHERE EXISTS(SELECT 1 FROM VALUES(2) AS S(c2)
                  WHERE S.c2 = T.c2);
 1

-- Attempt a lateral correlation to t.c2
> SELECT c1, c2, c3
    FROM VALUES(1, 2) AS t(c1, c2),
         (SELECT c3 FROM VALUES(3, 4) AS s(c3, c4)
           WHERE c4 = c2 * 2);
 [UNRESOLVED_COLUMN] `c2`

-- Successsful usage of lateral correlation with keyword LATERAL
> SELECT c1, c2, c3
    FROM VALUES(1, 2) AS t(c1, c2),
         LATERAL(SELECT c3 FROM VALUES(3, 4) AS s(c3, c4)
                  WHERE c4 = c2 * 2);
 1  2  3

-- Referencing a parameter of a SQL function
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
    RETURN (SELECT c1 FROM VALUES(1) AS T(c1) WHERE c1 = a);
> SELECT func(1), func(2);
 1  NULL

-- A column takes precedence over a parameter
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
    RETURN (SELECT a FROM VALUES(1) AS T(a) WHERE t.a = a);
> SELECT func(1), func(2);
 1  1

-- Qualify the parameter with the function name
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
    RETURN (SELECT a FROM VALUES(1) AS T(a) WHERE t.a = func.a);
> SELECT func(1), func(2);
 1  NULL

-- Lateral alias takes precedence over correlated reference
> SELECT (SELECT c2 FROM (SELECT 1 AS c1, c1 AS c2) WHERE c2 > 5)
    FROM VALUES(6) AS t(c1)
  NULL

-- Lateral alias takes precedence over function parameters
> CREATE OR REPLACE TEMPORARY FUNCTION func(x INT)
    RETURNS TABLE (a INT, b INT, c DOUBLE)
    RETURN SELECT x + 1 AS x, x
> SELECT * FROM func(1)
  2 2

-- All together now
> CREATE OR REPLACE TEMPORARY VIEW lat(a, b) AS VALUES('lat.a', 'lat.b');

> CREATE OR REPLACE TEMPORARY VIEW frm(a) AS VALUES('frm.a');

> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT, b int, c int)
  RETURNS TABLE
  RETURN SELECT t.*
    FROM lat,
         LATERAL(SELECT a, b, c
                   FROM frm) AS t;

> VALUES func('func.a', 'func.b', 'func.c');
  a      b      c
  -----  -----  ------
  frm.a  lat.b  func.c

دقة الجدول والعرض

يمكن أن يكون المعرف في مرجع الجدول أيا مما يلي:

  • جدول أو طريقة عرض ثابتة في كتالوج Unity أو Hive Metastore
  • تعبير الجدول الشائع (CTE)
  • طريقة عرض مؤقتة

تعتمد دقة المعرف على ما إذا كان مؤهلا:

  • مؤهل

    إذا كان المعرف مؤهلا بالكامل بثلاثة أجزاء: catalog.schema.relation، فهو فريد.

    إذا كان المعرف يتكون من جزأين: schema.relation، فإنه مؤهل بشكل أكبر مع نتيجة SELECT current_catalog() لجعله فريدا.

  • غير المشروط

    1. تعبير الجدول الشائع

      إذا كان المرجع ضمن نطاق WITH عبارة، فطابق المعرف مع CTE بدءا من العبارة التي WITH تحتوي على الفور والانتقال إلى الخارج من هناك.

    2. طريقة عرض مؤقتة

      مطابقة المعرف مع أي طريقة عرض مؤقتة محددة داخل جلسة العمل الحالية.

    3. الجدول المستمر

      قم بتأهيل المعرف بشكل كامل عن طريق التعليق المسبق لنتيجة SELECT current_catalog() وابحث SELECT current_schema() عنه كعلاقة مستمرة.

إذا تعذر حل العلاقة إلى أي جدول أو طريقة عرض أو CTE، فإن Databricks يثير خطأ TABLE_OR_VIEW_NOT_FOUND .

الأمثلة

-- Setting up a scenario
> USE CATALOG spark_catalog;
> USE SCHEMA default;

> CREATE TABLE rel(c1 int);
> INSERT INTO rel VALUES(1);

-- An fully qualified reference to rel:
> SELECT c1 FROM spark_catalog.default.rel;
 1

-- A partially qualified reference to rel:
> SELECT c1 FROM default.rel;
 1

-- An unqualified reference to rel:
> SELECT c1 FROM rel;
 1

-- Add a temporary view with a conflicting name:
> CREATE TEMPORARY VIEW rel(c1) AS VALUES(2);

-- For unqualified references the temporary view takes precedence over the persisted table:
> SELECT c1 FROM rel;
 2

-- Temporary views cannot be qualified, so qualifiecation resolved to the table:
> SELECT c1 FROM default.rel;
 1

-- An unqualified reference to a common table expression wins even over a temporary view:
> WITH rel(c1) AS (VALUES(3))
    SELECT * FROM rel;
 3

-- If CTEs are nested, the match nearest to the table reference takes precedence.
> WITH rel(c1) AS (VALUES(3))
    (WITH rel(c1) AS (VALUES(4))
      SELECT * FROM rel);
  4

-- To resolve the table instead of the CTE, qualify it:
> WITH rel(c1) AS (VALUES(3))
    (WITH rel(c1) AS (VALUES(4))
      SELECT * FROM default.rel);
  1

-- For a CTE to be visible it must contain the query
> SELECT * FROM (WITH cte(c1) AS (VALUES(1))
                   SELECT 1),
                cte;
  [TABLE_OR_VIEW_NOT_FOUND] The table or view `cte` cannot be found.

دقة الدالة

يتم التعرف على مرجع الدالة بواسطة مجموعة الأقواس اللاحقة الإلزامية.

يمكن حلها إلى:

  • دالة مضمنة مقدمة من Azure Databricks،
  • دالة مؤقتة معرفة من قبل المستخدم محددة النطاق لجلسة العمل الحالية، أو
  • دالة ثابتة معرفة من قبل المستخدم مخزنة في hive metastore أو كتالوج Unity.

تعتمد دقة اسم الدالة على ما إذا كان مؤهلا:

  • مؤهل

    إذا كان الاسم مؤهلا بالكامل بثلاثة أجزاء: catalog.schema.function، فهو فريد.

    إذا كان الاسم يتكون من جزأين: schema.function، فإنه مؤهل بشكل أكبر مع نتيجة SELECT current_catalog() لجعله فريدا.

    ثم يتم البحث عن الدالة في الكتالوج.

  • غير المشروط

    بالنسبة لأسماء الوظائف غير المؤهلة، يتبع Azure Databricks ترتيب أسبقية ثابت (PATH):

    1. الدالة Builtin

      إذا كانت دالة بهذا الاسم موجودة بين مجموعة الدالات المضمنة، يتم اختيار هذه الدالة.

    2. الدالة المؤقتة

      إذا كانت دالة بهذا الاسم موجودة بين مجموعة الدالات المؤقتة، يتم اختيار هذه الدالة.

    3. الدالة المستمرة

      قم بتأهيل اسم الدالة بشكل كامل عن طريق التعليق المسبق لنتيجة SELECT current_catalog() وابحث SELECT current_schema() عنها كدالة ثابتة.

إذا تعذر حل الدالة، فإن Azure Databricks يثير خطأ UNRESOLVED_ROUTINE .

الأمثلة

> USE CATALOG spark_catalog;
> USE SCHEMA default;

-- Create a function with the same name as a builtin
> CREATE FUNCTION concat(a STRING, b STRING) RETURNS STRING
    RETURN b || a;

-- unqualified reference resolves to the builtin CONCAT
> SELECT concat('hello', 'world');
 helloworld

-- Qualified reference resolves to the persistent function
> SELECT default.concat('hello', 'world');
 worldhello

-- Create a persistent function
> CREATE FUNCTION func(a INT, b INT) RETURNS INT
    RETURN a + b;

-- The persistent function is resolved without qualifying it
> SELECT func(4, 2);
 6

-- Create a conflicting temporary function
> CREATE FUNCTION func(a INT, b INT) RETURNS INT
    RETURN a / b;

-- The temporary function takes precedent
> SELECT func(4, 2);
 2

-- To resolve the persistent function it now needs qualification
> SELECT spark_catalog.default.func(4, 3);
 6