이름 해결

적용 대상:체크 표시된 예 Databricks SQL 체크 표시된 예 Databricks Runtime

이름 해석은 식별자가 특정 열, 필드, 매개 변수 또는 테이블 참조로 해결되는 과정입니다.

열, 필드, 매개변수 및 변수 확인

식의 식별자는 다음 중 하나에 대한 참조일 수 있습니다.

이름 확인에는 다음 원칙이 적용됩니다.

  • 가장 가깝게 일치하는 참조가 승리합니다.
  • 열과 매개변수가 필드와 키보다 우선합니다.

구체적으로 특정 참조에 대한 식별자 확인은 다음 규칙을 순서대로 따릅니다.

  1. 로컬 참조

    1. 열 참조

      자격이 있을 수 있는 식별자를 의 FROM clause과 열 이름에 맞춥니다.

      일치하는 항목이 두 개 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류가 발생합니다.

    2. 매개 변수가 없는 함수 참조

      식별자가 특정되지 않고 current_user, current_date또는 current_timestamp와 일치하면: 이러한 함수 중 하나로 해결합니다.

    3. 열 기본값 사양

      식별자가 정규화되지 않았고 default과 일치하며 UPDATE SET, INSERT VALUES, 또는 MERGE WHEN [NOT] MATCHED컨텍스트에서 전체 표현식을 구성하는 경우: 해당 DEFAULT, INSERT, 또는 UPDATE의 대상 테이블의 MERGE 값으로 해석합니다.

    4. 구조체 필드 또는 맵 키 참조

      식별자가 수식된 경우, 다음 단계에 따라 필드 또는 맵 키와 일치하도록 하려고 합니다.

      A. 마지막 식별자를 제거하고 필드 또는 키로 처리합니다. B. 나머지를 의 FROM clause 열과 맞춥니다.

      일치하는 항목이 두 개 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류가 발생합니다.

      일치 항목이 있고 열이 다음과 같다면:

      • STRUCT: 필드를 일치시킵니다.

        필드를 일치시킬 수 없으면 FIELD_NOT_FOUND 오류를 발생시킵니다.

        필드가 둘 이상인 경우 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.

      • MAP: 키가 조건이 붙은 경우 오류를 발생시킵니다.

        키가 실제로 맵에 없는 경우 런타임 오류가 발생할 수 있습니다.

      • 기타 형식: 오류를 발생시킵니다. C. 이전 단계를 반복하여 후행 식별자를 필드에서 제거합니다. 열로 해석할 식별자가 남아 있는 동안 규칙(A) 및 (B)를 적용합니다.

  2. 측면 열 알리아싱

    적용 대상:확인 표시 있음 Databricks SQL 확인 표시 있음 Databricks Runtime 12.2 LTS 이상

    표현식이 SELECT 목록 내에 있으면, 해당 목록의 앞선 SELECT과 선행 식별자를 일치시킵니다.

    일치하는 항목이 두 개 이상 있으면 AMBIGUOUS_LATERAL_COLUMN_ALIAS 오류가 발생합니다.

    나머지 각 식별자를 필드 또는 맵 키로 일치시키고, 일치시킬 수 없는 경우 FIELD_NOT_FOUND 또는 AMBIGUOUS_COLUMN_OR_FIELD 오류를 발생시킵니다.

  3. 상관 관계

    • 옆의

      쿼리 앞에 LATERAL 키워드가 있는 경우, 쿼리를 포함하고 FROM앞에 위치한 LATERAL 테이블 참조를 고려하여 규칙 1.a 및 1.d를 적용합니다.

    • 일반

      쿼리가 스칼라 하위 쿼리이거나 IN 또는 EXISTS 하위 쿼리인 경우, 포함된 쿼리의 FROM 절에서 테이블 참조를 고려하여 규칙 1.a, 1.d 및 2를 적용하십시오.

  4. 중첩된 상관 관계

    적용 대상:체크 체크 완료 예 Databricks SQL 체크 완료 Databricks 런타임 20.0 이상

    규칙 3을 다시 적용하여 쿼리의 중첩 수준을 반복하여 식별자가 즉시 포함하는 쿼리뿐만 아니라 모든 인포링 쿼리의 상관된 참조로 해석될 수 있도록 합니다.

  5. FOR 루프

    문장이 FOR 루프에 포함된 경우:

    A. 식별자를 FOR 루프 문 쿼리의 열에 맞춥니다. 식별자가 정규화된 경우 한정자는 정의된 경우 FOR 루프 변수의 이름과 일치해야 합니다. B. 식별자가 정규화된 경우 규칙 1.c에 따라 매개 변수의 필드 또는 맵 키와 일치시킵니다.

  6. 복합 문장

    복합 문장에 문이 포함된 경우:

    A. 식별자를 해당 복합 문에 선언된 변수와 일치합니다. 식별자가 정규화된 경우, 복합 문의 레이블이 정의되었다면 한정자는 그 레이블과 일치해야 합니다. B. 식별자가 정규화된 경우, 규칙 1.c에 따라 변수가 특정한 필드나 맵 키에 일치하도록 합니다.

  7. 중첩 복합문 또는 FOR 루프

    규칙 5와 6을 다시 적용하여 복합 문의 계층적 중첩 수준을 반복적으로 처리합니다.

  8. 루틴 매개 변수

    이 식이 CREATE FUNCTION 또는 CREATE PROCEDURE 문에 포함되는 경우:

    1. 식별자를 매개 변수 이름에 일치시키세요. 식별자가 정규화된 경우 한정자는 루틴의 이름과 일치해야 합니다.
    2. 식별자가 정규화된 경우 규칙 1.c에 따라 매개 변수의 필드 또는 맵 키와 일치시킵니다.
  9. 세션 변수

    1. 식별자를 변수 이름에 맞추세요. 식별자가 정규화된 경우 한정자는 session 또는 system.session합니다. Databricks SQL 및 Databricks Runtime 19 이상에서는 자격 없는 식별자는 PATH에 있을 때만 system.session 세션 변수와 일치합니다.
    2. 식별자가 정규화된 경우, 규칙 1.c에 따라 변수가 특정한 필드나 맵 키에 일치하도록 합니다.

