다음을 통해 공유


Databricks 런타임의 ANSI 규정 준수

적용 대상:체크표시가 된 예 Databricks 런타임

이 문서에서는 Databricks Runtime의 ANSI 규정 준수에 대해 설명합니다. Databricks SQL의 ANSI 모드는 ANSI_MODE참조하세요.

Spark SQL에는 ANSI SQL 표준 준수를 지원하는 두 가지 옵션, spark.sql.ansi.enabledspark.sql.storeAssignmentPolicy가 있습니다.

spark.sql.ansi.enabledtrue로 설정되면 Spark SQL은 Hive 규격 대신 ANSI 규격 언어를 사용합니다. 예를 들어 Spark는 SQL 연산자/함수에 대한 입력이 잘못된 경우 null 결과를 반환하는 대신 런타임에 예외를 throw합니다. 일부 ANSI 언어 기능은 ANSI SQL 표준에서 직접 사용할 수 없지만 동작은 ANSI SQL 스타일과 일치합니다.

또한 Spark SQL에는 테이블에 행을 저장할 때 암시적 캐스팅 동작을 제어하는 독립적인 옵션이 있습니다. 캐스팅 동작은 표준의 저장소 할당 규칙으로 정의됩니다.

spark.sql.storeAssignmentPolicyANSI로 설정되면 Spark SQL가 ANSI 저장 할당 규칙을 준수합니다. 이 구성은 기본값이 ANSI이므로 별도의 구성이지만 spark.sql.ansi.enabled 구성은 기본적으로 사용하지 않도록 설정됩니다.

다음 표에서는 동작을 요약해서 보여 줍니다.

속성 이름 기본값 의미
spark.sql.ansi.enabled 거짓 true이면 Spark가 ANSI SQL 사양을 준수하려고 합니다.
  • 정수 또는 소수점 필드의 모든 작업에서 오버플로가 발생하는 경우 런타임 예외를 throw합니다.
  • ANSI SQL의 예약된 키워드를 SQL 파서의 식별자로 사용하는 것을 금지합니다.
spark.sql.storeAssignmentPolicy ANSI 다른 데이터 형식의 열에 값을 저장할 때 Spark는 형식 변환을 수행합니다. 형식 강제 변환 규칙에는 ANSI, legacy, strict의 세 가지 정책이 있습니다.
  • ANSI: Spark는 ANSI SQL에 따라 형식 강제 변환을 수행합니다. 실제로 동작은 PostgreSQL과 대부분 동일합니다. 문자열을 정수로 변환하거나 double을 부울로 변환하는 것과 같은 특정 불합리한 형식 변환을 허용하지 않습니다.
  • legacy: Spark는 매우 느슨한 유효한 캐스트인 경우 형식 강제 변환을 허용합니다. 예를 들어 문자열을 정수로 또는 double을 부울로 변환할 수 있습니다. 또한 Spark 2.x의 유일한 동작이며 Hive와 호환됩니다.
  • strict: Spark는 형식 강제 변환 시 정밀도 손실이나 데이터 잘림이 발생할 가능성을 허용하지 않습니다. 예를 들어, double을 int로 또는 decimal을 double로 변환하는 것은 허용되지 않습니다.

다음 하위 섹션에서는 ANSI 모드를 사용할 때 산술 연산, 형식 변환 및 SQL 구문 분석의 동작 변경 내용을 나타냅니다. 세 가지 종류의 Spark SQL 형식 변환이 있으며 이 문서에서는 캐스트, 저장 할당 및 형식 강제 변환을 하나씩 소개합니다.

산술 연산

Spark SQL에서 숫자 형식(10진 제외)으로 수행되는 산술 연산은 기본적으로 오버플로를 확인하지 않습니다. 즉, 연산이 오버플로를 발생시키는 경우 Java 또는 Scala 프로그램의 해당 연산과 결과와 동일합니다(예: 2개의 정수의 합계가 표현 가능한 최댓값보다 높은 경우 결과는 음수). 반면 Spark SQL 10진 오버플로에 대해 null을 반환합니다. spark.sql.ansi.enabledtrue로 설정되고 오버플로가 숫자 및 간격 산술 연산에서 발생하는 경우 런타임에 산술 예외를 throw합니다.

