# LogicTest: local

statement ok
CREATE TABLE kv (
  k VARCHAR PRIMARY KEY,
  v VARCHAR,
  UNIQUE INDEX a (v),
  FAMILY (k),
  FAMILY (v)
)

statement ok
INSERT INTO kv VALUES ('A');
INSERT INTO kv (k) VALUES ('nil1');
INSERT INTO kv (k) VALUES ('nil2');
INSERT INTO kv VALUES ('nil3', NULL);
INSERT INTO kv VALUES ('nil4', NULL);
INSERT INTO kv (k,v) VALUES ('a', 'b'), ('c', 'd');

query T
SELECT v || 'hello' FROM [INSERT INTO kv VALUES ('e', 'f'), ('g', '') RETURNING v]
----
fhello
hello

statement ok
SET tracing = on,kv,results; SELECT * FROM kv; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/primary/'A' -> NULL
output row: ['A' NULL]
fetched: /kv/primary/'a' -> NULL
fetched: /kv/primary/'a'/v -> 'b'
output row: ['a' 'b']
fetched: /kv/primary/'c' -> NULL
fetched: /kv/primary/'c'/v -> 'd'
output row: ['c' 'd']
fetched: /kv/primary/'e' -> NULL
fetched: /kv/primary/'e'/v -> 'f'
output row: ['e' 'f']
fetched: /kv/primary/'g' -> NULL
fetched: /kv/primary/'g'/v -> ''
output row: ['g' '']
fetched: /kv/primary/'nil1' -> NULL
output row: ['nil1' NULL]
fetched: /kv/primary/'nil2' -> NULL
output row: ['nil2' NULL]
fetched: /kv/primary/'nil3' -> NULL
output row: ['nil3' NULL]
fetched: /kv/primary/'nil4' -> NULL
output row: ['nil4' NULL]

statement ok
SET tracing = on,kv,results; SELECT * FROM kv@a; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/a/NULL -> /'A'
output row: ['A' NULL]
fetched: /kv/a/NULL -> /'nil1'
output row: ['nil1' NULL]
fetched: /kv/a/NULL -> /'nil2'
output row: ['nil2' NULL]
fetched: /kv/a/NULL -> /'nil3'
output row: ['nil3' NULL]
fetched: /kv/a/NULL -> /'nil4'
output row: ['nil4' NULL]
fetched: /kv/a/'' -> /'g'
output row: ['g' '']
fetched: /kv/a/'b' -> /'a'
output row: ['a' 'b']
fetched: /kv/a/'d' -> /'c'
output row: ['c' 'd']
fetched: /kv/a/'f' -> /'e'
output row: ['e' 'f']

statement error pgcode 23505 duplicate key value \(v\)=\('f'\) violates unique constraint "a"
INSERT INTO kv VALUES ('h', 'f')

statement ok
SET tracing = on,kv,results; SELECT * FROM kv; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/primary/'A' -> NULL
output row: ['A' NULL]
fetched: /kv/primary/'a' -> NULL
fetched: /kv/primary/'a'/v -> 'b'
output row: ['a' 'b']
fetched: /kv/primary/'c' -> NULL
fetched: /kv/primary/'c'/v -> 'd'
output row: ['c' 'd']
fetched: /kv/primary/'e' -> NULL
fetched: /kv/primary/'e'/v -> 'f'
output row: ['e' 'f']
fetched: /kv/primary/'g' -> NULL
fetched: /kv/primary/'g'/v -> ''
output row: ['g' '']
fetched: /kv/primary/'nil1' -> NULL
output row: ['nil1' NULL]
fetched: /kv/primary/'nil2' -> NULL
output row: ['nil2' NULL]
fetched: /kv/primary/'nil3' -> NULL
output row: ['nil3' NULL]
fetched: /kv/primary/'nil4' -> NULL
output row: ['nil4' NULL]

statement ok
SET tracing = on,kv,results; SELECT * FROM kv@a; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/a/NULL -> /'A'
output row: ['A' NULL]
fetched: /kv/a/NULL -> /'nil1'
output row: ['nil1' NULL]
fetched: /kv/a/NULL -> /'nil2'
output row: ['nil2' NULL]
fetched: /kv/a/NULL -> /'nil3'
output row: ['nil3' NULL]
fetched: /kv/a/NULL -> /'nil4'
output row: ['nil4' NULL]
fetched: /kv/a/'' -> /'g'
output row: ['g' '']
fetched: /kv/a/'b' -> /'a'
output row: ['a' 'b']
fetched: /kv/a/'d' -> /'c'
output row: ['c' 'd']
fetched: /kv/a/'f' -> /'e'
output row: ['e' 'f']