의 이름 확인 HAVING및 ORDER BYQUALIFY

, HAVING및 ORDER BY 절은 QUALIFY목록의 이름과 SELECT 기본 테이블의 열을 참조할 수 있습니다. 이러한 절 중 하나의 이름이 목록의 열 별칭 SELECT 과 테이블 열 모두와 일치하는 경우 절은 모호성을 다르게 해결합니다.

  • ORDER BY는 테이블 열보다 목록 별칭을 선호합니다.SELECT
  • HAVING는 목록 별칭보다 SELECT 선호합니다.
  • QUALIFY는 목록 별칭(예: )보다 SELECTHAVING 선호합니다.

예제

> 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

필드 추출 및 이름 확인 우선 순위

정규화된 이름(예: a.b 위)이 사용되는 HAVINGORDER BY경우 위의 우선 순위 규칙이 계속 적용되지만 추가 고려 사항이 있습니다. 기본 후보는 구조체 필드 또는 지도 키 추출을 지원해야 합니다. 그렇지 않으면 다른 후보가 대신 사용됩니다.

예를 들어 별칭이 일반 a 으로 확인되지만 테이블 열 INT 이 with 필드인 a 경우 별칭에서 STRUCT 필드를 xORDER BY 추출할 수 없으므로 열을 선택합니다STRUCT.INT 반대로 테이블 열이 일반 INT 이고 별칭이면 STRUCTHAVING 필드 추출의 별칭으로 돌아갑니다.

예제

-- 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}

제한 사항

Databricks SQL 및 Databricks Runtime 20.0 이상에서는 중첩 상관관계(상위 쿼리를 넘어 포함하는 쿼리의 열을 참조하는 하위 쿼리)를 지원하며, 다음과 같은 제한이 있습니다:

  • 절 내 HAVING 하위 쿼리에는 중첩 상관관계가 지원되지 않습니다.
  • 서브쿼리는 LATERAL 중첩 상관관계가 될 수 없습니다. 외부 참조는 직접 인접하는 쿼리로 해결되어야 합니다.

