Kepatuhan ANSI dalam Databricks Runtime

Berlaku untuk:check marked yes Databricks Runtime

Artikel ini menjelaskan kepatuhan ANSI di Databricks Runtime. Untuk mode ANSI di Databricks SQL, lihat ANSI_MODE.

SQL Spark memiliki dua opsi untuk mendukung kepatuhan terhadap standar SQL ANSI: spark.sql.ansi.enabled dan spark.sql.storeAssignmentPolicy.

Saat spark.sql.ansi.enabled disetel ke true, SQL Spark menggunakan dialek yang sesuai dengan ANSI alih-alih sesuai dengan Apache Hive. Misalnya, Spark akan memberikan pengecualian saat runtime alih-alih mengembalikan hasil null jika input ke operator/fungsi SQL tidak valid. Beberapa fitur dialek ANSI mungkin bukan dari standar SQL ANSI secara langsung, tetapi perilakunya selaras dengan gaya SQL ANSI.

Selain itu, Spark SQL memiliki opsi independen untuk mengontrol perilaku transmisi implisit saat menyimpan baris dalam tabel. Perilaku transmisi didefinisikan sebagai aturan penetapan penyimpanan dalam standar.

Saat spark.sql.storeAssignmentPolicy ditetapkan ke ANSI, SQL Spark mematuhi aturan penugasan penyimpanan ANSI. Ini adalah konfigurasi terpisah karena nilai defaultnya adalah ANSI, sedangkan konfigurasi spark.sql.ansi.enabled dinonaktifkan secara default.

Tabel berikut ini meringkas hasilnya:

Nama Properti Default Makna
spark.sql.ansi.enabled salah Jika benar, Spark mencoba menyesuaikan dengan spesifikasi SQL ANSI:

* Menampilkan pengecualian runtime jika luapan terjadi dalam operasi apa pun pada bidang bilangan bulat atau desimal.
* Melarang penggunaan kata kunci yang dicadangkan dari SQL ANSI sebagai pengidentifikasi di pengurai SQL.
spark.sql.storeAssignmentPolicy ANSI Saat menyimpan nilai ke dalam kolom dengan jenis data yang berbeda, Spark melakukan konversi jenis. Ada tiga kebijakan untuk jenis aturan konversi eksplisit: ANSI, legacy, dan strict.

* ANSI: Spark melakukan jenis konversi eksplisit sesuai SQL ANSI. Dalam praktiknya, perilakunya sebagian besar sama dengan PostgreSQL. Perilaku ini melarang konversi jenis tertentu yang tidak masuk akal seperti mengonversi string ke int atau ganda ke boolean.
* legacy: Spark memungkinkan konversi eksplisit jenis selama jenisnya adalah Transmisi valid, yang sifatanya sangat longgar. Misalnya, mengonversi string ke int atau ganda ke boolean diizinkan. Perilaku ini juga satu-satunya perilaku di Spark 2.x dan sesuai dengan Apache Hive.
* strictSpark tidak mengizinkan kemungkinan kehilangan presisi atau pemotongan data dalam konversi eksplisit jenis, misalnya, mengonversi ganda ke int atau desimal ke ganda tidak diperbolehkan.

Subbagian berikut menyajikan perubahan perilaku dalam operasi aritmatika, konversi jenis, dan penguraian SQL saat mode ANSI diaktifkan. Untuk jenis konversi di SQL Spark, ada tiga jenisnya dan artikel ini akan memperkenalkannya satu per satu: transmisikan, penugasan penyimpanan, dan jenis konversi eksplisit.

Operasi aritmatika

Dalam SQL Spark, operasi aritmatika yang dilakukan pada jenis numerik (dengan pengecualian desimal) tidak diperiksa untuk luapan secara default. Hal ini berarti bahwa jika operasi menyebabkan luapan, hasilnya sama dengan operasi yang sesuai dalam program Java atau Scala (Misalnya, jika jumlah 2 bilangan bulat lebih tinggi dari nilai maksimum yang dapat diwakili, hasilnya adalah angka negatif). Di sisi lain, SQL Spark mengembalikan null untuk luapan desimal. Saat spark.sql.ansi.enabled diatur ke true dan luapan terjadi dalam operasi aritmatika numerik dan interval, proses itu akan memberikan pengecualian aritmatika saat runtime.

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

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

Transmisi

Saat spark.sql.ansi.enabled diatur ke true, transmisi eksplisit dengan sintaks CAST akan memberikan pengecualian runtime untuk pola transmisi ilegal yang ditentukan dalam standar, seperti transmisi dari string ke bilangan bulat.

