Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:
Databricks SQL
Databricks Runtime
Ad çözümlemesi, tanımlayıcılarının belirli sütun, alan, parametre veya tablo başvuruları olarak çözümlendiği işlemdir.
Sütun, alan, parametre ve değişken çözünürlüğü
İfadelerdeki tanımlayıcılar aşağıdakilerden herhangi birine başvuru olabilir:
- Sütun adı bir görünüm, tablo, ortak tablo ifadesi (CTE) veya column_alias temelinde.
- Bir yapı veya harita içindeki alan adı veya eşleme anahtarı. Alanlar ve anahtarlar hiçbir zaman niteliksiz olamaz.
- SQL Kullanıcı Tanımlı İşlevinin veya SQL Yordamınınparametre adı.
- oturum veya SQL betiği yerel değişken adı.
-
current_userveyacurrent_dategibi,()kullanımı gerektirmeyen özel bir işlev. - sütun veya değişken değerini varsayılan değerine ayarlamak için
DEFAULT,INSERT,UPDATEveyaMERGEbağlamında kullanılanSET VARIABLEanahtar sözcüğü.
Ad çözümlemesi aşağıdaki ilkeleri uygular:
- En yakın eşleşen referans kazanır ve
- Sütunlar ve parametreler alanlar ve anahtarlara kıyasla daha baskındır.
Ayrıntılı olarak, tanımlayıcıların belirli bir başvuruya çözümlenmesi şu kuralları sırayla izler:
Yerel referanslar
Sütun referansı
Eşleştirin tanımlayıcıyı,
FROM clause'e ait sütun adıyla.Bu tür birden fazla eşleşme varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası verir.
Parametresiz işlev başvurusu
Tanımlayıcı nitelenmemişse ve
current_user,current_dateveyacurrent_timestampile eşleşiyorsa, bu işlevlerden biri olarak çözümle.Sütun varsayılan belirtimi
Eğer tanımlayıcı nitelenmemişse,
defaultile eşleşir veUPDATE SET,INSERT VALUESveyaMERGE WHEN [NOT] MATCHEDbağlamında ifadenin tamamını oluşturuyorsa: O zamanDEFAULT,INSERTveyaUPDATEhedef tablosunun ilgiliMERGEdeğeri olarak çözülür.Yapı alanı veya eşleme anahtarı başvurusu
Tanımlayıcı nitelenmişse, aşağıdaki adımlara göre bunu bir alan veya eşleme anahtarıyla eşleştirmeye çabalayın:
A. Son tanımlayıcıyı kaldırın ve bir alan veya anahtar olarak değerlendirin. B. tablosundaki başvurusunu
FROM clause'nin bir sütunuyla eşleştirin.Bu tür birden fazla eşleşme varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası verir.
Eşleşme varsa ve sütun şöyleyse:
STRUCT: Alanı eşleştirin.Alan eşleştirilemiyorsa bir FIELD_NOT_FOUND hatası oluşturun.
Birden fazla alan varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası oluşturun.
MAP: Anahtar uygunsa hataya neden olur.Anahtar haritada gerçekten mevcut değilse çalışma zamanı hatası oluşabilir.
Başka bir tür: Hata oluştur. C. Bir alan olarak sondaki tanımlayıcıyı kaldırmak için önceki adımı yineleyin. Sütun olarak yorumlanacak tanımlayıcı kaldığı sürece kuralları (A) ve (B) uygulayın.
Yanal sütun örnekleme hatası
Şunlar için geçerlidir:
Databricks SQL
Databricks Runtime 12.2 LTS ve üzeriİfade bir
SELECTlistesi içindeyse, bu listesindeki öncekiSELECTile baştaki tanımlayıcıyı eşleştirin.Birden fazla eşleşme varsa, bir AMBIGUOUS_LATERAL_COLUMN_ALIAS hatası ver.
Kalan her tanımlayıcıyı bir alan veya harita anahtarı olarak eşleştirin ve eşleştirilemiyorsa FIELD_NOT_FOUND veya AMBIGUOUS_COLUMN_OR_FIELD hatası oluşturun.
Bağıntı
YANAL
Sorgudan önce bir
LATERALanahtar sözcüğü varsa, sorguyu içeren veFROMöncesindekiLATERALtablo başvurularını göz önünde bulundurarak 1.a ve 1.d kurallarını uygulayın.Normal
Sorgu bir skaler alt sorgu ise veya
INEXISTSalt sorgu, içeren sorgununFROMyan tümcesindeki tablo başvurularını dikkate alarak 1.a, 1.d ve 2 kurallarını uygular.
İç içe bağıntı
Geçerlidir:
, Databricks SQL
, Databricks Runtime 20.0 ve üzeri.Kural 3'ü yeniden uygulayın, sorgunun iç içe düzeylerini tekrar edin, böylece bir tanımlayıcı sadece hemen kapsayan sorguda değil, herhangi bir çevreleyen sorguda korelasyona çözüm bulabilir.
-
deyimi bir
FORdöngüsünde yer alırsa:A. Tanımlayıcıyı
FORdöngü deyimi sorgusundaki bir sütunla eşleştirin. Eğer tanımlayıcı nitelikli ise, niteleyici tanımlanmışsa FOR döngüsü değişkeninin adıyla eşleşmelidir. B. Tanımlayıcı nitelenmişse, bir parametrenin alanına veya eşleme anahtarına 1.c kuralına göre eşleştirin. -
Deyimi bir bileşik deyimde yer aldıysa:
A. Tanımlayıcıyı bu bileşik deyimde bildirilen bir değişkenle eşleştirin. Tanımlayıcı nitelenmişse, nitelendirici, tanımlanmışsa bileşik deyimin etiketiyle eşleşmelidir. B. Tanımlayıcı nitelenmişse, kural 1.c uyarınca bir değişkenin alanı veya harita anahtarı ile eşleştirin.
İç içe bileşik deyimi veya
FORdöngüsüBileşik ifadenin iç içe geçmiş seviyelerinde yinelemeli olarak 5. ve 6. kuralları yeniden uygulayın.
Rutin parametreleri
İfade bir CREATE FUNCTION veya CREATE PROCEDURE deyiminin parçasıysa:
- tanımlayıcıyı parametre adıile eşleştirin. Tanımlayıcı nitelendirilmişse, niteleyici rutin adıyla eşleşmelidir.
- Tanımlayıcı nitelenmişse, bir parametrenin alanına veya eşleme anahtarına 1.c kuralına göre eşleştirin.
Oturum Değişkenleri
- tanımlayıcıyı değişken adıile eşleştirin. Tanımlayıcı uygunsa, niteleyici
sessionveyasystem.sessionolmalıdır. Databricks SQL ve Databricks Runtime 19 ve üzerinde, niteliksiz bir tanımlayıcı yalnızca PATH'de bir oturum değişkeniyle eşleşir.system.session - Tanımlayıcı nitelenmişse, kural 1.c uyarınca bir değişkenin alanı veya harita anahtarı ile eşleştirin.
- tanımlayıcıyı değişken adıile eşleştirin. Tanımlayıcı uygunsa, niteleyici
, HAVINGve içindeki ORDER BYad çözümlemesiQUALIFY
HAVING, ORDER BYve QUALIFY yan tümceleri, listedeki adlara SELECT ve temel tablolardaki sütunlara başvurabilir. Bu yan tümcelerden birindeki bir ad hem listedeki hem de tablo sütunundaki SELECT bir sütun diğer adıyla eşleştiğinde, yan tümceler belirsizliği farklı şekilde çözer:
-
ORDER BYtablo sütunu yerineSELECTliste diğer adını tercih eder. -
HAVINGliste diğer adı yerine tablo sütununuSELECTtercih eder. -
QUALIFYliste diğer adı yerine tablo sütununuSELECTtercih eder (ile aynı).HAVING
Örnekler
> 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
Alan ayıklama ve ad çözümleme önceliği
gibi a.b bir nitelenmiş ad veya HAVINGiçinde ORDER BY kullanıldığında, yukarıdaki öncelik kuralları geçerli olmaya devam ediyor, ancak ek olarak dikkat edilmesi gereken bir nokta var: tercih edilen aday yapı alanını veya eşleme anahtarı ayıklamayı desteklemelidir. Aksi takdirde, bunun yerine diğer aday kullanılır.
Örneğin, diğer ad a düz olarak çözümleniyorsa ancak tablo sütunu INT ile alanıysa aSTRUCT, x bir alan diğer addan ORDER BY ayıklanamadığından sütunu seçer STRUCTINT. Buna karşılık, tablo sütunu düz INT ve diğer adı ise STRUCTHAVING bir ise, alan ayıklama için diğer adına geri döner.
Örnekler
-- 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}
Sınırlamalar
Databricks SQL ve Databricks Runtime 20.0 ve üzerinde, iç içe korelasyon (doğrudan ana sorgusunun ötesinde bir sorgunun sütunlarına referans veren alt sorgu) desteklenir ve aşağıdaki sınırlamalarla desteklenir:
- İç içe korelasyon, bir
HAVINGmaddedeki alt sorgular için desteklenmez. - Bir
LATERALalt sorgu iç içe korelasyon yapılamaz. Dış referansları doğrudan ekleyen sorguya çözüm bulmalıdır.
20.0 altındaki Databricks Çalışma Zamanı sürümlerinde, korelasyon tek bir seviyeyle sınırlıdır: bir alt sorgu, yalnızca hemen onu kaplayan sorgudan sütunlara referans verebilir.
Örnekler
-- 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
Tablo ve görünüm çözünürlüğü
tablo başvurusu içindeki bir tanımlayıcı aşağıdakilerden herhangi biri olabilir:
- Unity Kataloğu veya Hive Meta Veri Deposu'nda kalıcı tablo veya görünüm
- Ortak tablo ifadesi (CTE)
- Geçici görünüm veya geçici tablo
Tanımlayıcının çözümlenmesi, tanımlayıcının uygun olup olmamasına bağlıdır:
Kalifiye
Tanımlayıcı üç bölümle tam olarak nitelenmişse:
catalog.schema.relation, benzersizdir.Tanımlayıcı iki bölümden oluşuyorsa:
schema.relation, benzersiz hale getirmek içinSELECT current_catalog()sonucuyla daha da nitelenmiş olur.Şema ise
session, geçici görünüm veya geçici tablo olarak daha da nitelendirilirsystemve yorumlanır. Eğer şema iseglobal_temp, Databricks Çalışma Zamanında küresel geçici görünüm olarak daha da nitelendirilirsystemve yorumlanır.Vasıfsız
Ortak tablo ifadesi
Başvuru bir
WITHyan tümcesi kapsamındaysa, tanımlayıcıyı öncelikle içinde bulunduğuWITHyan tümcesiyle başlayan ve ardından dışarı doğru ilerleyen bir CTE ile eşleştirin.Şema arama yolu
Databricks SQL ve Databricks Runtime 19 ve üzerinde, PATH'teki her şema ile ilişkiyi sırayla niteleyebilir, ta ki bir eşleşme bulunana kadar.
- Eksik kataloglar veya şemalar: Yolda eksik kataloglar veya şemalar atlanır. Kullanıcının yeterli ayrıcalığı olmayan bir nesne atlanmaz; Azure Databricks ilgili hatayı oluşturur.
-
Geçici görünümler ve tablolar: Geçici görünümler ve geçici tablolar
system.session,system.sessionPATHyani . -
Mevcut şemadaki kalıcı tablolar ve görünümler: Sürekli tablolar ve mevcut şemadaki görünümler sanal
CURRENT_SCHEMAgiriş aracılığıyla ulaşılır.
Bu yol, sorgularda ve DML'de niteliksiz ilişki adlarına ve DDL ifadesinin parçası olan bir sorgudaki niteliksiz isimlere uygulanır.
Yolun uygulandığı yer:
Context Kullanılan yol Sorgular ve DML ( SELECT,INSERT,UPDATEDELETE, ,MERGE)Oturum YOLU AS'ninCREATE TABLE sorgusu Oturum YOLU Kalıcı bir sorgu CREATE VIEW PATH oluşturulma zamanında yakalanıyor Konu CREATE,DROP,ALTER, ve benzericurrent_catalog.current_schema(yol arama değil)Önceki sürümler: Databricks Runtime 18 ve altında, bir KTE olmayan niteliksiz bir ilişki sabit bir sırayla çözülür.
Geçici görünüm veya geçici tablo
Tanımlayıcıyı geçerli oturum içinde tanımlanan herhangi bir geçici görünüm veya geçici tabloyla eşleştirin.
Kalıcı tablo
SELECT current_catalog()veSELECT current_schema()sonucunu önceden beklemeye alarak tanımlayıcıyı tam olarak niteleyin ve kalıcı bir ilişki olarak arayın.
İlişki herhangi bir tablo, görünüm veya CTE ile çözülemezse Databricks TABLE_OR_VIEW_NOT_FOUND hatası oluşturur.
Ele geçirilen yol
Kalıcı bir görünüm, oturum PATH'ı oluşturma zamanında yakalar. View'un sonraki sorguları, niteliksiz isimleri ele geçirilen yola göre çözer, çağıranın oturum yoluna değil.
current_path() ve current_schema() bu sorguda yine çağırıcının oturum değerlerini döndürür.
Örnekler
-- 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.
Fonksiyon ve prosedür çözümlemesi
Rutin bir referans (fonksiyon çağrısı veya prosedür çağrısı), zorunlu parantez kümesi ile tanınır.
Şu çözümlenebilir:
- Azure Databricks tarafından sağlanan yerleşik bir işlev,
- Kapsamı geçerli oturum olarak belirlenmiş geçici bir kullanıcı tanımlı işlev veya
- Hive Metastore veya Unity Kataloğunda saklanan kalıcı bir kullanıcı tanımlı fonksiyon veya prosedür.
Bir rutin ismin çözümü, niteliklendirilip nitelendirilmediğine bağlıdır:
Kalifiye
Ad üç bölümle tam olarak nitelenmişse:
catalog.schema.routinebenzersizdir.Ad, iki bölümden oluşuyorsa ve benzersiz hale getirilmek isteniyorsa,
schema.routinesonucuylaSELECT current_catalog()ile daha da tanımlanır.Şema ise
session, ayrıca geçici bir fonksiyon olaraksystemnitelendirilir ve yorumlanır.Rutin daha sonra katalogda araştırılır.
Vasıfsız
- Şema arama yolu: Databricks SQL ve Databricks Runtime 19 ve üzerinde, rutin adı PATH'teki her şema sırasıyla nitelendirilir ve ilk eşleşmeyi seçer.
- Eksik kataloglar veya şemalar: Yolda eksik kataloglar veya şemalar atlanır. Kullanıcının yeterli ayrıcalığı olmayan bir nesne atlanmaz; Azure Databricks ilgili hatayı oluşturur.
-
Rutinlerin yaşadığı yer: Yerleşik skaler ve tablo fonksiyonları
system.builtin, AI fonksiyonları ,system.aigeçici fonksiyonlar ise .system.session -
Varsayılan yol: Varsayılan
PATHsystem.session, sonrasystem.builtin,system.aisonra , sonraCURRENT_SCHEMA.
Warning
Yerleşik fonksiyonlarla
system.sessionaynı adlı geçici fonksiyonlar, varsayılan yolda öncedensystem.builtingeldiği için önceliklidir. Yolu PATHSET ile yeniden sıralayabilirsiniz. Geçici fonksiyonlara, yerleşik fonksiyonlara gölge vermeyin.Yolun uygulandığı yer:
Context Kullanılan yol Sorgularda ve DML'de niteliksiz rutin isimler Oturum YOLU SQL kullanıcı tanımlı fonksiyonun gövdesi PATH oluşturulma zamanında yakalanıyor Bir SQL SECURITY DEFINERprosedürün gövdesiPATH oluşturulma zamanında yakalanıyor, system.sessionBir SQL SECURITY INVOKERprosedürün gövdesiArayanların canlı PATH Konu CREATE FUNCTION,DROP FUNCTION,CREATE PROCEDURE, ve benzeriGüncel şema (yol arama değil) Önceki sürümler: Databricks Runtime 18 ve altında, Azure Databricks sabit bir öncelik sırasına sahiptir.
Yerleşik işlev
Yerleşik işlevler kümesi arasında bu ada sahip bir işlev varsa, bu işlev seçilir.
Geçici işlev
Geçici işlevler kümesi arasında bu ada sahip bir işlev varsa, bu işlev seçilir.
Kalıcı işlev
SELECT current_catalog()veSELECT current_schema()sonucunu önceden beklemeye alarak işlev adını tam olarak niteleyin ve bunu kalıcı bir işlev olarak arayın.
Eğer rutin çözülemezse, Azure Databricks bir UNRESOLVED_ROUTINE hata oluşturur.
Ele geçirilen yol
-
SQL kullanıcı tanımlı fonksiyon: Gövdedeki niteliksiz isimler, çağırıcının oturum yoluna değil, , noktasında CREATE FUNCTIONyakalanan PATH ile çözülür.
current_path()vecurrent_schema()o bedende yine çağırıcının oturum değerlerini döndürür. -
Prosedür
SQL SECURITY DEFINER: Niteliksiz isimler, CREATE PROCEDURE'da yakalanan PATH ile çözülür,system.sessionçıkarılır.current_path()o bedende aynı yakalanan yolu geri döner. -
Prosedür:
SQL SECURITY INVOKERNiteliksiz isimler arayanların canlı yolunu kullanır.
Örnekler
> 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