Databricks 런타임 버전 20.0 이하에서는 상관관계가 단일 수준으로 제한됩니다: 서브쿼리는 즉시 자신을 포함하는 쿼리의 열만 참조할 수 있습니다.

예제

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

테이블 및 뷰 해상도

테이블 참조의 식별자은 다음 중 하나일 수 있습니다.

  • Unity 카탈로그 또는 Hive 메타스토어에 저장된 영구 테이블 또는 뷰
  • 공통 테이블 표현식 (CTE)
  • 임시 뷰 또는 임시 테이블

식별자의 확인은 자격이 있는지 여부에 따라 달라집니다.

  • 자격이 있는

    식별자가 세 부분으로 정규화된 경우, 예를 들어 catalog.schema.relation, 고유합니다.

    식별자가 schema.relation으로 두 부분으로 구성되어 있을 경우, 고유하게 되도록 SELECT current_catalog() 결과로 추가로 특정하게 만듭니다.

    스키마가 이라 session면 임시 뷰 또는 임시 테이블로 추가로 제한 system 되고 해석됩니다. 스키마가 이라 global_temp면 Databricks Runtime에서 전역 임시 뷰로 추가로 해석 system 됩니다.

  • 자격이 없는

    1. 공통 테이블 식

      참조가 WITH 절의 범위 내에 있는 경우, 식별자를 CTE와 매칭하기 위해 먼저 즉시 포함하는 WITH 절에서 시작하여 그곳에서부터 바깥쪽으로 이동합니다.

    2. 스키마 탐색 경로

      Databricks SQL 및 Databricks Runtime 19 이상에서는 PATH의 각 스키마와의 관계를 순서대로 조정하여 일치하는 것을 찾을 때까지 조정합니다.

      • 누락된 카탈로그 또는 스키마: 경로 내 누락된 카탈로그나 스키마는 건너뛸 수 있습니다. 사용자가 권한이 부족한 객체는 건너뛰지 않습니다; Azure Databricks는 해당 오류를 발생시킵니다.
      • 임시 뷰와 테이블: 임시 뷰와 임시 테이블은 에 존재system.session하므로, 가 에 있을 PATH때마다 system.session 도달할 수 있습니다.
      • 현재 스키마의 영속 테이블 및 뷰: 현재 스키마의 영속 테이블과 뷰는 가상 CURRENT_SCHEMA 항목을 통해 접근할 수 있습니다.

      이 경로는 쿼리와 DML에서 제한이 없는 관계 이름과 DDL 문장의 일부인 쿼리의 무제한 이름에 적용됩니다.

      • 경로가 적용되는 경우:

        Context 사용 경로
        쿼리 및 DML (SELECT, INSERT, UPDATE, DELETE, ) MERGE 세션 경로
        AS의CREATE TABLE 쿼리 세션 경로
        영속성의 쿼리 CREATE VIEW 생성 시점에 캡처된 PATH
        , , ALTER, , 그리고 유사한 주제 CREATEDROP current_catalog.current_schema (경로 조회가 아닙니다)
      • 이전 버전: Databricks Runtime 18 이하에서는 CTE가 아닌 무제한 관계가 고정된 순서로 해결됩니다.

        1. 임시 뷰 또는 임시 테이블

          식별자를 현재 세션 내에 정의된 임시 뷰 또는 임시 테이블과 일치합니다.

        2. 지속형 테이블

          SELECT current_catalog() 및 SELECT current_schema()의 결과를 앞에 붙여 식별자를 완전히 구성하고, 그것을 영구 관계로 조회합니다.

관계를 테이블, 뷰 또는 CTE로 확인할 수 없으면 Databricks에서 TABLE_OR_VIEW_NOT_FOUND 오류가 발생합니다.

캡처된 경로

영구 뷰는 생성 시점의 세션 PATH를 캡처합니다. 뷰의 후속 쿼리는 해당 캡처된 경로에 대해 무제한 이름을 해석하며, 호출자의 세션 경로에 대해 해석하지 않습니다. current_path() current_schema() 그리고 그 쿼리에서도 여전히 호출자의 세션 값을 반환합니다.

예제

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

기능 및 절차 해결

루틴 참조(함수 호출 또는 프로시저 호출)는 필수 뒤쪽 괄호 집합으로 인식됩니다.