Klausul CAST mode ANSI Spark mengikuti aturan sintaks dari bagian 6.13 “spesifikasi transmisi” di ISO/IEC 9075-2:2011 Teknologi informasi — Bahasa database - SQL — Bagian 2: Foundation (SQL/Foundation), kecuali secara khusus memungkinkan konversi jenis langsung berikut yang tidak diizinkan sesuai standar ANSI:

  • NumericType <=> BooleanType
  • StringType <=> BinaryType

Kombinasi yang valid dari jenis data sumber dan target dalam ekspresi CAST diberikan oleh tabel berikut. “Y” menunjukkan bahwa kombinasi tersebut valid secara sintaksis tanpa batasan dan “N” menunjukkan bahwa kombinasi tersebut tidak valid.

SourceTarget Numerik String Tanggal Tanda Waktu Interval Boolean Biner Array Peta Struktur
Numerik Y Y N N N Y N N N N
String Y Y Y Y Y Y Y N N N
Tanggal N Y Y Y N N N N N N
Tanda Waktu N Y Y Y N N N N N N
Interval N Y N N Y N N N N N
Boolean Y Y N N N Y N N N N
Biner Y N N N N N Y N N N
Array N N N N N N N Y N N
Peta N N N N N N N N Y N
Struktur 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

Penugasan penyimpanan

Pengaturan spark.sql.storeAssignmentPolicy default ke ANSI. Dengan pengaturan ini, ketika jenis data nilai sumber tidak cocok dengan jenis kolom target, Spark SQL secara otomatis menambahkan klausa ANSI CAST ke pernyataan INSERT. Selama penyisipan tabel di bawah kebijakan ini, Spark memeriksa dan menolak cast yang tidak valid, melemparkan pengecualian untuk memastikan kualitas data. Ini berarti jika upaya penyisipan gagal karena ketidakcocokan jenis, itu tidak akan mengakibatkan data apa pun ditulis sebagian ke tabel.

Contoh:

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

Contoh-contoh ini menunjukkan Spark SQL mencegah data yang tidak kompatibel disisipkan, sehingga mempertahankan integritas data.

spark.sql.storeAssignmentPolicy Ketika diatur ke LEGACY, Spark SQL kembali ke perilaku yang lazim hingga Spark 2.x. Dalam mode ini, alih-alih menggunakan ANSI CAST, ia menerapkan operasi CAST warisan. Di bawah kebijakan ini, cast yang tidak valid selama penyisipan tabel mengakibatkan nilai NULL atau nilai yang salah dimasukkan, daripada melemparkan pengecualian. Contoh:

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

Konversi eksplisit jenis

Jenis Promosi dan Prioritas

Saat spark.sql.ansi.enabled diatur ke true, SQL Spark menggunakan beberapa aturan yang mengatur cara konflik antar jenis data diselesaikan. Inti dari resolusi konflik ini adalah Daftar Prioritas Jenis yang menentukan apakah nilai dari jenis data tertentu dapat dipromosikan ke jenis data lain secara implisit.

Jenis Data daftar prioritas (dari yang tersempit ke terluas)
Byte Byte -> Pendek -> Int -> Panjang -> Desimal -> Float* -> Ganda
Pendek Pendek -> Int -> Panjang -> Desimal-> Float* -> Ganda
Int Int -> Panjang -> Desimal -> Float* -> Ganda
Panjang Panjang -> Desimal -> Float* -> Ganda
Decimal Desimal -> Float* -> Ganda
Float Float -> Ganda
Laju Laju
Tanggal Tanggal -> Stempel waktu
Tanda Waktu Tanda Waktu
String String
Biner Biner
Boolean Boolean
Interval Interval
Peta Peta**
Array Array**
Struktur Struktur**
  • Untuk float resolusi jenis yang paling tidak umum akan dilewati untuk menghindari hilangnya presisi.

** Untuk jenis yang kompleks, aturan prioritas berlaku secara berulang pada elemen komponennya.

Aturan khusus berlaku untuk jenis String dan NULL yang tidak diketik. NULL dapat dipromosikan ke jenis lain, sementara String dapat dipromosikan ke jenis data sederhana apa pun.

Ini adalah penggambaran grafis dari daftar prioritas sebagai pohon yang diarahkan: Graphical representation of precedence rules

Resolusi Jenis yang Paling Tidak Umum

Jenis yang paling tidak umum dari kumpulan jenis adalah jenis tersempit yang dapat dijangkau dari daftar prioritas oleh semua elemen kumpulan jenis.

