==================
Simple insert
==================

INSERT INTO my_table
VALUES('foo','bar', 3);

---

(program
 (statement
  (insert
   (keyword_insert)
   (keyword_into)
   (insert_expression
    (table_reference name: (identifier))
    (keyword_values)
    (list
     (literal)
     (literal)
     (literal))))))

==================
Simple insert with column ordering
==================

REPLACE INTO my_table (name, id, year)
VALUES ('foo', 123, '2020');

---

(program
 (statement
  (insert
   (keyword_replace)
   (keyword_into)
   (insert_expression
    (table_reference name: (identifier))
    (column_list
     (column name: (identifier))
     (column name: (identifier))
     (column name: (identifier)))
    (keyword_values)
    (list
     (literal)
     (literal)
     (literal))))))

==================
Insert-select
==================

INSERT INTO my_table (a, b, c)
SELECT a, b, c
FROM my_other_table;

---

(program
 (statement
  (insert
   (keyword_insert)
   (keyword_into)
   (insert_expression
    (table_reference name: (identifier))
    (column_list
     (column name: (identifier))
     (column name: (identifier))
     (column name: (identifier)))
    (select
     (keyword_select)
     (select_expression
      (field name: (identifier))
      (field name: (identifier))
      (field name: (identifier))))
    (from (keyword_from) (table_expression name: (identifier)))))))

==================
Insert returning
==================

INSERT INTO my_table
VALUES('foo','bar', 3)
RETURNING *;

---

(program
 (statement
  (insert
   (keyword_insert)
   (keyword_into)
   (insert_expression
    (table_reference name: (identifier))
    (keyword_values)
    (list
     (literal)
     (literal)
     (literal))))
  (returning
   (keyword_returning)
   (select_expression
    (all_fields)))))

==================
Insert returning single column
==================

INSERT INTO my_table
VALUES('foo','bar', 3)
RETURNING id;

---

(program
 (statement
  (insert
   (keyword_insert)
   (keyword_into)
   (insert_expression
    (table_reference name: (identifier))
    (keyword_values)
    (list
     (literal)
     (literal)
     (literal))))
  (returning
   (keyword_returning)
   (select_expression
    (field name: (identifier))))))

==================
Insert returning multiple defined columns
==================

INSERT INTO my_table
VALUES('foo','bar', 3)
RETURNING id, val1, val2;

---

(program
 (statement
  (insert
   (keyword_insert)
   (keyword_into)
   (insert_expression
    (table_reference name: (identifier))
    (keyword_values)
    (list
     (literal)
     (literal)
     (literal))))
  (returning
   (keyword_returning)
   (select_expression
    (field name: (identifier))
    (field name: (identifier))
    (field name: (identifier))))))