statement ok
INSERT INTO kv VALUES ('f', 'g')

statement ok
SET tracing = on,kv,results; SELECT * FROM kv; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/primary/'A' -> NULL
output row: ['A' NULL]
fetched: /kv/primary/'a' -> NULL
fetched: /kv/primary/'a'/v -> 'b'
output row: ['a' 'b']
fetched: /kv/primary/'c' -> NULL
fetched: /kv/primary/'c'/v -> 'd'
output row: ['c' 'd']
fetched: /kv/primary/'e' -> NULL
fetched: /kv/primary/'e'/v -> 'f'
output row: ['e' 'f']
fetched: /kv/primary/'f' -> NULL
fetched: /kv/primary/'f'/v -> 'g'
output row: ['f' 'g']
fetched: /kv/primary/'g' -> NULL
fetched: /kv/primary/'g'/v -> ''
output row: ['g' '']
fetched: /kv/primary/'nil1' -> NULL
output row: ['nil1' NULL]
fetched: /kv/primary/'nil2' -> NULL
output row: ['nil2' NULL]
fetched: /kv/primary/'nil3' -> NULL
output row: ['nil3' NULL]
fetched: /kv/primary/'nil4' -> NULL
output row: ['nil4' NULL]

statement ok
SET tracing = on,kv,results; SELECT * FROM kv@a; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/a/NULL -> /'A'
output row: ['A' NULL]
fetched: /kv/a/NULL -> /'nil1'
output row: ['nil1' NULL]
fetched: /kv/a/NULL -> /'nil2'
output row: ['nil2' NULL]
fetched: /kv/a/NULL -> /'nil3'
output row: ['nil3' NULL]
fetched: /kv/a/NULL -> /'nil4'
output row: ['nil4' NULL]
fetched: /kv/a/'' -> /'g'
output row: ['g' '']
fetched: /kv/a/'b' -> /'a'
output row: ['a' 'b']
fetched: /kv/a/'d' -> /'c'
output row: ['c' 'd']
fetched: /kv/a/'f' -> /'e'
output row: ['e' 'f']
fetched: /kv/a/'g' -> /'f'
output row: ['f' 'g']

statement error duplicate key value \(v\)=\('g'\) violates unique constraint "a"
INSERT INTO kv VALUES ('h', 'g')

statement ok
SET tracing = on,kv,results; SELECT * FROM kv; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/primary/'A' -> NULL
output row: ['A' NULL]
fetched: /kv/primary/'a' -> NULL
fetched: /kv/primary/'a'/v -> 'b'
output row: ['a' 'b']
fetched: /kv/primary/'c' -> NULL
fetched: /kv/primary/'c'/v -> 'd'
output row: ['c' 'd']
fetched: /kv/primary/'e' -> NULL
fetched: /kv/primary/'e'/v -> 'f'
output row: ['e' 'f']
fetched: /kv/primary/'f' -> NULL
fetched: /kv/primary/'f'/v -> 'g'
output row: ['f' 'g']
fetched: /kv/primary/'g' -> NULL
fetched: /kv/primary/'g'/v -> ''
output row: ['g' '']
fetched: /kv/primary/'nil1' -> NULL
output row: ['nil1' NULL]
fetched: /kv/primary/'nil2' -> NULL
output row: ['nil2' NULL]
fetched: /kv/primary/'nil3' -> NULL
output row: ['nil3' NULL]
fetched: /kv/primary/'nil4' -> NULL
output row: ['nil4' NULL]

statement ok
SET tracing = on,kv,results; SELECT * FROM kv@a; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv/a/NULL -> /'A'
output row: ['A' NULL]
fetched: /kv/a/NULL -> /'nil1'
output row: ['nil1' NULL]
fetched: /kv/a/NULL -> /'nil2'
output row: ['nil2' NULL]
fetched: /kv/a/NULL -> /'nil3'
output row: ['nil3' NULL]
fetched: /kv/a/NULL -> /'nil4'
output row: ['nil4' NULL]
fetched: /kv/a/'' -> /'g'
output row: ['g' '']
fetched: /kv/a/'b' -> /'a'
output row: ['a' 'b']
fetched: /kv/a/'d' -> /'c'
output row: ['c' 'd']
fetched: /kv/a/'f' -> /'e'
output row: ['e' 'f']
fetched: /kv/a/'g' -> /'f'
output row: ['f' 'g']