Resolusi jenis yang paling tidak umum digunakan untuk:

  • Menentukan apakah suatu fungsi yang mengharapkan parameter dari suatu jenis dapat dipanggil menggunakan argumen dari jenis yang lebih sempit.
  • Memperoleh jenis argumen untuk fungsi yang mengharapkan jenis argumen bersama untuk beberapa parameter, seperti gabungan, terkecil, atau terbesar.
  • Memperoleh jenis operand untuk operator seperti operasi aritmatika atau perbandingan.
  • Memperoleh jenis hasil untuk ekspresi seperti ekspresi kasus.
  • Memperoleh elemen, kunci, atau jenis nilai untuk konstruktor array dan peta.

Aturan khusus diterapkan jika jenis yang paling tidak umum memutuskan untuk FLOAT. Dengan nilai jenis float, jika salah satu jenisnya adalah INT, BIGINT, atau DECIMAL, jenis yang paling tidak umum akan didorong ke DOUBLE untuk menghindari potensi kehilangan digit.

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

Fungsi SQL

Perilaku beberapa fungsi SQL dapat berbeda dalam mode ANSI (spark.sql.ansi.enabled=true).

  • size: Fungsi ini menghasilkan null untuk input null dalam mode ANSI.
  • element_at:
    • Fungsi ini menampilkan ArrayIndexOutOfBoundsException jika menggunakan indeks yang tidak valid.
    • Fungsi ini menampilkan NoSuchElementException jika kunci tidak ada di peta.
  • elt: Fungsi ini menampilkan ArrayIndexOutOfBoundsException jika menggunakan indeks yang tidak valid.
  • make_date: Fungsi ini gagal dengan pengecualian jika tanggal hasil tidak valid.
  • make_timestamp: Fungsi ini gagal dengan pengecualian jika stempel waktu tidak valid.
  • make_interval: Fungsi ini gagal dengan pengecualian jika interval hasil tidak valid.
  • next_day: Fungsi ini menampilkan IllegalArgumentException jika input bukan hari yang valid dalam seminggu.
  • parse_url: Fungsi ini menampilkan IllegalArgumentException jika input string bukan url yang valid.
  • to_date: Fungsi ini gagal dengan pengecualian jika string input tidak dapat diuraikan, atau string pola tidak valid.
  • to_timestamp: Fungsi ini gagal dengan pengecualian jika string input tidak dapat diuraikan, atau string pola tidak valid.
  • to_unix_timestamp: Fungsi ini gagal dengan pengecualian jika string input tidak dapat diuraikan, atau string pola tidak valid.
  • unix_timestamp: Fungsi ini gagal dengan pengecualian jika string input tidak dapat diuraikan, atau string pola tidak valid.

Operator SQL

Perilaku beberapa operator SQL dapat berbeda dalam mode ANSI (spark.sql.ansi.enabled=true).

  • array_col[index]: Operator ini menampilkan ArrayIndexOutOfBoundsException jika menggunakan indeks yang tidak valid.
  • map_col[key]: Operator ini menampilkan NoSuchElementException jika kunci tidak ada di peta.
  • CAST(string_col AS TIMESTAMP): Operator ini gagal dengan pengecualian jika string input tidak dapat diuraikan.
  • CAST(string_col AS DATE): Operator ini gagal dengan pengecualian jika string input tidak dapat diuraikan.

Fungsi yang berguna untuk Mode ANSI

Saat mode ANSI diaktifkan, mode ini menampilkan pengecualian untuk operasi yang tidak valid. Anda dapat menggunakan fungsi SQL berikut untuk menyembunyikan pengecualian tersebut.

  • try_cast: identik dengan CAST, kecuali bahwa ia menampilkan hasil NULL alih-alih memberikan pengecualian pada kesalahan runtime.
  • try_add: identik dengan operator tambah +, kecuali bahwa ia menampilkan hasil NULL alih-alih menampilkan pengecualian pada luapan nilai integral.
  • try_divide: identik dengan operator pembagian /, kecuali bahwa itu mengembalikan hasil NULL alih-alih memberikan pengecualian pada pembagian 0.

Kata kunci SQL