-- `spark.sql.ansi.enabled=true`
> SELECT 2147483647 + 1;
 error: integer overflow

-- `spark.sql.ansi.enabled=false`
> SELECT 2147483647 + 1;
  -2147483648

캐스트

spark.sql.ansi.enabledtrue로 설정된 경우, CAST 구문을 사용한 명시적 형 변환은 문자열을 정수로 캐스팅하는 것과 같이 표준에 정의된 잘못된 캐스트 패턴에 대해 런타임 예외를 발생시킵니다.

Spark ANSI 모드의 CAST 절은 ISO/IEC 9075-2:2011 — 데이터베이스 언어 - SQL — 파트2: 기본 사항(SQL/기본 사항)의 섹션 6.13 “캐스트 사양” 구문 규칙을 따릅니다. 단, ANSI 표준에 따라 허용되지 않는 다음과 같은 간단한 형식 변환을 특별히 허용합니다.

  • NumericType <=> BooleanType
  • 문자열 유형 <=> 이진 유형

다음 표는 CAST 식에서의 원본 및 대상 데이터 형식의 유효한 조합을 나타냅니다. “Y”는 조합이 제한 없이 구문상 유효함을, “N”은 조합이 유효하지 않음을 나타냅니다.

SourceTarget 숫자 문자열 날짜 타임스탬프 간격 Boolean 이진 배열 지도 구조체
숫자 Y Y N N N Y N N N N
문자열 Y Y Y Y Y Y Y N N N
날짜 N Y Y Y N N N N N N
타임스탬프 N Y Y Y N N N N N N
간격 N Y N N Y N N N N N
Boolean Y Y N N N Y N N N N
이진 Y N N N N N Y N N N
배열 N N N N N N N Y N N
지도 N N N N N N N N Y N
구조체 N N N N N N N N N Y
-- Examples of explicit casting

-- `spark.sql.ansi.enabled=true`
> SELECT CAST('a' AS INT);
  ERROR: [CAST_INVALID_INPUT] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed.

> SELECT CAST(2147483648L AS INT);
  ERROR: [CAST_OVERFLOW] The value 2147483648L of the type "BIGINT" cannot be cast to "INT" due to an overflow.

> SELECT CAST(DATE'2020-01-01' AS INT)
  ERROR: [DATATYPE_MISMATCH.CAST_WITH_FUNC_SUGGESTION] Cannot resolve "CAST(DATE '2020-01-01' AS INT)" due to data type mismatch: cannot cast "DATE" to "INT".

-- `spark.sql.ansi.enabled=false` (This is a default behavior)
> SELECT cast('a' AS INT);
  null

> SELECT CAST(2147483648L AS INT);
  -2147483648

> SELECT CAST(DATE'2020-01-01' AS INT);
  null

저장 할당

이 설정 spark.sql.storeAssignmentPolicy은 기본적으로 ANSI로 설정됩니다. 이 설정을 사용하면 원본 값의 데이터 형식이 대상 열 형식과 일치하지 않는 경우 Spark SQL은 자동으로 ANSI CAST 절을 INSERT 문에 추가합니다. 이 정책에 따라 테이블 삽입 중에 Spark는 잘못된 캐스트를 확인하고 거부하여 데이터 품질을 보장하기 위해 예외를 throw합니다. 즉, 형식 불일치로 인해 삽입 시도가 실패하는 경우 테이블에 데이터가 부분적으로 기록되지 않습니다.

예:

-- spark.sql.storeAssignmentPolicy=ANSI
> CREATE TABLE test(i INT);
> INSERT INTO test VALUES (2147483648L);
  ERROR: [CAST_OVERFLOW_IN_TABLE_INSERT] Fail to insert a value of "BIGINT" type into the "INT" type column `i` due to an overflow.

> INSERT INTO test VALUES ('a');
  ERROR: [CAST_INVALID_INPUT ERROR] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed

다음 예제에서는 호환되지 않는 데이터가 삽입되지 않도록 하는 Spark SQL을 보여 줍니다. 따라서 데이터 무결성이 유지됩니다.

