Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:
Databricks SQL
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_userataucurrent_dateyang tidak memerlukan penggunaan(). - Kata kunci
DEFAULTyang digunakan dalam konteksINSERT,UPDATE,MERGE, atauSET VARIABLEuntuk 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.
Referensi lokal
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.
Referensi fungsi tanpa parameter
Jika pengidentifikasi tidak memenuhi syarat dan cocok dengan
current_user,current_date, ataucurrent_timestamp: Selesaikan sebagai salah satu fungsi ini.DEFAULT spesifikasi Kolom
Jika pengenal tidak berkualifikasi, sesuai dengan
defaultdan membentuk seluruh ekspresi dalam konteksUPDATE SET,INSERT VALUES, atauMERGE WHEN [NOT] MATCHED: Tentukan sebagai nilaiDEFAULTyang sesuai dari tabel targetINSERT,UPDATE, atauMERGE.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.
gangguan alias kolom lateral
Berlaku untuk:
Databricks SQL
Databricks Runtime 12.2 LTS ke atasJika ekspresi berada dalam daftar
SELECT, cocokkan pengidentifikasi di depan dengan alias kolom sebelumnya dalam daftarSELECTtersebut.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.
Korelasi
LATERAL
Jika kueri didahului oleh kata kunci
LATERAL, terapkan aturan 1.a dan 1.d dengan mempertimbangkan referensi tabel diFROMyang berisi kueri dan sebelumLATERAL.Biasa
Jika kueri adalah subkueri skalar,
IN, atauEXISTSsubkueri menerapkan aturan 1.a, 1.d, dan 2 dengan mempertimbangkan referensi tabel dalam klausa kueriFROMyang berisi.
Korelasi berlapis
Berlaku untuk:
Databricks SQL
Databricks Runtime 20.0 ke atasTerapkan ulang aturan 3, iterasi pada tingkat nesting kueri, sehingga pengenal dapat diselesaikan ke referensi yang berkorelasi dalam kueri apa pun yang melampirkan, bukan hanya yang langsung melampirkan.
-
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 -
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
pernyataan gabungan berlapis atau
FORperulanganTerapkan kembali aturan 5 dan 6, iterasi di atas tingkat berlapis dari pernyataan gabungan.
Parameter rutin
Jika ekspresi adalah bagian dari CREATE FUNCTION atau pernyataan CREATE PROCEDURE :
Variabel Sesi
- Cocokkan pengidentifikasi dengan nama variabel . Jika identifikator terkualifikasi, kualifikator harus
sessionatausystem.session. Dalam Databricks SQL dan Databricks Runtime 19 ke atas, pengidentifikasi tanpa kualifikasi hanya cocok dengan variabel sesi jikasystem.sessionada di PATH. - Jika pengidentifikasi memenuhi syarat, cocokkan dengan bidang atau kunci pada peta dari variabel sesuai dengan aturan 1.c
- Cocokkan pengidentifikasi dengan nama variabel . Jika identifikator terkualifikasi, kualifikator harus
Resolusi nama dalam HAVING, ORDER BY, dan QUALIFY
Klausa HAVING, ORDER BY, dan QUALIFY dapat mereferensikan nama dari SELECT daftar serta kolom dari tabel yang mendasar. Saat nama dalam salah satu klausul ini cocok dengan alias kolom dalam SELECT daftar dan kolom tabel, klausa menyelesaikan ambiguitas secara berbeda:
-
ORDER BYSELECTlebih memilih alias daftar di atas kolom tabel. -
HAVINGlebih memilih kolom tabel daripadaSELECTalias daftar. -
QUALIFYlebih memilih kolom tabel daripadaSELECTalias daftar (sama sepertiHAVING).
Contoh
> CREATE OR REPLACE TEMPORARY VIEW t(a, b) AS VALUES (1, 10), (2, 20), (3, 30);
-- ORDER BY prefers the alias over the column.
-- 'a' in ORDER BY refers to the alias (-a), not column 'a',
-- so the row with the largest column 'a' comes first.
> SELECT -a AS a FROM t ORDER BY a LIMIT 1;
-3
-- HAVING prefers the column over the alias.
-- 'a' in HAVING refers to column 'a', not the alias sum(b).
> SELECT sum(b) AS a FROM t GROUP BY a HAVING a > 1;
20
30
-- QUALIFY prefers the column over the alias (same as HAVING).
-- 'a' in QUALIFY refers to column 'a', not the alias -row_number().
> SELECT -row_number() OVER (ORDER BY b) AS a FROM t QUALIFY a > 1;
-2
-3
Ekstraksi bidang dan prioritas resolusi nama
Ketika nama yang memenuhi syarat seperti a.b digunakan di HAVING atau ORDER BY, aturan prioritas di atas masih berlaku, tetapi dengan pertimbangan tambahan: kandidat pilihan harus mendukung bidang struktur atau ekstraksi kunci peta. Jika tidak, kandidat lain digunakan sebagai gantinya.
Misalnya, jika alias a diselesaikan ke biasa INT tetapi kolom a tabel adalah STRUCT bidang xdengan , ORDER BY memilih STRUCT kolom karena bidang tidak dapat diekstrak dari INT alias. Sebaliknya, jika kolom tabel adalah biasa INT dan alias adalah STRUCT, HAVING jatuh kembali ke alias untuk ekstraksi bidang.
Contoh
-- ORDER BY fallback: the table column is a STRUCT, the alias is an INT.
-- ORDER BY normally prefers the alias, but the alias (INT) cannot have
-- field 'x' extracted, so the struct column wins.
> CREATE OR REPLACE TEMPORARY VIEW s1(a) AS VALUES (named_struct('x', 1)), (named_struct('x', 2));
> SELECT -a.x AS a FROM s1 ORDER BY a.x LIMIT 1;
-1
-- HAVING fallback: the table column is an INT, the alias is a STRUCT.
-- HAVING normally prefers the table column, but the column (INT) cannot have
-- field 'x' extracted, so the alias wins.
> CREATE OR REPLACE TEMPORARY VIEW s2(a) AS VALUES (1), (2);
> SELECT named_struct('x', 2) AS a FROM s2 GROUP BY a HAVING a.x > 1;
{"x":2}
{"x":2}
-- Map key extraction follows the same rules.
-- ORDER BY fallback: alias (INT) cannot have key extracted, map column wins.
> CREATE OR REPLACE TEMPORARY VIEW s3(a) AS VALUES (map('key', 100)), (map('key', 200));
> SELECT -a['key'] AS a FROM s3 ORDER BY a['key'] LIMIT 1;
-100
-- HAVING fallback: column (INT) cannot have key extracted, map alias wins.
> CREATE OR REPLACE TEMPORARY VIEW s4(a) AS VALUES (100), (200);
> SELECT map('key', 200) AS a FROM s4 GROUP BY a HAVING a['key'] > 100;
{"key":200}
{"key":200}
Batasan
Dalam Databricks SQL dan Databricks Runtime 20.0 ke atas, korelasi bersarang (subquery yang merujuk kolom dari kueri yang melampirkan di luar induk langsungnya) didukung, dengan keterbatasan berikut:
- Korelasi bersarang tidak didukung untuk subquery dalam klausa
HAVING. -
LATERALSubquery tidak bisa dikorelasi bersarang. Referensi luarnya harus diselesaikan ke query yang langsung melampirkan.
Pada versi Databricks Runtime di bawah 20.0, korelasi dibatasi pada satu level: subquery hanya dapat merujuk kolom dari query yang langsung memasukkannya.
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
-- Nested correlation: the innermost EXISTS references t1.a from the outermost query
> CREATE OR REPLACE TEMPORARY VIEW t1(a) AS VALUES(1), (2), (3);
> CREATE OR REPLACE TEMPORARY VIEW t2(b) AS VALUES(1), (2);
> CREATE OR REPLACE TEMPORARY VIEW t3(c) AS VALUES(2), (3);
> SELECT a FROM t1
WHERE EXISTS(SELECT 1 FROM t2
WHERE t2.b = t1.a
AND EXISTS(SELECT 1 FROM t3
WHERE t3.c = t1.a));
2
-- 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 hasilSELECT current_catalog()untuk membuatnya unik.Jika skema adalah
session, maka selanjutnya dikualifikasi dengansystemdan diinterpretasikan sebagai tampilan sementara atau tabel sementara. Jika skema adalahglobal_temp, skema tersebut dikualifikasi lebih lanjut dengansystemdan diinterpretasikan sebagai tampilan global sementara dalam Databricks Runtime.Tidak memenuhi syarat
ekspresi tabel umum
Jika referensi berada dalam cakupan klausa
WITH, cocokkan pengidentifikasi dengan CTE yang dimulai dari klausaWITHyang langsung mengandungnya, lalu bergerak keluar dari situ.Jalur pencarian skema
Dalam Databricks SQL dan Databricks Runtime 19 dan ke atas, kualifikasi relasi dengan setiap skema pada PATH, secara berurutan, hingga ditemukan kecocokan.
- Katalog atau skema yang hilang: Katalog atau skema yang hilang pada jalur akan dilewati. Objek yang hak istimewanya tidak cukup tidak dimiliki pengguna tidak akan dilewati; Azure Databricks menampilkan error yang sesuai.
-
Tampilan dan tabel sementara: Tampilan sementara dan tabel sementara tinggal di
system.session, sehingga dapat diakses kapan punsystem.sessionberada diPATH. -
Tabel dan tampilan persisten dalam skema saat ini: Tabel dan tampilan persisten dalam skema saat ini diakses melalui entri virtual
CURRENT_SCHEMA.
Path berlaku untuk nama relasi tanpa kualifikasi dalam kueri dan DML, serta untuk nama tanpa kualifikasi dalam kueri yang merupakan bagian dari pernyataan DDL.
Di mana jalur berlaku:
Context Jalur yang digunakan Kueri dan DML ( SELECT,INSERT,UPDATE,DELETE, )MERGEJALUR Sesi Kueri ASCREATE TABLE JALUR Sesi Kueri pada persisten CREATE VIEW PATH ditangkap saat waktu pembuatan Subjek , CREATEDROP,ALTER, dan sejenisnyacurrent_catalog.current_schema(bukan pencarian jalur)Rilis sebelumnya: Dalam Databricks Runtime 18 dan di bawahnya, relasi tanpa kualifikasi yang bukan CTE diselesaikan dalam urutan tetap.
Tampilan sementara atau tabel sementara
Cocokkan pengidentifikasi dengan tampilan sementara atau tabel sementara yang ditentukan dalam sesi saat ini.
tabel yang persisten
Sepenuhnya memenuhi syarat pengidentifikasi dengan melakukan pra-pending hasil
SELECT current_catalog()danSELECT 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.
Jalur yang ditangkap
Tampilan persisten menangkap PATH sesi pada waktu pembuatan. Kueri selanjutnya dari tampilan menyelesaikan nama yang tidak memenuhi syarat terhadap jalur yang ditangkap, bukan jalur sesi pemanggil.
current_path() dan current_schema() dalam kueri itu masih mengembalikan nilai sesi pemanggil.
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.
Fungsi dan penyelesaian prosedur
Referensi rutin (panggilan fungsi atau panggilan prosedur) dikenali dengan set tanda kurung wajib di belakang.
Ini dapat menghasilkan:
- Fungsi bawaan yang disediakan oleh Azure Databricks,
- Fungsi sementara yang ditentukan pengguna yang dilingkup ke sesi saat ini, atau
- Fungsi atau prosedur persisten yang didefinisikan pengguna yang disimpan di Hive Metastore atau Unity Catalog.
Penyelesaian nama rutin tergantung pada apakah nama tersebut memenuhi syarat:
Memenuhi Syarat
Jika nama sepenuhnya memenuhi syarat dengan tiga bagian:
catalog.schema.routine, itu unik.Jika nama terdiri dari dua bagian:
schema.routine, itu diberi kualifikasi lebih lanjut dengan hasilSELECT current_catalog()agar menjadi unik.Jika skema adalah
session, maka skema tersebut dikualifikasi lebih lanjut dengansystemdan diinterpretasikan sebagai fungsi sementara.Rutinitas tersebut kemudian dicari di katalog.
Tidak memenuhi syarat
- Jalur pencarian skema: Di Databricks SQL dan Databricks Runtime 19 ke atas, kualifikasi nama rutin dengan setiap skema pada PATH secara berurutan dan pilih kecocokan pertama.
- Katalog atau skema yang hilang: Katalog atau skema yang hilang pada jalur akan dilewati. Objek yang hak istimewanya tidak cukup tidak dimiliki pengguna tidak akan dilewati; Azure Databricks menampilkan error yang sesuai.
- Di mana rutinitas berada: Fungsi skalar dan tabel bawaan berada di
system.builtin, fungsi AI disystem.ai, dan fungsi sementara disystem.session. -
Jalur default: Default-nya
PATHadalahsystem.session, lalusystem.builtin, lalusystem.ai, laluCURRENT_SCHEMA.
Warning
Fungsi sementara dengan nama yang sama seperti fungsi bawaan menjadi prioritas karena
system.sessionmuncul sebelumsystem.builtinpada jalur default. Anda bisa mengatur ulang jalur dengan SET PATH. Jangan mengandalkan fungsi sementara yang membayangkan fungsi bawaan.Di mana jalur berlaku:
Context Jalur yang digunakan Nama rutin tanpa kualifikasi dalam kueri dan DML JALUR Sesi Isi fungsi yang didefinisikan pengguna SQL PATH ditangkap saat waktu pembuatan Isi SQL SECURITY DEFINERprosedurPATH ditangkap pada waktu pembuatan, tanpa system.sessionIsi SQL SECURITY INVOKERprosedurPATH langsung penelepon Subjek , CREATE FUNCTIONDROP FUNCTION,CREATE PROCEDURE, dan sejenisnyaSkema saat ini (bukan pencarian jalur) Rilis sebelumnya: Dalam Databricks Runtime 18 dan ke bawah, Azure Databricks mengikuti urutan prioritas yang tetap.
Fungsi bawaan
Jika fungsi dengan nama ini ada di antara kumpulan fungsi bawaan, fungsi tersebut dipilih.
Fungsi sementara
Jika fungsi dengan nama ini ada di antara kumpulan fungsi sementara, fungsi tersebut dipilih.
Fungsi yang disimpan
Sepenuhnya memenuhi syarat nama fungsi dengan melakukan pra-pending hasil
SELECT current_catalog()danSELECT current_schema()dan mencarinya sebagai fungsi persisten.
Jika rutin tidak dapat diselesaikan, Azure Databricks akan muncul kesalahanUNRESOLVED_ROUTINE.
Jalur yang ditangkap
-
Fungsi yang didefinisikan pengguna SQL: Nama tanpa kualifikasi di isi diselesaikan terhadap PATH yang ditangkap di CREATE FUNCTION, bukan jalur sesi pemanggil.
current_path()dancurrent_schema()di badan itu tetap mengembalikan nilai sesi pemanggil. -
Prosedur dengan
SQL SECURITY DEFINER: Nama yang tidak memenuhi syarat diselesaikan terhadap PATH yang ditangkap pada PROSEDUR CREATE, dengansystem.sessiondihilangkan.current_path()dalam tubuh itu kembali jalur yang sama yang tertangkap. -
Prosedur dengan:
SQL SECURITY INVOKERNama yang tidak memenuhi syarat menggunakan jalur langsung penelepon.
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