Jika spark.sql.ansi.enabled bernilai true, SQL Spark akan menggunakan pengurai mode ANSI. Dalam mode ini, SQL Spark memiliki dua jenis kata kunci:

  • Kata kunci yang dicadangkan: Kata kunci yang dicadangkan dan tidak dapat digunakan sebagai pengidentifikasi untuk tabel, tampilan, kolom, fungsi, alias, dll.
  • Kata kunci yang tidak dicadangkan: Kata kunci yang memiliki arti khusus hanya dalam konteks tertentu dan dapat digunakan sebagai pengidentifikasi dalam konteks lain. Misalnya, EXPLAIN SELECT ... adalah perintah, tetapi EXPLAIN dapat digunakan sebagai pengidentifikasi di tempat lain.

Ketika mode ANSI dinonaktifkan, SQL Spark memiliki dua jenis kata kunci:

  • Kata kunci yang tidak dicadangkan: Definisi yang sama dengan yang ada saat mode ANSI diaktifkan.
  • Kata kunci yang ketat yang tidak dicadangkan: Versi ketat dari kata kunci yang tidak dicadangkan, yang tidak dapat digunakan sebagai alias tabel.

Secara default, spark.sql.ansi.enabled bernilai false.

Di bawah ini adalah daftar semua kata kunci di SQL Spark.

