Řešení jmen

Platí pro:zaškrtnuté ano Databricks SQL zaškrtnuté ano 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_user nebo current_date, která nevyžaduje použití ().
  • Klíčové DEFAULT slovo, které se používá v kontextu INSERT, UPDATE, MERGEnebo SET VARIABLE k 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í:

  1. Místní odkazy

    1. Odkaz na sloupec

      Porovnejte identifikátor, který může být kvalifikovaný, s názvem sloupce v referenci na tabulkuFROM clause.

      Pokud existuje více takových shod, bude vyvolána chyba AMBIGUOUS_COLUMN_OR_FIELD.

    2. Referenční informace k funkcím bez parametrů

      Pokud je identifikátor nekvalifikovaný a odpovídá current_user, current_datenebo current_timestamp: Přeložte ho jako jednu z těchto funkcí.

    3. Specifikace DEFAULT sloupce

      Pokud je identifikátor nekvalifikovaný, odpovídá default a tvoří celý výraz v kontextu objektu UPDATE SET, INSERT VALUES nebo MERGE WHEN [NOT] MATCHED, vyřešit jako odpovídající hodnotu DEFAULT cílové tabulky INSERT, UPDATE nebo MERGE.

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

  2. Boční aliasování sloupců

    Platí pro:zaškrtnuto ano Databricks SQL zaškrtnuto ano Databricks Runtime 12.2 LTS a vyšší

    Pokud je výraz v SELECT seznamu, shodujte počáteční identifikátor s předchozím aliasem sloupce v daném SELECT seznamu.

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

  3. 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 v FROM obsahujícím dotaz a před LATERAL.

    • Běžný

      Pokud je dotaz skalární poddotaz, INnebo EXISTS poddotaz použijte pravidla 1.a, 1.d a 2 s ohledem na odkazy na tabulku v klauzuli obsahující dotaz FROM .

  4. Vnořená korelace

    Platí na:zaškrtnuté ano, Databricks SQL označeno ano, Databricks Runtime 20.0 a výše

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

  5. Smyčka FOR

    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.

  6. složený příkaz

    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.

  7. vnořený složený příkaz nebo smyčka FOR

    Znovu použijte pravidla 5 a 6, provádějte iterace přes úrovně vnoření složeného příkazu.

  8. Rutinní parametry

    Pokud je výraz součástí CREATE FUNCTION příkazu NEBO CREATE PROCEDURE :

    1. Přiřaďte identifikátor k názvu parametru. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat názvu rutiny.
    2. Pokud je identifikátor kvalifikovaný, přiřaďte k poli nebo klíči mapy parametru podle pravidla 1.c.
  9. proměnné relace

    1. Přiřaďte identifikátor k názvu proměnné. Pokud je identifikátor kvalifikovaný, musí být session nebo system.session. V Databricks SQL a Databricks Runtime 19 a výše se neomezený identifikátor shoduje s relační proměnnou pouze tehdy, pokud system.session je na PATH.
    2. Pokud je identifikátor kvalifikovaný, přiřaďte ho poli nebo mapovému klíči proměnné podle pravidla 1.c.

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 BY SELECT upřednostňuje alias seznamu před sloupcem tabulky.
  • HAVING upřednostňuje sloupec tabulky před aliasem SELECT seznamu.
  • QUALIFY upřednostňuje sloupec tabulky před aliasem SELECT seznamu (stejný jako HAVING).

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 .
  • LATERAL Poddotaz 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ýsledkem SELECT current_catalog() , aby byl jedinečný.

    Pokud je schéma , sessiondále se kvalifikuje a system interpretuje jako dočasný pohled nebo dočasná tabulka. Pokud je schéma , global_tempdále je kvalifikováno a system interpretováno jako globální dočasný pohled v Databricks Runtime.

  • Nekvalifikovaný

    1. Běžný výraz tabulky

      Pokud je odkaz v rozsahu WITH klauzule, shodujte identifikátor s CTE, který začíná okamžitě obsahující WITH klauzulí a přechází směrem odsud.

    2. 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 kdykoli system.session je 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_SCHEMA zá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) MERGE Session PATH
        Dotaz ASCREATE TABLE Session PATH
        Dotaz na persistentní CREATE VIEW PATH zachycený při vytvoření
        Podmět , CREATEDROP, ALTER, a podobných current_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í.

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

        2. Perzistentní tabulka

          Plně kvalifikujte identifikátor před čekáním na výsledek SELECT current_catalog() a SELECT 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ýsledkem SELECT current_catalog(), aby byl jedinečný.

    Pokud je schéma , sessiondále se kvalifikuje a system interpretuje 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 v system.ai, a dočasné funkce v system.session.
    • Výchozí cesta: Výchozí PATH je system.session, pak system.builtin, pak system.ai, pak .CURRENT_SCHEMA

    Warning

    Dočasné funkce se stejným názvem jako vestavěné mají přednost, protože system.session na výchozí cestě jsou přednost system.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 DEFINER PATH zachycený při vytvoření, bez system.session
      Hlavní část zákroku SQL SECURITY INVOKER Živý PATH volajícího
      Podmět , CREATE FUNCTIONDROP FUNCTION, CREATE PROCEDURE, a podobných Aktuá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.

      1. Vestavěná funkce

        Pokud funkce podle tohoto názvu existuje mezi sadou předdefinovaných funkcí, vybere se tato funkce.

      2. Dočasná funkce

        Pokud funkce podle tohoto názvu existuje mezi sadou dočasných funkcí, vybere se tato funkce.

      3. Perzistentní funkce

        Úplně kvalifikujte název funkce tím, že před něj umístíte výsledek SELECT current_catalog() a SELECT 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() a current_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.session jsou 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