spark.sql.storeAssignmentPolicyLEGACY로 설정되면 Spark SQL은 이전의 동작으로 돌아갑니다. 이 모드에서는 ANSI CAST를 사용하는 대신 레거시 CAST 작업을 적용합니다. 이 정책에서 테이블 삽입 중에 잘못된 캐스트가 발생하면 예외를 throw하는 대신 NULL 값이나 잘못된 값이 삽입됩니다. 예:

-- spark.sql.storeAssignmentPolicy=LEGACY
> CREATE TABLE test(i INT);
> INSERT INTO test VALUES (2147483648L);
> INSERT INTO test VALUES ('a');
> SELECT * FROM test;

-- Results
--  -2147483648 (incorrect value due to overflow)
--  null (cannot cast 'a' to INT)

형식 강제 변환

형식 승격 및 우선 순위

spark.sql.ansi.enabledtrue로 설정되면 Spark SQL는 데이터 형식 간의 충돌을 해결하는 방법을 제어하는 여러 규칙을 사용합니다. 지정된 데이터 형식의 값을 암시적으로 다른 데이터 형식으로 승격할 수 있는지 여부를 정의하는 형식 우선 순위 목록이 이 충돌 해결의 핵심입니다.

데이터 형식 우선 순위 목록(좁은 목록에서 넓은 목록으로)
바이트 Byte -> Short -> Int -> Long -> Decimal -> Float* -> Double
짧은 Short -> Int(정수) -> Long(긴 정수) -> Decimal(십진수) -> Float*(부동소수점) -> Double(배정밀도 부동소수점)
정수 Int -> Long -> 소수 -> 부동 소수점* -> 더블
롱 -> 십진수 -> 부동소수* -> 더블
소수 Decimal (십진법) -> Float (부동소수점)* -> Double (배정밀도 부동소수점)
부유 Float -> Double
두 배 두 배
날짜 날짜 -> 타임스탬프
시간표시 시간표시
문자열 문자열
이진 이진
Boolean 불리언 (Boolean)
간격 간격
지도 맵**
배열 배열**
구조체 구조체**
  • 가장 낮은 공통 타입을 결정할 때, 플로트를 생략하여 정밀도 손실을 방지합니다.

** 복합 형식의 경우 우선 순위 규칙은 해당 구성 요소에 재귀적으로 적용됩니다.

특수 규칙은 문자열 형식 및 형식이 지정되지 않은 NULL에 적용됩니다. NULL은 다른 형식으로 승격될 수 있지만 문자열은 모든 단순 데이터 형식으로 승격될 수 있습니다.

다음은 우선 순위 목록을 지시된 트리로 그래픽으로 보여 주는 것입니다. 우선 순위 규칙의 그래픽 표현

최소 공통 형식 해상도

형식 집합에서 가장 덜 일반적인 형식은 형식 집합의 모든 요소가 우선 순위 목록에서 도달할 수 있는 가장 좁은 형식입니다.

가장 흔하지 않은 형식 해상도는 다음 작업을 수행하기 위해 사용됩니다.

  • 형식의 매개 변수를 예상하는 함수가 더 좁은 형식의 인수를 사용하여 호출될 수 있는지 여부를 결정합니다.
  • coalesce, least 또는 greatest와 같은 여러 매개 변수에 대한 공유 인수 형식을 예상하는 함수의 인수 형식을 파생합니다.
  • 산술 연산 또는 비교와 같은 연산자에 대한 피연산자 형식을 파생합니다.
  • 사례 식과 같은 식의 결과 형식을 파생합니다.
  • 배열 및 맵 생성자에 대한 요소, 키 또는 값 형식을 파생합니다.

최소 일반 형식이 FLOAT로 확인되는 경우 특수 규칙이 적용됩니다. FLOAT 형식 값을 사용하면 형식이 하나라도 INT, BIGINT 또는 DECIMAL에 해당하는 경우 잠재적인 자릿수 손실을 방지하기 위해 가장 일반적인 형식이 DOUBLE로 푸시됩니다.

-- The coalesce function accepts any set of argument types as long as they share a least common type.
-- The result type is the least common type of the arguments.
> SET spark.sql.ansi.enabled=true;

> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT

> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]

> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)));
ARRAY<BIGINT>

> SELECT typeof(coalesce(1, 1F));
DOUBLE

> SELECT typeof(coalesce(1L, 1F));
DOUBLE

> SELECT (typeof(coalesce(1BD, 1F)));
DOUBLE

-- The substring function expects arguments of type INT for the start and length parameters.
> SELECT substring('hello', 1Y, 2);
he

> SELECT substring('hello', '1', 2);
he

> SELECT substring('hello', 1L, 2);
Error: Argument 2 requires an INT type.

> SELECT substring('hello', str, 2) FROM VALUES(CAST('1' AS STRING)) AS T(str);
Error: Argument 2 requires an INT type.

SQL 함수

일부 SQL 함수의 동작은 ANSI 모드(spark.sql.ansi.enabled=true)에서 다를 수 있습니다.

  • size: 이 함수는 ANSI 모드에서 null 입력에 대해 null을 반환합니다.
  • element_at:
    • 이 함수는 잘못된 인덱스를 사용하는 경우 ArrayIndexOutOfBoundsException을 throw합니다.
    • 이 함수는 키가 맵에 없는 경우 NoSuchElementException을 throw합니다.
  • elt: 잘못된 인덱스를 사용하는 경우 ArrayIndexOutOfBoundsException을 throw합니다.
  • make_date: 결과 날짜가 잘못된 경우 이 함수는 예외와 함께 실패합니다.
  • make_timestamp: 결과 타임스탬프가 잘못된 경우 이 함수는 예외와 함께 실패합니다.
  • make_interval: 결과 간격이 잘못된 경우 이 함수는 예외와 함께 실패합니다.
  • next_day: 입력이 유효한 요일이 아니면 IllegalArgumentException을 throw합니다.
  • parse_url: 입력 문자열이 유효한 url이 아니면 IllegalArgumentException을 throw합니다.
  • to_date: 입력 문자열을 구문 분석할 수 없거나 패턴 문자열이 잘못된 경우 이 함수는 예외와 함께 실패합니다.
  • to_timestamp: 입력 문자열을 구문 분석할 수 없거나 패턴 문자열이 잘못된 경우 이 함수는 예외와 함께 실패합니다.
  • to_unix_timestamp: 입력 문자열을 구문 분석할 수 없거나 패턴 문자열이 잘못된 경우 이 함수는 예외와 함께 실패합니다.
  • unix_timestamp: 입력 문자열을 구문 분석할 수 없거나 패턴 문자열이 잘못된 경우 이 함수는 예외와 함께 실패합니다.

SQL 연산자

일부 SQL 연산자의 동작은 ANSI 모드(spark.sql.ansi.enabled=true)에서 다를 수 있습니다.

  • array_col[index]: 잘못된 인덱스를 사용하는 경우 이 연산자는 ArrayIndexOutOfBoundsException을 throw합니다.
  • map_col[key]: 이 연산자는 키가 맵에 없는 경우 NoSuchElementException을 throw합니다.
  • CAST(string_col AS TIMESTAMP): 입력 문자열을 구문 분석할 수 없는 경우 이 연산자는 예외와 함께 실패합니다.
  • CAST(string_col AS DATE): 입력 문자열을 구문 분석할 수 없는 경우 이 연산자는 예외와 함께 실패합니다.

ANSI 모드에 유용한 함수

ANSI 모드가 켜지면 잘못된 연산에 대해 예외가 발생합니다. 다음 SQL 함수를 사용하여 이러한 예외를 표시하지 않을 수 있습니다.

  • try_cast: 런타임 오류 시 예외를 throw하는 대신CAST을 반환한다는 점을 제외하고 NULL와 동일합니다.
  • try_add: 정수 값 오버플로 시 예외를 throw하는 대신+을 반환한다는 점을 제외하고 더하기 연산자NULL와 동일합니다.
  • try_divide: 0으로 나눌 때 예외를 throw하는 대신/을 반환한다는 점을 제외하고 나누기 연산자NULL와 동일합니다.

SQL 키워드