statement ok
CREATE TABLE kv5 (
  k CHAR PRIMARY KEY,
  v CHAR,
  UNIQUE INDEX a (v, k)
)

statement ok
INSERT INTO kv5 VALUES ('a', NULL)

statement ok
SET tracing = on,kv,results; SELECT * FROM kv5@a; SET tracing = off

query T
SELECT message FROM [SHOW KV TRACE FOR SESSION]
 WHERE message LIKE 'fetched:%' OR message LIKE 'output row%'
----
fetched: /kv5/a/NULL/'a' -> NULL
output row: ['a' NULL]

statement ok
CREATE TABLE insert_t (x INT, v INT)

statement ok
CREATE TABLE select_t (x INT, v INT)

# Check that INSERT supports ORDER BY (MySQL extension)
query TTT
SELECT tree, field, description FROM [
EXPLAIN (VERBOSE) INSERT INTO insert_t TABLE select_t ORDER BY v DESC
]
----
count                     ·          ·
 └── insert               ·          ·
      │                   into       insert_t(x, v, rowid)
      │                   strategy   inserter
      │                   default 0  NULL
      │                   default 1  NULL
      │                   default 2  unique_rowid()
      └── sort            ·          ·
           │              order      -v
           └── render     ·          ·
                │         render 0   test.public.select_t.x
                │         render 1   test.public.select_t.v
                └── scan  ·          ·
·                         table      select_t@primary
·                         spans      ALL

# Check that INSERT supports LIMIT (MySQL extension)
query TTT
SELECT tree, field, description FROM [
EXPLAIN (VERBOSE) INSERT INTO insert_t SELECT * FROM select_t LIMIT 1
]
----
count                     ·          ·
 └── insert               ·          ·
      │                   into       insert_t(x, v, rowid)
      │                   strategy   inserter
      │                   default 0  NULL
      │                   default 1  NULL
      │                   default 2  unique_rowid()
      └── limit           ·          ·
           │              count      1
           └── render     ·          ·
                │         render 0   test.public.select_t.x
                │         render 1   test.public.select_t.v
                └── scan  ·          ·
·                         table      select_t@primary
·                         spans      ALL
·                         limit      1

# Check the grouping of LIMIT and ORDER BY
query TTT
EXPLAIN (PLAN) INSERT INTO insert_t VALUES (1,1), (2,2) LIMIT 1
----
count                  ·         ·
 └── insert            ·         ·
      │                into      insert_t(x, v, rowid)
      │                strategy  inserter
      └── limit        ·         ·
           │           count     1
           └── values  ·         ·
·                      size      2 columns, 2 rows

query TTT
EXPLAIN (PLAN) INSERT INTO insert_t VALUES (1,1), (2,2) ORDER BY 2 LIMIT 1
----
count                       ·         ·
 └── insert                 ·         ·
      │                     into      insert_t(x, v, rowid)
      │                     strategy  inserter
      └── limit             ·         ·
           │                count     1
           └── sort         ·         ·
                │           order     +column2
                └── values  ·         ·
·                           size      2 columns, 2 rows

query TTT
EXPLAIN (PLAN) INSERT INTO insert_t (VALUES (1,1), (2,2) ORDER BY 2) LIMIT 1
----
count                       ·         ·
 └── insert                 ·         ·
      │                     into      insert_t(x, v, rowid)
      │                     strategy  inserter
      └── limit             ·         ·
           │                count     1
           └── sort         ·         ·
                │           order     +column2
                └── values  ·         ·
·                           size      2 columns, 2 rows

query TTT
EXPLAIN (PLAN) INSERT INTO insert_t (VALUES (1,1), (2,2) ORDER BY 2 LIMIT 1)
----
count                       ·         ·
 └── insert                 ·         ·
      │                     into      insert_t(x, v, rowid)
      │                     strategy  inserter
      └── limit             ·         ·
           │                count     1
           └── sort         ·         ·
                │           order     +column2
                └── values  ·         ·
·                           size      2 columns, 2 rows
