|
1 | 1 | defmodule Ch.VariantTest do |
2 | 2 | use ExUnit.Case |
3 | 3 |
|
| 4 | + # https://clickhouse.com/docs/sql-reference/data-types/variant |
| 5 | + |
4 | 6 | @moduletag :variant |
5 | 7 |
|
6 | 8 | setup do |
7 | 9 | conn = start_supervised!({Ch, database: Ch.Test.database()}) |
8 | 10 | {:ok, conn: conn} |
9 | 11 | end |
10 | 12 |
|
11 | | - test "it works", %{conn: conn} do |
| 13 | + test "basic", %{conn: conn} do |
12 | 14 | assert Ch.query!(conn, "select null::Variant(UInt64, String, Array(UInt64))").rows == [[nil]] |
13 | 15 | assert Ch.query!(conn, "select [1]::Variant(UInt64, String, Array(UInt64))").rows == [[[1]]] |
14 | 16 | assert Ch.query!(conn, "select 0::Variant(UInt64, String, Array(UInt64))").rows == [[0]] |
15 | 17 |
|
16 | 18 | assert Ch.query!(conn, "select 'Hello, World!'::Variant(UInt64, String, Array(UInt64))").rows == |
17 | 19 | [["Hello, World!"]] |
18 | 20 | end |
| 21 | + |
| 22 | + test "with a table", %{conn: conn} do |
| 23 | + # https://clickhouse.com/docs/sql-reference/data-types/variant#creating-variant |
| 24 | + Ch.query!(conn, """ |
| 25 | + CREATE TABLE variant_test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; |
| 26 | + """) |
| 27 | + |
| 28 | + on_exit(fn -> Ch.Test.query("DROP TABLE variant_test", [], database: Ch.Test.database()) end) |
| 29 | + |
| 30 | + Ch.query!( |
| 31 | + conn, |
| 32 | + "INSERT INTO variant_test VALUES (NULL), (42), ('Hello, World!'), ([1, 2, 3]);" |
| 33 | + ) |
| 34 | + |
| 35 | + assert Ch.query!(conn, "SELECT v FROM variant_test").rows == [ |
| 36 | + [nil], |
| 37 | + [42], |
| 38 | + ["Hello, World!"], |
| 39 | + [[1, 2, 3]] |
| 40 | + ] |
| 41 | + |
| 42 | + # https://clickhouse.com/docs/sql-reference/data-types/variant#reading-variant-nested-types-as-subcolumns |
| 43 | + assert Ch.query!(conn, "SELECT v, v.String, v.UInt64, v.`Array(UInt64)` FROM variant_test;").rows == |
| 44 | + [ |
| 45 | + [nil, nil, nil, []], |
| 46 | + [42, nil, 42, []], |
| 47 | + ["Hello, World!", "Hello, World!", nil, []], |
| 48 | + [[1, 2, 3], nil, nil, [1, 2, 3]] |
| 49 | + ] |
| 50 | + |
| 51 | + assert Ch.query!( |
| 52 | + conn, |
| 53 | + "SELECT v, variantElement(v, 'String'), variantElement(v, 'UInt64'), variantElement(v, 'Array(UInt64)') FROM variant_test;" |
| 54 | + ).rows == [ |
| 55 | + [nil, nil, nil, []], |
| 56 | + [42, nil, 42, []], |
| 57 | + ["Hello, World!", "Hello, World!", nil, []], |
| 58 | + [[1, 2, 3], nil, nil, [1, 2, 3]] |
| 59 | + ] |
| 60 | + end |
| 61 | + |
| 62 | + test "rowbinary", %{conn: conn} do |
| 63 | + Ch.query!(conn, """ |
| 64 | + CREATE TABLE variant_test (v Variant(UInt64, String, Array(UInt64))) ENGINE = Memory; |
| 65 | + """) |
| 66 | + |
| 67 | + on_exit(fn -> Ch.Test.query("DROP TABLE variant_test", [], database: Ch.Test.database()) end) |
| 68 | + |
| 69 | + Ch.query!( |
| 70 | + conn, |
| 71 | + "INSERT INTO variant_test FORMAT RowBinary", |
| 72 | + [[nil], [42], ["Hello, World!"], [[1, 2, 3]]], |
| 73 | + types: ["Variant(UInt64, String, Array(UInt64))"] |
| 74 | + ) |
| 75 | + |
| 76 | + assert Ch.query!(conn, "SELECT v FROM variant_test").rows == [ |
| 77 | + [nil], |
| 78 | + [42], |
| 79 | + ["Hello, World!"], |
| 80 | + [[1, 2, 3]] |
| 81 | + ] |
| 82 | + end |
19 | 83 | end |
0 commit comments