Bagikan melalui


Resolusi Nama

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

Resolusi nama adalah proses di mana pengidentifikasi dihubungkan dengan 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 harus selalu memenuhi kualifikasi.
  • Nama parameterFungsi yang Ditentukan Pengguna SQL atau Prosedur SQL.
  • Nama variabel lokal sesi atau skrip SQL .
  • Fungsi khusus seperti current_user atau current_date yang tidak memerlukan penggunaan ().
  • Kata kunci DEFAULT yang digunakan dalam konteks INSERT, UPDATE, MERGE, atau SET VARIABLE untuk mengatur kolom atau nilai variabel ke defaultnya.

Resolusi nama menerapkan prinsip-prinsip berikut:

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

Secara rinci, pemetaan pengidentifikasi ke referensi tertentu mengikuti aturan ini secara berurutan.

  1. Referensi lokal

    1. referensi Kolom

      Cocokkan pengidentifikasi, yang mungkin ditentukan secara khusus, dengan nama kolom dalam referensi tabel dari FROM clause.

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

    2. Referensi fungsi tanpa parameter

      Jika pengidentifikasi tidak memenuhi syarat dan cocok dengan current_user, current_date, atau current_timestamp: Selesaikan sebagai salah satu fungsi ini.

    3. DEFAULT spesifikasi Kolom

      Jika pengenal tidak berkualifikasi, sesuai dengan default dan membentuk seluruh ekspresi dalam konteks UPDATE SET, INSERT VALUES, atau MERGE WHEN [NOT] MATCHED: Tentukan sebagai nilai DEFAULT yang sesuai dari tabel target INSERT, UPDATE, 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:

      Sebuah. Hapus pengidentifikasi terakhir dan perlakukan sebagai bidang atau kunci. B. Cocokkan hasil pembagian yang tersisa dengan kolom dalam referensi tabel dari FROM clause.

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

      Jika ada kecocokan dan kolomnya adalah:

      • STRUCT: Sesuaikan kolom.

        Jika bidang tidak dapat dicocokkan, tampilkan error FIELD_NOT_FOUND.

        Jika ada lebih dari satu bidang, timbulkan kesalahan AMBIGUOUS_COLUMN_OR_FIELD.

      • MAP: Munculkan kesalahan jika kunci terdefinisi secara spesifik.

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

      • Jenis lainnya: Memicu kesalahan. C. Ulangi langkah sebelumnya untuk menghapus pengidentifikasi terakhir sebagai kolom. Terapkan aturan (A) dan (B) selama ada pengidentifikasi yang tersisa untuk ditafsirkan sebagai kolom.

  2. gangguan alias kolom lateral

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

    Jika ekspresi berada dalam daftar SELECT, cocokkan pengidentifikasi di depan dengan alias kolom sebelumnya dalam daftar SELECT tersebut.

    Jika ada lebih dari satu kecocokan tersebut, munculkan 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 kata kunci LATERAL, terapkan aturan 1.a dan 1.d dengan mempertimbangkan referensi tabel di 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 dengan mengulangi pada setiap tingkat bersarang dari kueri.

  5. UNTUK perulangan

    Jika pernyataan tersebut terkandung dalam perulangan FOR:

    Sebuah. Cocokkan identifier dengan kolom dalam kueri pernyataan loop FOR. Jika pengenal memenuhi syarat, kualifikasi harus cocok dengan nama variabel loop FOR jika ditentukan. B. Jika pengidentifikasi terkualifikasi, cocokkan dengan bidang atau kunci peta dari parameter sesuai dengan aturan 1.c

  6. pernyataan gabungan

    Jika pernyataan terkandung dalam pernyataan gabungan:

    Sebuah. Cocokkan pengidentifikasi dengan variabel yang dideklarasikan dalam pernyataan gabungan tersebut. Jika pengidentifikasi memenuhi syarat, kualifikasi harus cocok dengan label pernyataan gabungan jika didefinisikan. B. Jika pengidentifikasi memenuhi syarat, cocokkan dengan bidang atau kunci pada peta dari variabel sesuai dengan aturan 1.c

  7. pernyataan gabungan berlapis atau FOR perulangan

    Terapkan kembali aturan 5 dan 6, iterasi di atas tingkat berlapis dari pernyataan gabungan.

  8. Parameter rutin

    Jika ekspresi adalah bagian dari CREATE FUNCTION atau pernyataan CREATE PROCEDURE :

    1. Cocokkan pengidentifikasi dengan nama parameter . Jika pengidentifikasi memenuhi syarat, kualifikasi harus cocok dengan nama rutinitas.
    2. Jika pengidentifikasi terkualifikasi, cocokkan dengan bidang atau kunci peta dari parameter sesuai dengan aturan 1.c
  9. Variabel Sesi

    1. Cocokkan pengidentifikasi dengan nama variabel . Jika identifikator terkualifikasi, kualifikator harus session atau system.session.
    2. Jika pengidentifikasi memenuhi syarat, cocokkan dengan bidang atau kunci pada peta dari variabel sesuai dengan 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 precedence 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 dapat berupa salah satu dari berikut ini:

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

Resolusi pengidentifikasi tergantung pada apakah pengidentifikasi tersebut berkualifikasi.

  • Memenuhi Syarat

    Jika pengidentifikasi tersebut memenuhi kualifikasi sepenuhnya dengan tiga bagian: catalog.schema.relation, maka pengidentifikasi tersebut adalah unik.

    Jika identifikasi terdiri dari dua bagian: schema.relation, ini selanjutnya dikuatkan dengan hasil SELECT current_catalog() untuk membuatnya unik.

  • Tidak memenuhi syarat

    1. ekspresi tabel umum

      Jika referensi berada dalam cakupan klausa WITH, cocokkan pengidentifikasi dengan CTE yang dimulai dari klausa WITH yang langsung mengandungnya, lalu bergerak keluar dari situ.

    2. Tampilan sementara atau tabel sementara

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

    3. tabel yang persisten

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

Jika hubungan tidak dapat dipetakan ke tabel, tampilan, atau CTE apa pun, Databricks menghasilkan 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 menghasilkan:

  • Fungsi bawaan yang disediakan oleh Azure Databricks,
  • Fungsi sementara yang ditentukan pengguna 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:

  • Memenuhi Syarat

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

    Jika nama terdiri dari dua bagian: schema.function, itu diberi kualifikasi lebih lanjut dengan hasil SELECT current_catalog() agar menjadi 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 yang disimpan

      Sepenuhnya memenuhi syarat nama fungsi dengan melakukan pra-pending hasil SELECT current_catalog() dan SELECT current_schema() dan 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