概要
- 2021年12月1日以降、Athenaの特定のSQLクエリ構文のクエリ結果が変更になるようです。
- 今回は、その該当するクエリ構文がどのようなものかをまとめました。
該当するクエリ構文
1: CHAR 型カラムと文字列リテラルの比較の評価が容易になります。文字列リテラルにはパディングは必要ありません。
データ型 CHAR (5) の col5 という名前の列があり、列 col5 の値 'abcd ' (末尾のスペースに注意) の行が含まれている。
現在の仕様: クエリで結果を一致させるには、まったく同じ文字列リテラルを使用する必要があった。
SELECT 1 FROM t WHERE col5 = 'abcd '; (末尾にスペースが必要)
新しい仕様: 条件と一致するためにクエリの末尾にスペースを入れる必要がなくなった。
SELECT 1 FROM t WHERE col5 = 'abcd';
ちなみに、上記のクエリは両方とも一致し、現在の動作は引き続き有効な模様。
2: MAP 型の存在しないキーにアクセスすると、結果として NULL が返されるのではなく、エラーが発生する。
現在の仕様: MAP データから存在しないキー「abc」の値にアクセスする際に、キー 'abc' は MAP に存在しないため、Athena は NULL を返す。
新しい仕様: Athenaが「マップに存在しないキー:abc」を示すエラーを返す。
下記のようなクエリを発行し、NULL を返すことを望む場合は、TRY 関数を利用する。
SELECT MAP(array['foo', 'bar'], array[1, 2])['abc'];
SELECT TRY(MAP(array['foo', 'bar'], array[1, 2])['abc']);
3: 「.field [n]」形式の匿名行フィールドへのアクセスはサポートされなくなった。
現在の仕様: 匿名行のフィールドにアクセスすると、Athena は次のクエリの最初のフィールド ('a') を返す。
SELECT ROW('a', 'b').field0;
新しい仕様: Athena は「列 'ROW ('a', 'b') .field0' を解決できません」というエラーを報告する。
ただ、匿名でない行にアクセスする方法には影響しない。
次のクエリは変わらず動作し、'a' を返します。
SELECT CAST(row('a', 'b') AS ROW(col0 char, col1 char)).col0;