-- Samples of MySQL parsing


-- Comments
# standalone comment line
-- standalone comment line
SELECT 1; -- trailing comment
SELECT 1; # trailing comment
SELECT 1; /* trailing comment */
SELECT /* interruption */  /**/ 1;
 /*
    Multiline / * / comment
 */
 /* /* MySQL does not support nested comments */
SELECT 'If this line is a comment then nested commenting is enabled (and therefore broken).';


-- Optimizer hints
SELECT /*+ SEMIJOIN(FIRSTMATCH, LOOSESCAN) */ 1;
SELECT /*+ SET_VAR(foreign_key_checks=OFF) */ 1;


-- Literals
SELECT
    -- Integers
    123,

    -- Floats
    .123, 1.23, 123.,

    -- Exponents
    1e10, 1e-10, 1.e20, .1e-20,

    -- Hexadecimal
    X'0af019', x'0AF019', 0xaf019,

    -- Binary
    B'010', b'010', 0b010,

    -- Temporal literals
    {d'2020-01-01'}, { d ' 2020^01@01 ' },
    {t'8 9:10:11'}, { t ' 09:10:11.12 ' }, { t ' 091011 ' },
    {ts"2020-01-01 09:10:11"}, { ts ' 2020@01/01  09:10:11 ' },

    -- Strings
    '', 'abc', '1''2\03\%4\_5\\6\'7\"8',
    "", "abc", "1""2\03\%4\_5\\6\'7\"8",
;


-- Variables
SET @a = 1, @1 = 2, @._.$ = 3;
SET @'?' = 1, @'abc''def"`ghi' = 2;
SET @"#" = 1, @"abc""def'`ghi" = 2;
SET @`^` = 1, @`abc``def'"ghi` = 2;
SELECT
    @@timestamp,
    @@global.auto_increment_offset,
    @@session.auto_increment_offset,
    @@auto_increment_offset
;


-- Prepared statements
SELECT POW(?, 3) AS cubed;


-- Constants
SELECT TRUE, FALSE, NULL, UNKNOWN;


-- Data types
CREATE TABLE table1 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20) NOT NULL,
    birthyear YEAR
);


-- Keywords
INSERT INTO table1 (person, birthyear) VALUES ('abc', 2020);

WITH RECURSIVE example (n) AS (
    SELECT 1
    UNION ALL
    SELECT n + 1 FROM example
    WHERE n < 10
)
SELECT n FROM example;

SELECT 17 MEMBER OF ('[23, "abc", 17, "ab", 10]');


-- Functions
SELECT CONCAT('function');
SELECT MAX(quantity) FROM example;


-- Schema object names
CREATE TABLE basic (
    example INT,
    股票编号 INT,
    `select` INT,
    `concat(` INT
);

SELECT e1.`apple` AS a, `example2`.b
FROM example1 AS e1
JOIN example2 e2
ON `example1`.`a``b` = e2.`123`;


-- Operators
SELECT 1 + 2 - 3 << 2;
SELECT 1::DECIMAL(5, 2);
SET @a = 1;
SET a := 1;
SELECT c->>'$.name' FROM example;



-- Exceptions
CREATE TABLE t1
(
    c1 VARCHAR(5) CHARACTER SET latin1,
    c2 SET('r', 'g', 'b')
);


-- Introducers
SELECT _latin1'abc';
SELECT _binary'abc';