spark.sql.ansi.enabled가 true이면 Spark SQL는 ANSI 모드 파서를 사용합니다. 이 모드에서 Spark SQL에는 다음과 같은 두 종류의 키워드가 있습니다.

  • 예약 키워드: 예약되어 있어 테이블, 보기, 열, 함수, 별칭 등에 대한 식별자로 사용할 수 없는 키워드입니다.
  • 비 예약 키워드: 특정 컨텍스트에서만 특별한 의미를 가지며 다른 컨텍스트에서 식별자로 사용할 수 있는 키워드입니다. 예를 들어 EXPLAIN SELECT ... 명령이지만 EXPLAIN 다른 위치에서 식별자로 사용할 수 있습니다.

ANSI 모드를 사용하지 않도록 설정하면 Spark SQL에는 다음과 같은 두 종류의 키워드가 있습니다.

  • 비 예약 키워드: ANSI 모드를 사용하도록 설정한 경우와 정의가 동일합니다.
  • 엄격한 비 예약 키워드: 테이블 별칭으로 사용할 수 없는 비 예약 키워드의 엄격한 버전입니다.

기본적으로 spark.sql.ansi.enabled는 false입니다.

다음은 Spark SQL의 모든 키워드 목록입니다.

키워드 Spark SQL ANSI 모드 Spark SQL 기본 모드 SQL-2016
추가하기 비예약된 비예약 비예약된
후에 미예약 비예약 비예약된
모두 예약됨 예약되지 않음 예약된
변경 예약되지 않음 비예약된 예약된
항상 비 예약 예약되지 않음 비 예약
분석 예약되지 않은 미예약 예약되지 않음
예약된 비예약 예약된
안티 예약되지 않은 엄격-비예약 미예약된
어떤 예약됨 예약되지 않은 예약됨
아카이브 비예약 비예약된 비예약
ARRAY 예약되지 않은 예약되지 않은 예약됨
AS 예약된 예약 안 됨 예약됨
ASC 예약되지 않은 비예약된 미예약
AT 비예약제 비예약 예약됨
권한 부여 예약됨 비예약된 예약된
사이 미예약 예약되지 않음 예약됨
둘 다 예약됨 예약되지 않은 예약됨
양동이 비예약 비예약된 비예약
버킷 미예약 예약되지 않음 비예약
BY 미예약 예약되지 않음 예약됨
CACHE 비예약된 비예약 비예약
계단식 예약되지 않은 미예약 비예약
케이스 (상황/사례) 예약된 비지정 예약됨
캐스트 예약된 비예약됨 예약됨
변경 예약되지 않음 예약되지 않음 예약되지 않은
확인 예약됨 비 예약 예약됨
CLEAR 예약되지 않은 예약되지 않음 비예약된
클러스터 비예약 예약되지 않은 예약되지 않은
클러스터드 예약되지 않음 예약되지 않은 예약되지 않음
CODEGEN 예약되지 않음 비예약 비예약된
COLLATE 예약됨 예약되지 않은 예약됨
컬렉션 예약되지 않음 예약되지 않은 비예약됨
COLUMN 예약됨 예약되지 않은 예약된
COLUMNS 예약되지 않은 비예약 비 예약
댓글 예약되지 않은 예약되지 않은 예약되지 않음
약속하다 예약되지 않은 미예약 예약됨
COMPACT 미예약 예약되지 않음 미예약
압축 예약되지 않은 비예약 비예약된
계산 비예약됨 예약되지 않은 예약되지 않음
CONCATENATE 예약되지 않은 예약 불필요 예약되지 않음
CONSTRAINT 예약됨 예약되지 않음 예약됨
비용 미 예약된 미지정 예약되지 않음
생성 예약됨 비예약됨 예약된
교차 예약됨 엄격히 비예약된 예약됨
큐브 예약 불필요 예약되지 않음 예약됨
CURRENT 비 예약 예약되지 않음 예약된
현재 날짜 예약됨 미예약 예약됨
현재_시간 예약됨 예약되지 않은 예약됨
현재_타임스탬프 예약된 예약 불필요 예약됨
현재 사용자 예약된 예약되지 않은 예약됨
데이터 예약되지 않음 예약되지 않음 예약되지 않은
데이터베이스 예약되지 않은 비예약된 예약되지 않음
데이터베이스 비예약된 예약되지 않음 예약되지 않음
예약되지 않음 예약되지 않은 예약되지 않음
DBPROPERTIES 예약되지 않음 예약되지 않음 예약 없음
정의됨 예약되지 않음 예약되지 않음 예약되지 않음
삭제 비예약 비예약된 예약된
경계가 설정됨 비예약 예약되지 않은 예약되지 않음
DESC 예약되지 않음 예약되지 않은 비예약
묘사하다 미예약 예약되지 않음 예약됨
DFS 예약되지 않은 비예약 예약되지 않은
디렉터리 미예약된 비예약된 비예약
디렉터리 예약되지 않은 미예약 비예약된
독특한 예약됨 미예약 예약된
배포하다 비 예약 예약되지 않은 예약되지 않음
디브 비예약된 예약되지 않은 키워드 아님
떨어뜨리다 미지정 비예약된 예약된
그 외에 예약됨 예약되지 않은 예약됨
예약됨 예약되지 않은 예약됨
탈출 예약됨 예약되지 않은 예약됨
탈출함 비예약 비예약 예약되지 않음
제외 예약된 엄격한 비할당 예약됨
교환 예약되지 않음 예약되지 않은 비예약
존재하다 비예약된 비 예약 예약됨
EXPLAIN 비예약된 비예약됨 예약되지 않음
수출 예약되지 않음 비 예약 비예약된
연장됨 비제한 예약되지 않은 비 예약
외부 예약되지 않은 예약되지 않음 예약됨
추출 비전용 미예약 예약된
거짓 예약된 비예약된 예약된
가져와 예약됨 비예약된 예약된
필드 비예약 예약되지 않은 미예약
필터 예약됨 예약되지 않음 예약된
파일 형식 예약되지 않은 미예약 예약되지 않은
첫 번째 예약되지 않음 예약되지 않음 예약 되지 않은
FN 미지정 비제한 예약되지 않음
다음 비 예약 비예약 비예약된
위해 예약됨 예약되지 않은 예약됨
외국의 예약됨 예약되지 않음 예약됨
포맷 비 예약 비 예약 비예약된
FORMATTED 예약되지 않은 미지정 미예약
부터 예약된 비예약 예약됨
가득 찬 예약됨 엄격한 비 할당 예약됨
기능 미예약 비예약된 예약됨
기능 예약되지 않은 비 지정 비 예약
생성됨 비예약 비예약 예약되지 않음
글로벌 할당되지 않음 예약되지 않은 예약된
GRANT 예약됨 미예약된 예약됨
보조금 미예약 미예약 예약되지 않음
그룹 예약됨 비예약 예약됨
그룹화 비예약된 미예약 예약된
HAVING 예약된 비 예약 예약된
시간 미배정 예약되지 않은 예약되지 않은
만약 (If) 예약되지 않은 예약되지 않음 키워드 아님
IGNORE 예약되지 않음 예약되지 않은 예약되지 않은
수입 비예약된 비예약된 비예약됨
인도 예약됨 예약되지 않음 예약됨
목차 예약되지 않은 예약되지 않음 예약되지 않은
INDEXES 미예약 비예약 예약되지 않은
내부 예약됨 엄격한 비예약 상태 예약됨
INPATH 비예약된 비예약된 예약되지 않은
INPUTFORMAT 예약되지 않은 비예약된 예약되지 않은
INSERT 예약되지 않음 비예약된 예약됨
INTERSECT 예약됨 엄격한 비예약된 예약됨
간격 비예약 미예약 예약됨
INTO 예약됨 비예약 예약됨
IS 예약된 비전용 예약됨
항목 비예약 비 예약 예약되지 않음
JOIN 예약됨 엄격-비예약 예약됨
JSON (자바스크립트 객체 표기법) 비예약 비예약 비 예약
KEY 비 예약 비정기적 미지정
키들 미예약 예약되지 않음 비예약
마지막 비 예약 예약되지 않음 예약되지 않은
측면 예약된 엄격하지만 사전 예약이 필요 없는 예약됨
게으른 미예약 예약되지 않음 미예약
선도하는 예약됨 예약되지 않음 예약된
왼쪽 예약됨 엄격한 비예약 예약됨
좋아요 비지정 예약되지 않음 예약됨
ILIKE 예약되지 않은 비예약된 미예약
LIMIT 미예약 미예약 미예약
미예약 비예약 예약되지 않음
LIST 미예약 비예약된 예약이 없는
로드 예약되지 않음 예약되지 않은 비예약된
지역 예약되지 않은 비 예약 예약됨
위치 예약되지 않음 미예약 예약되지 않음
잠금 예약되지 않은 비예약 비예약
자물쇠 비예약된 미예약된 비예약된
논리적 미예약 비예약된 예약되지 않음
매크로 미예약 예약되지 않은 예약되지 않음
지도 미예약 예약되지 않음 미배정
일치함 비예약된 비예약된 비지정
병합 미예약 미예약 비 예약
미예약 비 예약 비예약된
MINUS 예약되지 않음 엄격한 비예약관리가 적용되는 비예약
예약되지 않은 예약되지 않음 비예약된
MSCK 미예약 예약되지 않은 비예약
네임스페이스 비예약된 미예약 예약되지 않은
네임스페이스 미예약 비예약된 비예약
자연스러운 예약됨 엄격히 비예약된 예약됨
아니오 예약되지 않은 미지정 예약됨
아님 예약됨 예약되지 않음 예약됨
NULL 예약된 비 예약 예약된
NULLS 예약되지 않은 비예약 비예약
OF 비 예약 미예약 예약됨
켜짐 예약됨 엄격한 비예약 정책 예약됨
오직 예약됨 비예약 예약된
옵션 예약되지 않은 예약되지 않은 예약되지 않은
옵션 미예약 비예약된 비예약됨
또는 예약된 미예약 예약됨
주문 예약됨 예약되지 않음 예약됨
아웃 예약되지 않음 예약되지 않은 예약됨
아우터 예약됨 비예약 예약됨
출력 형식 비예약된 미예약 비예약된
예약되지 않은 미예약 비예약
중복 예약됨 예약되지 않은 예약됨
오버레이 미예약 예약되지 않은 비예약된
덮어쓰기 예약되지 않음 비사용 중 비예약된
PARTITION 예약되지 않음 비 예약 예약됨
분할된 비예약된 비전용 비예약
파티션 예약되지 않은 예약되지 않은 비예약
퍼센트 미예약 예약되지 않음 예약되지 않음
PIVOT 비지정 미예약 비예약된
배치 비예약된 미 예약된 예약되지 않은
직위 예약되지 않음 미예약된 예약된
이전 예약되지 않음 예약되지 않은 비예약
PRIMARY 예약된 예약되지 않음 예약됨
교장 비예약된 비예약된 예약되지 않은
속성 예약되지 않은 예약되지 않음 예약되지 않은
정화 미예약된 예약되지 않음 예약되지 않은
QUALIFY 예약됨 / 내성적인 예약되지 않은 예약된
질의 예약되지 않음 예약되지 않음 미예약 or 예약되지 않은
범위 비예약된 예약되지 않은 예약됨
수령인 비예약된 비예약 미예약
RECIPIENTS 비지정 미예약 예약되지 않음
기록리더 미예약된 예약되지 않음 예약되지 않은
레코드라이터 미예약 예약되지 않음 비예약
복구 예약되지 않음 예약되지 않은 비예약된
감소시키다 예약되지 않음 비예약된 예약되지 않음
참고 문헌 예약됨 예약되지 않은 예약된
REFRESH 예약되지 않음 예약되지 않은 미예약
REGEXP 비예약 예약되지 않음 키워드 아님
REMOVE 미지정 비예약된 예약되지 않음
이름 변경 예약되지 않음 예약되지 않음 미예약
수리 예약되지 않음 미예약 비예약
대체 예약되지 않은 예약되지 않은 비제한적
RESET 예약되지 않음 예약되지 않은 예약되지 않음
존중 예약 불필요 비예약 예약되지 않음
제한 비예약 미예약된 예약되지 않음
REVOKE 예약되지 않음 비예약된 예약됨
올바른 예약됨 엄격-비예약 예약된
RLIKE 미예약 미예약 예약되지 않음
역할 예약되지 않은 미예약 예약되지 않음
역할 미예약된 예약되지 않음 비예약된
롤백 예약되지 않은 예약되지 않음 예약됨
롤업 비예약된 미예약 예약된
ROW 예약되지 않은 비예약 예약된
ROWS 미리 예약되지 않음 예약되지 않은 예약됨
SCHEMA 예약되지 않음 예약되지 않은 예약되지 않음
스키마 미예약 예약되지 않음 키워드 아님
비예약 예약되지 않음 예약되지 않음
SELECT 예약됨 비예약 상태 예약됨
SEMI 비 지정 엄격한 비 예약 비 예약
분리된 비예약 미예약 비예약됨
SERDE 예약되지 않은 예약되지 않은 비예약된
SERDEPROPERTIES 예약되지 않은 비예약된 예약되지 않음
SESSION_USER 예약된 비예약 예약됨
SET 미예약된 비예약된 예약됨
설정 비예약 비 예약 예약되지 않음
공유 예약되지 않음 예약되지 않은 예약되지 않은
SHARES 미예약 미예약 비예약
보이기 예약되지 않음 예약되지 않음 비예약된
기울어진 미예약 예약되지 않은 비예약
일부 예약된 예약되지 않은 예약됨
정렬 예약되지 않은 비예약 예약되지 않은
정리됨 비예약된 비예약된 예약되지 않음
시작 예약되지 않음 비예약 예약됨
통계 예약되지 않은 예약되지 않은 비예약
저장됨 비지정 미예약 미예약
계층화하다 사전 예약 불필요 비지정 비 예약
구조체 예약되지 않은 미예약 비 예약
SUBSTR (서브스트) 비예약 비예약 예약되지 않음
부분 문자열 예약되지 않음 비 예약 비지정
SYNC 예약되지 않음 미 예약된 예약되지 않음
TABLE 예약됨 비예약 예약됨
TABLES 예약되지 않은 미예약된 비 예약
TABLESAMPLE 예약되지 않음 예약되지 않은 예약된
TBLPROPERTIES 비예약된 비 예약 미 예약
온도 비예약된 미예약 키워드 아님
임시 예약 불필요 비예약된 예약되지 않은
종료 비예약 미예약 비예약
그때 예약됨 비예약 예약됨
시간 예약됨 비예약 예약됨
TO 예약됨 예약되지 않은 예약된
터치 예약되지 않은 비예약 비 예약
뒤따르는 예약됨 비예약된 예약됨
거래 예약되지 않음 예약되지 않음 비 예약
거래 미예약 미예약 미예약
변형 비예약된 예약되지 않음 예약되지 않음
TRIM 비 예약 예약되지 않은 미예약
TRUE 비 예약 비 예약 예약됨
잘라내다 예약되지 않음 비예약 예약됨
TRY_CAST 예약되지 않음 비 예약 예약되지 않음
유형 비예약 미예약 비예약된
보관 해제 예약되지 않음 예약되지 않은 예약되지 않은
무한한 예약 불필요 예약되지 않음 비예약
캐시 해제 비 예약 미예약 비예약
연합 예약됨 엄격한 비 예약 예약됨
UNIQUE 예약됨 예약되지 않음 예약된
알 수 없음 예약된 예약되지 않은 예약됨
잠금 해제 예약되지 않음 비 예약 비예약
설정되지 않음 비예약된 예약되지 않음 비예약
UPDATE 예약되지 않은 예약되지 않은 예약됨
사용 예약되지 않음 비예약 비예약된
사용자 예약됨 비 예약 예약됨
사용 예약됨 엄격한 비예약 허용 예약됨
VALUES 예약되지 않음 예약되지 않음 예약된
보기 예약되지 않음 미예약 비예약된
VIEWS 미예약된 미예약된 예약되지 않음
다음과 같은 경우... 예약된 비지정 예약된
WHERE 예약됨 비예약 예약된
WINDOW 비지정 비예약된 예약된
함께 예약됨 예약되지 않음 예약됨
비예약 미예약 예약되지 않음
구역 예약 불필요 예약 불필요 예약되지 않음