Kata kunci Spark SQL ANSI Mode Spark SQL Default Mode SQL-2016
ADD tidak dicadangkan tidak dicadangkan tidak dicadangkan
AFTER tidak dicadangkan tidak dicadangkan tidak dicadangkan
SEMUA dicadangkan tidak dicadangkan dicadangkan
ALTER tidak dicadangkan tidak dicadangkan dicadangkan
ALWAYS tidak dicadangkan tidak dicadangkan tidak dicadangkan
ANALYZE tidak dicadangkan tidak dicadangkan tidak dicadangkan
AND dicadangkan tidak dicadangkan dicadangkan
ANTI tidak dicadangkan ketat yang tidak dicadangkan tidak dicadangkan
ANY dicadangkan tidak dicadangkan dicadangkan
ARCHIVE tidak dicadangkan tidak dicadangkan tidak dicadangkan
ARRAY tidak dicadangkan tidak dicadangkan dicadangkan
AS dicadangkan tidak dicadangkan dicadangkan
ASC tidak dicadangkan tidak dicadangkan tidak dicadangkan
AT tidak dicadangkan tidak dicadangkan dicadangkan
AUTHORIZATION dicadangkan tidak dicadangkan dicadangkan
BETWEEN tidak dicadangkan tidak dicadangkan dicadangkan
BOTH dicadangkan tidak dicadangkan dicadangkan
BUCKET tidak dicadangkan tidak dicadangkan tidak dicadangkan
BUCKETS tidak dicadangkan tidak dicadangkan tidak dicadangkan
BY tidak dicadangkan tidak dicadangkan dicadangkan
CACHE tidak dicadangkan tidak dicadangkan tidak dicadangkan
CASCADE tidak dicadangkan tidak dicadangkan tidak dicadangkan
CASE dicadangkan tidak dicadangkan dicadangkan
CAST dicadangkan tidak dicadangkan dicadangkan
CHANGE tidak dicadangkan tidak dicadangkan tidak dicadangkan
CHECK dicadangkan tidak dicadangkan dicadangkan
KOSONGKAN tidak dicadangkan tidak dicadangkan tidak dicadangkan
CLUSTER tidak dicadangkan tidak dicadangkan tidak dicadangkan
CLUSTERED tidak dicadangkan tidak dicadangkan tidak dicadangkan
CODEGEN tidak dicadangkan tidak dicadangkan tidak dicadangkan
COLLATE dicadangkan tidak dicadangkan dicadangkan
KUMPULAN tidak dicadangkan tidak dicadangkan tidak dicadangkan
KOLOM dicadangkan tidak dicadangkan dicadangkan
COLUMNS tidak dicadangkan tidak dicadangkan tidak dicadangkan
KOMENTAR tidak dicadangkan tidak dicadangkan tidak dicadangkan
COMMIT tidak dicadangkan tidak dicadangkan dicadangkan
COMPACT tidak dicadangkan tidak dicadangkan tidak dicadangkan
COMPACTIONS tidak dicadangkan tidak dicadangkan tidak dicadangkan
COMPUTE tidak dicadangkan tidak dicadangkan tidak dicadangkan
CONCATENATE tidak dicadangkan tidak dicadangkan tidak dicadangkan
CONSTRAINT dicadangkan tidak dicadangkan dicadangkan
COST tidak dicadangkan tidak dicadangkan tidak dicadangkan
CREATE dicadangkan tidak dicadangkan dicadangkan
CROSS dicadangkan ketat yang tidak dicadangkan dicadangkan
CUBE tidak dicadangkan tidak dicadangkan dicadangkan
CURRENT tidak dicadangkan tidak dicadangkan dicadangkan
CURRENT_DATE dicadangkan tidak dicadangkan dicadangkan
CURRENT_TIME dicadangkan tidak dicadangkan dicadangkan
CURRENT_TIMESTAMP dicadangkan tidak dicadangkan dicadangkan
CURRENT_USER dicadangkan tidak dicadangkan dicadangkan
DATA tidak dicadangkan tidak dicadangkan tidak dicadangkan
DATABASE tidak dicadangkan tidak dicadangkan tidak dicadangkan
DATABASES tidak dicadangkan tidak dicadangkan tidak dicadangkan
DAY tidak dicadangkan tidak dicadangkan tidak dicadangkan
DBPROPERTIES tidak dicadangkan tidak dicadangkan tidak dicadangkan
DEFINED tidak dicadangkan tidak dicadangkan tidak dicadangkan
DELETE tidak dicadangkan tidak dicadangkan dicadangkan
DELIMITED tidak dicadangkan tidak dicadangkan tidak dicadangkan
DESC tidak dicadangkan tidak dicadangkan tidak dicadangkan
URAIKAN tidak dicadangkan tidak dicadangkan dicadangkan
DFS tidak dicadangkan tidak dicadangkan tidak dicadangkan
DIRECTORIES tidak dicadangkan tidak dicadangkan tidak dicadangkan
DIREKTORI tidak dicadangkan tidak dicadangkan tidak dicadangkan
NYATA dicadangkan tidak dicadangkan dicadangkan
DISTRIBUTE tidak dicadangkan tidak dicadangkan tidak dicadangkan
DIV tidak dicadangkan tidak dicadangkan bukan kata kunci
DROP tidak dicadangkan tidak dicadangkan dicadangkan
ELSE dicadangkan tidak dicadangkan dicadangkan
END dicadangkan tidak dicadangkan dicadangkan
ESCAPE dicadangkan tidak dicadangkan dicadangkan
ESCAPED tidak dicadangkan tidak dicadangkan tidak dicadangkan
KECUALI dicadangkan ketat yang tidak dicadangkan dicadangkan
PERTUKARAN tidak dicadangkan tidak dicadangkan tidak dicadangkan
EXISTS tidak dicadangkan tidak dicadangkan dicadangkan
EXPLAIN tidak dicadangkan tidak dicadangkan tidak dicadangkan
EXPORT tidak dicadangkan tidak dicadangkan tidak dicadangkan
EXTENDED tidak dicadangkan tidak dicadangkan tidak dicadangkan
EKSTERNAL tidak dicadangkan tidak dicadangkan dicadangkan
EKSTRAK tidak dicadangkan tidak dicadangkan dicadangkan
SALAH dicadangkan tidak dicadangkan dicadangkan
FETCH dicadangkan tidak dicadangkan dicadangkan
FIELDS tidak dicadangkan tidak dicadangkan tidak dicadangkan
SARINGAN dicadangkan tidak dicadangkan dicadangkan
FILEFORMAT tidak dicadangkan tidak dicadangkan tidak dicadangkan
PERTAMA tidak dicadangkan tidak dicadangkan tidak dicadangkan
FN tidak dicadangkan tidak dicadangkan tidak dicadangkan
FOLLOWING tidak dicadangkan tidak dicadangkan tidak dicadangkan
FOR dicadangkan tidak dicadangkan dicadangkan
ASING dicadangkan tidak dicadangkan dicadangkan
FORMAT tidak dicadangkan tidak dicadangkan tidak dicadangkan
FORMATTED tidak dicadangkan tidak dicadangkan tidak dicadangkan
DARI dicadangkan tidak dicadangkan dicadangkan
FULL dicadangkan ketat yang tidak dicadangkan dicadangkan
FUNGSI tidak dicadangkan tidak dicadangkan dicadangkan
FUNCTIONS tidak dicadangkan tidak dicadangkan tidak dicadangkan
GENERATED tidak dicadangkan tidak dicadangkan tidak dicadangkan
GLOBAL tidak dicadangkan tidak dicadangkan dicadangkan
GRANT dicadangkan tidak dicadangkan dicadangkan
GRANTS tidak dicadangkan tidak dicadangkan tidak dicadangkan
GROUP dicadangkan tidak dicadangkan dicadangkan
GROUPING tidak dicadangkan tidak dicadangkan dicadangkan
MEMILIKI dicadangkan tidak dicadangkan dicadangkan
HOUR tidak dicadangkan tidak dicadangkan tidak dicadangkan
JIKA tidak dicadangkan tidak dicadangkan bukan kata kunci
IGNORE tidak dicadangkan tidak dicadangkan tidak dicadangkan
IMPORT tidak dicadangkan tidak dicadangkan tidak dicadangkan
IN dicadangkan tidak dicadangkan dicadangkan
INDEX tidak dicadangkan tidak dicadangkan tidak dicadangkan
INDEXES tidak dicadangkan tidak dicadangkan tidak dicadangkan
INNER dicadangkan ketat yang tidak dicadangkan dicadangkan
INPATH tidak dicadangkan tidak dicadangkan tidak dicadangkan
INPUTFORMAT tidak dicadangkan tidak dicadangkan tidak dicadangkan
INSERT tidak dicadangkan tidak dicadangkan dicadangkan
PERPOTONGAN dicadangkan ketat yang tidak dicadangkan dicadangkan
INTERVAL tidak dicadangkan tidak dicadangkan dicadangkan
INTO dicadangkan tidak dicadangkan dicadangkan
IS dicadangkan tidak dicadangkan dicadangkan
ITEMS tidak dicadangkan tidak dicadangkan tidak dicadangkan
IKUTI dicadangkan ketat yang tidak dicadangkan dicadangkan
KEY tidak dicadangkan tidak dicadangkan tidak dicadangkan
KUNCI tidak dicadangkan tidak dicadangkan tidak dicadangkan
LAST tidak dicadangkan tidak dicadangkan tidak dicadangkan
LATERAL dicadangkan ketat yang tidak dicadangkan dicadangkan
LAZY tidak dicadangkan tidak dicadangkan tidak dicadangkan
LEADING dicadangkan tidak dicadangkan dicadangkan
LEFT dicadangkan ketat yang tidak dicadangkan dicadangkan
LIKE tidak dicadangkan tidak dicadangkan dicadangkan
ILIKE tidak dicadangkan tidak dicadangkan tidak dicadangkan
BATAS tidak dicadangkan tidak dicadangkan tidak dicadangkan
LINES tidak dicadangkan tidak dicadangkan tidak dicadangkan
LIST tidak dicadangkan tidak dicadangkan tidak dicadangkan
LOAD tidak dicadangkan tidak dicadangkan tidak dicadangkan
LOKAL tidak dicadangkan tidak dicadangkan dicadangkan
LOKASI tidak dicadangkan tidak dicadangkan tidak dicadangkan
LOCK tidak dicadangkan tidak dicadangkan tidak dicadangkan
LOCKS tidak dicadangkan tidak dicadangkan tidak dicadangkan
LOGICAL tidak dicadangkan tidak dicadangkan tidak dicadangkan
MACRO tidak dicadangkan tidak dicadangkan tidak dicadangkan
PETA tidak dicadangkan tidak dicadangkan tidak dicadangkan
MATCHED tidak dicadangkan tidak dicadangkan tidak dicadangkan
GABUNG tidak dicadangkan tidak dicadangkan tidak dicadangkan
MINUTE tidak dicadangkan tidak dicadangkan tidak dicadangkan
MINUS tidak dicadangkan ketat yang tidak dicadangkan tidak dicadangkan
MONTH tidak dicadangkan tidak dicadangkan tidak dicadangkan
MSCK tidak dicadangkan tidak dicadangkan tidak dicadangkan
NAMESPACE tidak dicadangkan tidak dicadangkan tidak dicadangkan
NAMESPACE tidak dicadangkan tidak dicadangkan tidak dicadangkan
NATURAL dicadangkan ketat yang tidak dicadangkan dicadangkan
TIDAK tidak dicadangkan tidak dicadangkan dicadangkan
TIDAK dicadangkan tidak dicadangkan dicadangkan
NULL dicadangkan tidak dicadangkan dicadangkan
NULL tidak dicadangkan tidak dicadangkan tidak dicadangkan
OF tidak dicadangkan tidak dicadangkan dicadangkan
AKTIF dicadangkan ketat yang tidak dicadangkan dicadangkan
ONLY dicadangkan tidak dicadangkan dicadangkan
OPTION tidak dicadangkan tidak dicadangkan tidak dicadangkan
OPSI tidak dicadangkan tidak dicadangkan tidak dicadangkan
ATAU dicadangkan tidak dicadangkan dicadangkan
ORDER dicadangkan tidak dicadangkan dicadangkan
OUT tidak dicadangkan tidak dicadangkan dicadangkan
OUTER dicadangkan tidak dicadangkan dicadangkan
OUTPUTFORMAT tidak dicadangkan tidak dicadangkan tidak dicadangkan
OVER tidak dicadangkan tidak dicadangkan tidak dicadangkan
OVERLAPS dicadangkan tidak dicadangkan dicadangkan
OVERLAY tidak dicadangkan tidak dicadangkan tidak dicadangkan
MENIMPA tidak dicadangkan tidak dicadangkan tidak dicadangkan
PARTISI tidak dicadangkan tidak dicadangkan dicadangkan
PARTITIONED tidak dicadangkan tidak dicadangkan tidak dicadangkan
PARTITIONS tidak dicadangkan tidak dicadangkan tidak dicadangkan
PERCENT tidak dicadangkan tidak dicadangkan tidak dicadangkan
PIVOT tidak dicadangkan tidak dicadangkan tidak dicadangkan
PLACING tidak dicadangkan tidak dicadangkan tidak dicadangkan
POSITION tidak dicadangkan tidak dicadangkan dicadangkan
PRECEDING tidak dicadangkan tidak dicadangkan tidak dicadangkan
PRIMARY dicadangkan tidak dicadangkan dicadangkan
PRINCIPALS tidak dicadangkan tidak dicadangkan tidak dicadangkan
PROPERTIES tidak dicadangkan tidak dicadangkan tidak dicadangkan
HAPUS MENYELURUH tidak dicadangkan tidak dicadangkan tidak dicadangkan
QUALIFY dicadangkan tidak dicadangkan dicadangkan
QUERY tidak dicadangkan tidak dicadangkan tidak dicadangkan
RANGE tidak dicadangkan tidak dicadangkan dicadangkan
RECIPIENT tidak dicadangkan tidak dicadangkan tidak dicadangkan
RECIPIENTS tidak dicadangkan tidak dicadangkan tidak dicadangkan
RECORDREADER tidak dicadangkan tidak dicadangkan tidak dicadangkan
RECORDWRITER tidak dicadangkan tidak dicadangkan tidak dicadangkan
RECOVER tidak dicadangkan tidak dicadangkan tidak dicadangkan
KURANGI tidak dicadangkan tidak dicadangkan tidak dicadangkan
REFERENCES dicadangkan tidak dicadangkan dicadangkan
REFRESH tidak dicadangkan tidak dicadangkan tidak dicadangkan
REGEXP tidak dicadangkan tidak dicadangkan bukan kata kunci
REMOVE tidak dicadangkan tidak dicadangkan tidak dicadangkan
RENAME tidak dicadangkan tidak dicadangkan tidak dicadangkan
REPAIR tidak dicadangkan tidak dicadangkan tidak dicadangkan
REPLACE tidak dicadangkan tidak dicadangkan tidak dicadangkan
ATUR ULANG tidak dicadangkan tidak dicadangkan tidak dicadangkan
RESPECT tidak dicadangkan tidak dicadangkan tidak dicadangkan
BATASI tidak dicadangkan tidak dicadangkan tidak dicadangkan
REVOKE tidak dicadangkan tidak dicadangkan dicadangkan
RIGHT dicadangkan ketat yang tidak dicadangkan dicadangkan
RLIKE tidak dicadangkan tidak dicadangkan tidak dicadangkan
PERAN tidak dicadangkan tidak dicadangkan tidak dicadangkan
ROLES tidak dicadangkan tidak dicadangkan tidak dicadangkan
ROLLBACK tidak dicadangkan tidak dicadangkan dicadangkan
ROLLUP tidak dicadangkan tidak dicadangkan dicadangkan
BARIS tidak dicadangkan tidak dicadangkan dicadangkan
ROWS tidak dicadangkan tidak dicadangkan dicadangkan
SKEMA tidak dicadangkan tidak dicadangkan tidak dicadangkan
SCHEMAS tidak dicadangkan tidak dicadangkan bukan kata kunci
SECOND tidak dicadangkan tidak dicadangkan tidak dicadangkan
SELECT dicadangkan tidak dicadangkan dicadangkan
SEMI tidak dicadangkan ketat yang tidak dicadangkan tidak dicadangkan
SEPARATED tidak dicadangkan tidak dicadangkan tidak dicadangkan
SERDE tidak dicadangkan tidak dicadangkan tidak dicadangkan
SERDEPROPERTIES tidak dicadangkan tidak dicadangkan tidak dicadangkan
SESSION_USER dicadangkan tidak dicadangkan dicadangkan
SET tidak dicadangkan tidak dicadangkan dicadangkan
SET tidak dicadangkan tidak dicadangkan tidak dicadangkan
SHARE tidak dicadangkan tidak dicadangkan tidak dicadangkan
SHARES tidak dicadangkan tidak dicadangkan tidak dicadangkan
SHOW tidak dicadangkan tidak dicadangkan tidak dicadangkan
SKEWED tidak dicadangkan tidak dicadangkan tidak dicadangkan
SOME dicadangkan tidak dicadangkan dicadangkan
SORT tidak dicadangkan tidak dicadangkan tidak dicadangkan
SORTED tidak dicadangkan tidak dicadangkan tidak dicadangkan
MULAI tidak dicadangkan tidak dicadangkan dicadangkan
STATISTICS tidak dicadangkan tidak dicadangkan tidak dicadangkan
STORED tidak dicadangkan tidak dicadangkan tidak dicadangkan
STRATIFY tidak dicadangkan tidak dicadangkan tidak dicadangkan
STRUKTUR tidak dicadangkan tidak dicadangkan tidak dicadangkan
SUBSTR tidak dicadangkan tidak dicadangkan tidak dicadangkan
SUBSTRING tidak dicadangkan tidak dicadangkan tidak dicadangkan
SYNC tidak dicadangkan tidak dicadangkan tidak dicadangkan
TABLE dicadangkan tidak dicadangkan dicadangkan
TABLES tidak dicadangkan tidak dicadangkan tidak dicadangkan
TABLESAMPLE tidak dicadangkan tidak dicadangkan dicadangkan
TBLPROPERTIES tidak dicadangkan tidak dicadangkan tidak dicadangkan
TEMP tidak dicadangkan tidak dicadangkan bukan kata kunci
SEMENTARA tidak dicadangkan tidak dicadangkan tidak dicadangkan
TERMINATED tidak dicadangkan tidak dicadangkan tidak dicadangkan
THEN dicadangkan tidak dicadangkan dicadangkan
TIME dicadangkan tidak dicadangkan dicadangkan
TO dicadangkan tidak dicadangkan dicadangkan
TOUCH tidak dicadangkan tidak dicadangkan tidak dicadangkan
TRAILING dicadangkan tidak dicadangkan dicadangkan
TRANSAKSI tidak dicadangkan tidak dicadangkan tidak dicadangkan
TRANSACTIONS tidak dicadangkan tidak dicadangkan tidak dicadangkan
TRANSFORM tidak dicadangkan tidak dicadangkan tidak dicadangkan
PANGKAS tidak dicadangkan tidak dicadangkan tidak dicadangkan
BENAR tidak dicadangkan tidak dicadangkan dicadangkan
TRUNCATE tidak dicadangkan tidak dicadangkan dicadangkan
TRY_CAST tidak dicadangkan tidak dicadangkan tidak dicadangkan
TYPE tidak dicadangkan tidak dicadangkan tidak dicadangkan
UNARCHIVE tidak dicadangkan tidak dicadangkan tidak dicadangkan
UNBOUNDED tidak dicadangkan tidak dicadangkan tidak dicadangkan
UNCACHE tidak dicadangkan tidak dicadangkan tidak dicadangkan
GABUNGAN dicadangkan ketat yang tidak dicadangkan dicadangkan
UNIQUE dicadangkan tidak dicadangkan dicadangkan
UNKNOWN dicadangkan tidak dicadangkan dicadangkan
UNLOCK tidak dicadangkan tidak dicadangkan tidak dicadangkan
UNSET tidak dicadangkan tidak dicadangkan tidak dicadangkan
UPDATE tidak dicadangkan tidak dicadangkan dicadangkan
USE tidak dicadangkan tidak dicadangkan tidak dicadangkan
USER dicadangkan tidak dicadangkan dicadangkan
USING dicadangkan ketat yang tidak dicadangkan dicadangkan
NILAI tidak dicadangkan tidak dicadangkan dicadangkan
VIEW tidak dicadangkan tidak dicadangkan tidak dicadangkan
VIEWS tidak dicadangkan tidak dicadangkan tidak dicadangkan
WHEN dicadangkan tidak dicadangkan dicadangkan
WHERE dicadangkan tidak dicadangkan dicadangkan
WINDOW tidak dicadangkan tidak dicadangkan dicadangkan
WITH dicadangkan tidak dicadangkan dicadangkan
YEAR tidak dicadangkan tidak dicadangkan tidak dicadangkan
ZONE tidak dicadangkan tidak dicadangkan tidak dicadangkan