Bagikan melalui


Resolusi Nama

Berlaku untuk: centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime

Resolusi nama adalah proses di mana pengidentifikasi diselesaikan ke referensi kolom, bidang, parameter, atau tabel tertentu.

Resolusi kolom, bidang, parameter, dan variabel

Pengidentifikasi dalam ekspresi dapat menjadi referensi ke salah satu hal berikut:

  • Nama kolom berdasarkan tampilan, tabel, ekspresi tabel umum (CTE), atau column_alias.
  • Nama bidang atau kunci peta dalam struktur atau peta. Bidang dan kunci tidak pernah bisa tidak memenuhi syarat.
  • Nama parameter Fungsi yang Ditentukan Pengguna SQL.
  • Nama variabel.
  • Fungsi khusus seperti current_user atau current_date yang tidak memerlukan penggunaan ().
  • Kata DEFAULT kunci yang digunakan dalam konteks INSERT, , UPDATEMERGE, atau SET VARIABLE untuk mengatur nilai kolom atau variabel ke defaultnya.

Resolusi nama menerapkan prinsip-prinsip berikut:

  • Referensi pencocokan terdekat menang, dan
  • Kolom dan parameter menang atas bidang dan kunci.

Secara rinci, resolusi pengidentifikasi untuk referensi tertentu mengikuti aturan ini secara berurutan:

  1. Referensi lokal

    1. Referensi kolom

      Cocokkan pengidentifikasi, yang mungkin memenuhi syarat, ke nama kolom dalam referensi tabel dari FROM clause.

      Jika ada lebih dari satu kecocokan tersebut, ajukan kesalahan AMBIGUOUS_COLUMN_OR_FIELD .

    2. Referensi fungsi tanpa parameter

      Jika pengidentifikasi tidak memenuhi syarat dan cocok current_userdengan , , current_dateatau current_timestamp: Selesaikan sebagai salah satu fungsi ini.

    3. Spesifikasi DEFAULT kolom

      Jika pengidentifikasi tidak memenuhi syarat, cocok default dan membentuk seluruh ekspresi dalam konteks UPDATE SET, , INSERT VALUESatau MERGE WHEN [NOT] MATCHED: Selesaikan sebagai nilai masing-masing DEFAULT dari tabel target , INSERTUPDATE atau MERGE.

    4. Referensi bidang struktur atau kunci peta

      Jika pengidentifikasi memenuhi syarat, upayakan untuk mencocokkannya dengan bidang atau kunci peta sesuai dengan langkah-langkah berikut:

      J. Hapus pengidentifikasi terakhir dan perlakukan sebagai bidang atau kunci. B. Cocokkan sisanya dengan kolom dalam referensi tabel dari FROM clause.

      Jika ada lebih dari satu kecocokan tersebut, ajukan kesalahan AMBIGUOUS_COLUMN_OR_FIELD .

      Jika ada kecocokan dan kolomnya adalah:

      • STRUCT: Cocokkan bidang .

        Jika bidang tidak dapat dicocokkan, ajukan kesalahan FIELD_NOT_FOUND .

        Jika ada lebih dari satu bidang, ajukan kesalahan AMBIGUOUS_COLUMN_OR_FIELD .

      • MAP: Munculkan kesalahan jika kunci memenuhi syarat.

        Eror runtime dapat terjadi jika kunci benar-benar tidak ada di peta.

      • Jenis lainnya: Memunculkan kesalahan. C. Ulangi langkah sebelumnya untuk menghapus pengidentifikasi berikutnya sebagai bidang. Terapkan aturan (A) dan (B) saat ada pengidentifikasi yang tersisa untuk ditafsirkan sebagai kolom.

  2. Alias kolom lateral

    Berlaku untuk: centang ditandai ya Databricks SQL centang ditandai ya Databricks Runtime 12.2 LTS ke atas

    Jika ekspresi berada dalam SELECT daftar, cocokkan pengidentifikasi utama dengan alias kolom sebelumnya dalam daftar tersebutSELECT.

    Jika ada lebih dari satu kecocokan tersebut, ajukan kesalahan AMBIGUOUS_LATERAL_COLUMN_ALIAS .

    Cocokkan setiap pengidentifikasi yang tersisa sebagai bidang atau kunci peta, dan munculkan kesalahan FIELD_NOT_FOUND atau AMBIGUOUS_COLUMN_OR_FIELD jika tidak dapat dicocokkan.

  3. Korelasi

    • LATERAL

      Jika kueri didahului oleh LATERAL kata kunci, terapkan aturan 1.a dan 1.d dengan mempertimbangkan referensi tabel dalam FROM yang berisi kueri dan sebelum LATERAL.

    • Biasa

      Jika kueri adalah subkueri skalar, IN, atau EXISTS subkueri menerapkan aturan 1.a, 1.d, dan 2 dengan mempertimbangkan referensi tabel dalam klausa kueri FROM yang berisi.

  4. Korelasi berlapis

    Terapkan ulang aturan 3 yang berulang di atas tingkat berlapis kueri.

  5. Parameter rutin

    Jika ekspresi adalah bagian dari pernyataan CREATE FUNCTION :

    1. Cocokkan pengidentifikasi dengan nama parameter. Jika pengidentifikasi memenuhi syarat, kualifikasi harus cocok dengan nama fungsi.
    2. Jika pengidentifikasi memenuhi syarat, cocokkan dengan bidang atau kunci peta parameter berikut aturan 1.c
  6. Variabel

    1. Cocokkan pengidentifikasi dengan nama variabel. Jika pengidentifikasi memenuhi syarat, kualifikasi harus session atau system.session.
    2. Jika pengidentifikasi memenuhi syarat, cocokkan dengan bidang atau kunci peta variabel berikut aturan 1.c

