Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:
Databricks SQL
Databricks Runtime
Překlad názvů je proces, pomocí kterého se identifikátory překládají na konkrétní sloupec, pole, parametr nebo odkazy na tabulky.
Rozlišení sloupců, polí, parametrů a proměnných
Identifikátory ve výrazech můžou být odkazy na některou z následujících možností:
- Název sloupce založený na zobrazení, tabulce, společném tabulkovém výrazu (CTE) nebo column_alias.
- Název pole nebo klíč mapování v rámci struktury nebo mapy. Pole a klíče nemohou být nikdy nekvalifikovány.
- Název parametruuživatelem definované funkce SQL nebo procedury SQL
- Místní název proměnné relace nebo skriptu SQL název proměnné.
- Zvláštní funkce, jako je
current_usernebocurrent_date, která nevyžaduje použití(). - Klíčové
DEFAULTslovo, které se používá v kontextuINSERT,UPDATE,MERGEneboSET VARIABLEk nastavení sloupce nebo proměnné hodnoty na výchozí.
Rozlišení názvů používá následující principy:
- Nejbližší odpovídající referenční bod vyhrává a
- Sloupce a parametry mají přednost před poli a klíči.
Podrobné rozlišení identifikátorů na konkrétní odkaz se řídí těmito pravidly v tomto pořadí:
Místní odkazy
Odkaz na sloupec
Porovnejte identifikátor, který může být kvalifikovaný, s názvem sloupce v referenci na tabulku
FROM clause.Pokud existuje více takových shod, bude vyvolána chyba AMBIGUOUS_COLUMN_OR_FIELD.
Referenční informace k funkcím bez parametrů
Pokud je identifikátor nekvalifikovaný a odpovídá
current_user,current_datenebocurrent_timestamp: Přeložte ho jako jednu z těchto funkcí.Specifikace DEFAULT sloupce
Pokud je identifikátor nekvalifikovaný, odpovídá
defaulta tvoří celý výraz v kontextu objektuUPDATE SET,INSERT VALUESneboMERGE WHEN [NOT] MATCHED, vyřešit jako odpovídající hodnotuDEFAULTcílové tabulkyINSERT,UPDATEneboMERGE.Odkaz na pole struktury nebo mapovací klíč
Pokud je identifikátor kvalifikovaný, snažte se ho spárovat s polem nebo mapovacím klíčem podle následujících kroků:
A. Odeberte poslední identifikátor a zacházejte s ním jako s polem nebo klíčem. B. Porovnej zbytek se sloupcem v odkazu na tabulku
FROM clause.Pokud existuje více takových shod, bude vyvolána chyba AMBIGUOUS_COLUMN_OR_FIELD.
Pokud existuje shoda a sloupec je následující:
STRUCT: Porovná pole.Pokud pole nelze spárovat, vyvolejte chybu FIELD_NOT_FOUND.
Pokud existuje více než jedno pole, vyvolejte chybu AMBIGUOUS_COLUMN_OR_FIELD.
MAP: Vyvolání chyby, pokud je klíč kvalifikovaný.K chybě za běhu může dojít v případě, že klíč není ve skutečnosti v mapě.
Jakýkoli jiný typ: Vyvolání chyby C. Opakováním předchozího kroku odeberte koncový identifikátor jako pole. Použijte pravidla (A) a (B), zatímco existuje identifikátor, který se má interpretovat jako sloupec.
Boční aliasování sloupců
Platí pro:
Databricks SQL
Databricks Runtime 12.2 LTS a vyššíPokud je výraz v
SELECTseznamu, shodujte počáteční identifikátor s předchozím aliasem sloupce v danémSELECTseznamu.Pokud existuje více takových shod, vyvolá se chyba AMBIGUOUS_LATERAL_COLUMN_ALIAS.
Porovná každý zbývající identifikátor buď jako pole nebo klíč mapy a vyvolá chybu FIELD_NOT_FOUND nebo AMBIGUOUS_COLUMN_OR_FIELD, pokud se neshodují.
Korelace
BOČNÍ
Pokud dotazu předchází klíčové slovo
LATERAL, použijte pravidla 1.a a 1.d s ohledem na odkazy na tabulku vFROMobsahujícím dotaz a předLATERAL.Běžný
Pokud je dotaz skalární poddotaz,
INneboEXISTSpoddotaz použijte pravidla 1.a, 1.d a 2 s ohledem na odkazy na tabulku v klauzuli obsahující dotazFROM.
Vnořená korelace
Platí na:
, Databricks SQL
, Databricks Runtime 20.0 a výšeZnovu aplikujte pravidlo 3, tedy iterujte přes úrovně vnoření dotazu, aby identifikátor mohl být vyřešení korelované reference v jakémkoli uzavřeném dotazu, nejen v tom bezprostředně uzavírajícím.
-
Pokud je příkaz obsažený ve smyčce
FOR:A. Přiřaďte identifikátor ke sloupci v dotazu smyčky
FOR. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat názvu proměnné smyčky FOR, pokud je definován. B. Pokud je identifikátor kvalifikovaný, přiřaďte k poli nebo klíči mapy parametru podle pravidla 1.c. -
Pokud je příkaz obsažen ve složeném příkazu:
A. Porovná identifikátor s proměnnou deklarovanou v daném složeného příkazu. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat popisku složeného příkazu, pokud byl definován. B. Pokud je identifikátor kvalifikovaný, přiřaďte ho poli nebo mapovému klíči proměnné podle pravidla 1.c.
vnořený složený příkaz nebo smyčka
FORZnovu použijte pravidla 5 a 6, provádějte iterace přes úrovně vnoření složeného příkazu.
Rutinní parametry
Pokud je výraz součástí CREATE FUNCTION příkazu NEBO CREATE PROCEDURE :
- Přiřaďte identifikátor k názvu parametru. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat názvu rutiny.
- Pokud je identifikátor kvalifikovaný, přiřaďte k poli nebo klíči mapy parametru podle pravidla 1.c.
proměnné relace
- Přiřaďte identifikátor k názvu proměnné. Pokud je identifikátor kvalifikovaný, musí být
sessionnebosystem.session. V Databricks SQL a Databricks Runtime 19 a výše se neomezený identifikátor shoduje s relační proměnnou pouze tehdy, pokudsystem.sessionje na PATH. - Pokud je identifikátor kvalifikovaný, přiřaďte ho poli nebo mapovému klíči proměnné podle pravidla 1.c.
- Přiřaďte identifikátor k názvu proměnné. Pokud je identifikátor kvalifikovaný, musí být
Překlad názvů v HAVING, ORDER BYa QUALIFY
Klauzule HAVING, ORDER BYa QUALIFY klauzule mohou odkazovat na názvy ze SELECT seznamu a také sloupce z podkladových tabulek. Pokud název v jedné z těchto klauzulí odpovídá aliasu sloupce v SELECT seznamu i sloupci tabulky, klauzule přeloží nejednoznačnost odlišně:
-
ORDER BYSELECTupřednostňuje alias seznamu před sloupcem tabulky. -
HAVINGupřednostňuje sloupec tabulky před aliasemSELECTseznamu. -
QUALIFYupřednostňuje sloupec tabulky před aliasemSELECTseznamu (stejný jakoHAVING).
Příklady
> 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
Priorita extrakce polí a překladu názvů
Při použití kvalifikovaného názvu, například a.b v HAVING nebo ORDER BY, platí výše uvedená pravidla priority, ale s dalšími aspekty: upřednostňovaný kandidát musí podporovat pole struktury nebo extrakci mapového klíče. Pokud tomu tak není, použije se místo toho druhý kandidát.
Pokud se například alias a přeloží na prostýINT, ale sloupec a tabulky je STRUCT pole s polem x, vybere ORDER BY sloupec, STRUCT protože pole nelze z aliasu INT extrahovat. Naopak pokud je sloupec tabulky prostý INT a alias je , STRUCTHAVING vrátí se k aliasu pro extrakci polí.
Příklady
-- 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}
Omezení
V Databricks SQL a Databricks Runtime 20.0 a novějších je podporována vnořená korelace (poddotaz, který odkazuje na sloupce z uzavřeného dotazu mimo jeho bezprostřední rodič) s následujícími omezeními:
- Vnořená korelace není podporována pro poddotazy v klauzuli
HAVING. -
LATERALPoddotaz nelze vnořeně korelovat. Jeho vnější odkazy musí být vyřešeny přímo obklopujícím dotazem.
Ve verzích Databricks Runtime pod 20.0 je korelace omezena na jednu úroveň: poddotaz může odkazovat pouze na sloupce z dotazu, který jej bezprostředně obklopuje.
Příklady
-- 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
Rozlišení tabulky a zobrazení
Identifikátor v table-reference může být jakýkoli z následujících:
- Trvalá tabulka nebo zobrazení v Unity Catalogu nebo Hive Metastore
- Běžný tabulkový výraz (CTE)
- Dočasné zobrazení nebo dočasná tabulka
Řešení identifikátoru závisí na tom, jestli je kvalifikovaný:
Kvalifikovaný
Pokud je identifikátor plně kvalifikovaný se třemi částmi:
catalog.schema.relationje jedinečný.Pokud se identifikátor skládá ze dvou částí:
schema.relationje dále kvalifikovaný s výsledkemSELECT current_catalog(), aby byl jedinečný.Pokud je schéma ,
sessiondále se kvalifikuje asysteminterpretuje jako dočasný pohled nebo dočasná tabulka. Pokud je schéma ,global_tempdále je kvalifikováno asysteminterpretováno jako globální dočasný pohled v Databricks Runtime.Nekvalifikovaný
Běžný výraz tabulky
Pokud je odkaz v rozsahu
WITHklauzule, shodujte identifikátor s CTE, který začíná okamžitě obsahujícíWITHklauzulí a přechází směrem odsud.Cesta po vyhledávání schématu
V Databricks SQL a Databricks Runtime 19 a výše kvalifikujte vztah s každým schématem na PATH v pořadí, dokud se nenajde shoda.
- Chybějící katalogy nebo schémata: Chybějící katalogy nebo schémata na cestě jsou přeskočeny. Objekt, pro který uživatel nemá dostatečná oprávnění, není přeskočen; Azure Databricks vyvolá odpovídající chybu.
-
Dočasné pohledy a tabulky: Dočasné pohledy a dočasné tabulky se nacházejí v
system.session, takže jsou dosaženy kdykolisystem.sessionje na .PATH -
Perzistentní tabulky a pohledy v aktuálním schématu: Persistentní tabulky a pohledy v aktuálním schématu jsou dostupné prostřednictvím virtuálního
CURRENT_SCHEMAzáznamu.
Cesta se vztahuje na neomezená jména relací v dotazech a DML, a na nekvalifikovaná jména v dotazu, který je součástí DDL příkazu.
Kde se cesta uplatňuje:
Context Použitá cesta Dotazy a DML ( SELECT,INSERT,UPDATE, ,DELETE)MERGESession PATH Dotaz ASCREATE TABLE Session PATH Dotaz na persistentní CREATE VIEW PATH zachycený při vytvoření Podmět , CREATEDROP,ALTER, a podobnýchcurrent_catalog.current_schema(není to hledání cesty)Starší verze: V Databricks Runtime 18 a nižších je neomezená relace, která není CTE, vyřešena v pevném pořadí.
Dočasné zobrazení nebo dočasná tabulka
Porovná identifikátor s jakýmkoli dočasným zobrazením nebo dočasnou tabulkou definovanou v rámci aktuální relace.
Perzistentní tabulka
Plně kvalifikujte identifikátor před čekáním na výsledek
SELECT current_catalog()aSELECT current_schema()vyhledejte ho jako trvalý vztah.
Pokud se relace nedá přeložit na žádnou tabulku, zobrazení nebo CTE, Databricks vyvolá chybu TABLE_OR_VIEW_NOT_FOUND .
Zajatá cesta
Perzistentní zobrazení zachycuje cestu relace při vytvoření. Pozdější dotazy na pohled vyřeší neomezená jména proti této zachycené cestě, nikoli vůči relační cestě vyvolávače.
current_path() a current_schema() v tomto dotazu stále vrací hodnoty relace vyvolávače.
Příklady
-- 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.
Funkce a procedurální řešení
Rutinní odkaz (volání funkce nebo procedury) je rozpoznán povinnou závěrečnou sadou závorek.
Může být vyřešeno na:
- Vestavěná funkce poskytovaná službou Azure Databricks
- Dočasná funkce definovaná uživatelem vymezená na aktuální relaci nebo
- Trvalá uživatelsky definovaná funkce nebo procedura uložená v Hive Metastore nebo Unity Catalog.
Rozlišení názvu rutiny závisí na tom, zda je kvalifikovaný:
Kvalifikovaný
Pokud je název plně kvalifikovaný se třemi částmi:
catalog.schema.routineje jedinečný.Pokud se název skládá ze dvou částí:
schema.routine, rozlišuje se výsledkemSELECT current_catalog(), aby byl jedinečný.Pokud je schéma ,
sessiondále se kvalifikuje asysteminterpretuje jako dočasná funkce.Rutina se pak vyhledá v katalogu.
Nekvalifikovaný
- Vyhledávací cesta schématu: V Databricks SQL a Databricks Runtime 19 a výše kvalifikujte název rutiny s každým schématem na PATH v pořadí a vyberte první shodu.
- Chybějící katalogy nebo schémata: Chybějící katalogy nebo schémata na cestě jsou přeskočeny. Objekt, pro který uživatel nemá dostatečná oprávnění, není přeskočen; Azure Databricks vyvolá odpovídající chybu.
-
Kde se nacházejí rutiny: Vestavěné skalární a tabulkové funkce žijí v ,
system.builtinAI funguje vsystem.ai, a dočasné funkce vsystem.session. -
Výchozí cesta: Výchozí
PATHjesystem.session, paksystem.builtin, paksystem.ai, pak .CURRENT_SCHEMA
Warning
Dočasné funkce se stejným názvem jako vestavěné mají přednost, protože
system.sessionna výchozí cestě jsou přednostsystem.builtin. Cestu můžete přeuspořádat pomocí SET PATH. Nespoléhejte se na dočasné funkce, které stínují vestavěné funkce.Kde se cesta uplatňuje:
Context Použitá cesta Neomezené názvy rutin v dotazech a DML Session PATH Tělo uživatelsky definované SQL funkce PATH zachycený při vytvoření Hlavní část zákroku SQL SECURITY DEFINERPATH zachycený při vytvoření, bez system.sessionHlavní část zákroku SQL SECURITY INVOKERŽivý PATH volajícího Podmět , CREATE FUNCTIONDROP FUNCTION,CREATE PROCEDURE, a podobnýchAktuální schéma (není hledání cesty) Starší verze: V Databricks Runtime 18 a nižších má Azure Databricks pevně dané pořadí přednosti.
Vestavěná funkce
Pokud funkce podle tohoto názvu existuje mezi sadou předdefinovaných funkcí, vybere se tato funkce.
Dočasná funkce
Pokud funkce podle tohoto názvu existuje mezi sadou dočasných funkcí, vybere se tato funkce.
Perzistentní funkce
Úplně kvalifikujte název funkce tím, že před něj umístíte výsledek
SELECT current_catalog()aSELECT current_schema()a vyhledejte ji jako trvalou funkci.
Pokud nelze rutinu vyřešit, Azure Databricks zobrazí chybuUNRESOLVED_ROUTINE.
Zajatá cesta
-
SQL uživatelsky definovaná funkce: Nekvalifikovaná jména v těle jsou vyřešena proti PATH zachycené v , CREATE FUNCTIONnikoli vůči relační cestě vyvolávače.
current_path()acurrent_schema()v tomto těle stále vracejí hodnoty relace vyvolávače. -
Postup s
SQL SECURITY DEFINER: Nekvalifikovaná jména jsou vyřešena proti PATH zachycené v CREATE PROCEDURE, přičemžsystem.sessionjsou vynechány.current_path()v tom těle se vrací stejnou zachycenou cestu. -
Postup s :
SQL SECURITY INVOKERNekvalifikovaná jména používají živou cestu volajícího.
Příklady
> 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