다음과 같이 해결할 수 있습니다.

  • Azure Databricks에서 제공하는 기본 제공 함수,
  • 현재 세션으로 범위가 지정된 임시 사용자 정의 함수 또는
  • Hive Metastore 또는 Unity 카탈로그에 저장되는 지속성 사용자 정의 함수 또는 절차입니다.

루틴 이름의 해결은 그것이 자격을 갖추었는지에 따라 달라집니다:

  • 자격이 있는

    이름이 세 부분(catalog.schema.routine)으로 정규화된 경우 고유합니다.

    이름이 schema.routine의 두 부분으로 구성된 경우 고유하게 만들기 위해 SELECT current_catalog()의 결과로 추가로 한정됩니다.

    스키마가 이라 session면 임시 함수로 추가로 수식 system 되어 해석됩니다.

    그 후 루틴은 카탈로그에서 찾아봅니다.

  • 자격이 없는

    • 스키마 검색 경로: Databricks SQL 및 Databricks Runtime 19 이상에서 PATH 의 각 스키마와 루틴 이름을 순서대로 조정한 후 첫 번째 일치 항목을 선택합니다.
    • 누락된 카탈로그 또는 스키마: 경로 내 누락된 카탈로그나 스키마는 건너뛸 수 있습니다. 사용자가 권한이 부족한 객체는 건너뛰지 않습니다; Azure Databricks는 해당 오류를 발생시킵니다.
    • 루틴이 존재하는 곳: 내장된 스칼라 및 테이블 함수는 , system.builtinAI 함수 system.ai는 , 임시 함수 system.session는 에 위치해 있습니다.
    • 기본 경로: 기본값 PATH 은 system.session, 그리고 system.builtin, system.ai그리고 , 그리고 CURRENT_SCHEMA입니다.

    Warning

    내장 함수와 같은 이름의 임시 함수가 우선권을 가지는데, 이는 기본 경로에서 우선 system.builtin 순위가 되기 때문입니다system.session. PATH로SET 경로를 재정렬할 수 있습니다. 임시 함수에 의존하지 마세요.

    • 경로가 적용되는 경우:

      Context 사용 경로
      쿼리와 DML에서의 무제한 루틴 이름 세션 경로
      SQL 사용자 정의 함수의 본문 생성 시점에 캡처된 PATH
      절차 본문 SQL SECURITY DEFINER 생성 시점에 캡처된 PATH는 system.session
      절차 본문 SQL SECURITY INVOKER 발신자의 라이브 PATH
      , , CREATE PROCEDURE, , 그리고 유사한 주제 CREATE FUNCTIONDROP FUNCTION 현재 스키마 (경로 조회 기능이 아님)
    • 이전 버전: Databricks Runtime 18 이하에서는 Azure Databricks가 고정된 우선순위를 따릅니다.

      1. 내장 함수

        이 이름의 함수가 기본 제공 함수 집합에 있으면 해당 함수가 선택됩니다.

      2. 임시 함수

        이 이름의 함수가 임시 함수 집합에 있으면 해당 함수가 선택됩니다.

      3. 지속형 함수

        SELECT current_catalog() 및 SELECT current_schema() 결과를 미리 보류하여 함수 이름을 정규화하고 영구 함수로 조회합니다.

루틴을 해결할 수 없으면 Azure Databricks가 오류를 발생시킵니다UNRESOLVED_ROUTINE.

캡처된 경로

  • SQL 사용자 정의 함수: 본문 내 무제한 이름은 호출자의 세션 경로가 아닌 에서 캡처된 CREATE FUNCTIONPATH에 대해 해석됩니다. current_path() current_schema() 그리고 그 몸에서는 여전히 호출자의 세션 값을 반환합니다.
  • 절차 : SQL SECURITY DEFINERCREATE PROCEDUREsystem.session에서 캡처된 PATH에 대해 무제한 이름은 생략하여 해석됩니다. current_path() 그 몸에서는 같은 포획된 경로를 되돌려줍니다.
  • 절차: SQL SECURITY INVOKER자격 없는 이름은 발신자의 실시간 경로를 사용합니다.

예제

> 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