Batasan

Untuk mencegah eksekusi kueri berkorelasi yang berpotensi mahal, Azure Databricks membatasi korelasi yang didukung ke satu tingkat. Pembatasan ini juga berlaku untuk referensi parameter dalam fungsi SQL.

Contoh

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

Resolusi tabel dan tampilan

Pengidentifikasi dalam referensi tabel bisa menjadi salah satu dari berikut ini:

  • Tabel atau tampilan persisten di Katalog Unity atau Metastore Apache Hive
  • Ekspresi tabel umum (CTE)
  • Tampilan sementara

Resolusi pengidentifikasi tergantung pada apakah pengidentifikasi memenuhi syarat:

  • Berkualitas

    Jika pengidentifikasi sepenuhnya memenuhi syarat dengan tiga bagian: catalog.schema.relation, pengidentifikasi tersebut unik.

    Jika pengidentifikasi terdiri dari dua bagian: schema.relation, pengidentifikasi lebih lanjut memenuhi syarat dengan hasil SELECT current_catalog() untuk membuatnya unik.

  • Tidak memenuhi syarat

    1. Ekspresi tabel umum

      Jika referensi berada dalam cakupan WITH klausa, cocokkan pengidentifikasi dengan CTE yang dimulai dengan klausa yang WITH segera berisi dan bergerak keluar dari sana.

    2. Tampilan sementara

      Cocokkan pengidentifikasi dengan tampilan sementara yang ditentukan dalam sesi saat ini.

    3. Tabel yang dipertahankan

      Sepenuhnya memenuhi syarat pengidentifikasi dengan melakukan pra-pending hasil SELECT current_catalog() dan SELECT current_schema() mencarinya sebagai hubungan persisten.

Jika hubungan tidak dapat diatasi ke tabel, tampilan, atau CTE apa pun, Databricks menimbulkan kesalahan TABLE_OR_VIEW_NOT_FOUND .

Contoh

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

Resolusi fungsi

Referensi fungsi dikenali oleh kumpulan tanda kurung berikutnya yang wajib.

Ini dapat diselesaikan untuk:

  • Fungsi bawaan yang disediakan oleh Azure Databricks,
  • Fungsi yang ditentukan pengguna sementara yang dilingkup ke sesi saat ini, atau
  • Fungsi yang ditentukan pengguna persisten disimpan di metastore apache hive atau Katalog Unity.

Resolusi nama fungsi tergantung pada apakah itu memenuhi syarat:

  • Berkualitas

    Jika nama sepenuhnya memenuhi syarat dengan tiga bagian: catalog.schema.function, itu unik.

    Jika nama terdiri dari dua bagian: schema.function, itu lebih memenuhi syarat dengan hasil SELECT current_catalog() untuk membuatnya unik.

    Fungsi ini kemudian dicari di katalog.

  • Tidak memenuhi syarat

    Untuk nama fungsi yang tidak memenuhi syarat, Azure Databricks mengikuti urutan prioritas tetap (PATH):

    1. Fungsi bawaan

      Jika fungsi dengan nama ini ada di antara kumpulan fungsi bawaan, fungsi tersebut dipilih.

    2. Fungsi sementara

      Jika fungsi dengan nama ini ada di antara kumpulan fungsi sementara, fungsi tersebut dipilih.

    3. Fungsi persisten

      Sepenuhnya memenuhi syarat nama fungsi dengan melakukan pra-pending hasil SELECT current_catalog() dan SELECT current_schema() mencarinya sebagai fungsi persisten.

Jika fungsi tidak dapat diselesaikan Azure Databricks menimbulkan kesalahan UNRESOLVED_ROUTINE .

Contoh

> 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