1<?php
2/**
3 * `SET` statement.
4 */
5
6declare(strict_types=1);
7
8namespace PhpMyAdmin\SqlParser\Statements;
9
10use PhpMyAdmin\SqlParser\Components\OptionsArray;
11use PhpMyAdmin\SqlParser\Components\SetOperation;
12use PhpMyAdmin\SqlParser\Statement;
13
14use function trim;
15
16/**
17 * `SET` statement.
18 */
19class SetStatement extends Statement
20{
21    /**
22     * The clauses of this statement, in order.
23     *
24     * @see Statement::$CLAUSES
25     *
26     * @var array
27     */
28    public static $CLAUSES = [
29        'SET' => [
30            'SET',
31            3,
32        ],
33        '_END_OPTIONS' => [
34            '_END_OPTIONS',
35            1,
36        ],
37    ];
38
39    /**
40     * Possible exceptions in SET statement.
41     *
42     * @var array
43     */
44    public static $OPTIONS = [
45        'CHARSET' => [
46            3,
47            'var',
48        ],
49        'CHARACTER SET' => [
50            3,
51            'var',
52        ],
53        'NAMES' => [
54            3,
55            'var',
56        ],
57        'PASSWORD' => [
58            3,
59            'expr',
60        ],
61        'SESSION' => 3,
62        'GLOBAL' => 3,
63        'PERSIST' => 3,
64        'PERSIST_ONLY' => 3,
65        '@@SESSION' => 3,
66        '@@GLOBAL' => 3,
67        '@@PERSIST' => 3,
68        '@@PERSIST_ONLY' => 3,
69    ];
70
71    /** @var array */
72    public static $END_OPTIONS = [
73        'COLLATE' => [
74            1,
75            'var',
76        ],
77        'DEFAULT' => 1,
78    ];
79
80    /**
81     * Options used in current statement.
82     *
83     * @var OptionsArray[]
84     */
85    public $options;
86
87    /**
88     * The end options of this query.
89     *
90     * @see static::$END_OPTIONS
91     *
92     * @var OptionsArray
93     */
94    public $end_options;
95
96    /**
97     * The updated values.
98     *
99     * @var SetOperation[]
100     */
101    public $set;
102
103    /**
104     * @return string
105     */
106    public function build()
107    {
108        $ret = 'SET ' . OptionsArray::build($this->options)
109            . ' ' . SetOperation::build($this->set)
110            . ' ' . OptionsArray::build($this->end_options);
111
112        return trim($ret);
113    }
114}
115