diff --git a/.gitattributes b/.gitattributes index c9f5c8632e..50ccb780f5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -139,3 +139,5 @@ sql/postgresql/examples.errors/** linguist-vendored v/failed_examples/** linguist-vendored lua/examples/* eol=lf + +sql/mysql/Oracle/examples/*.sql eol=lf diff --git a/sql/mysql/Oracle/Antlr4ng/MySQLLexerBase.ts b/sql/mysql/Oracle/Antlr4ng/MySQLLexerBase.ts new file mode 100644 index 0000000000..036674d09e --- /dev/null +++ b/sql/mysql/Oracle/Antlr4ng/MySQLLexerBase.ts @@ -0,0 +1,538 @@ +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +/* eslint-disable no-underscore-dangle */ +/* cspell: ignore antlr, longlong, ULONGLONG, MAXDB */ + +import { Lexer, Token } from "antlr4ng"; +import { MySQLLexer } from "./MySQLLexer.js"; + +/** SQL modes that control parsing behavior. */ +export enum SqlMode { + NoMode, + AnsiQuotes, + HighNotPrecedence, + PipesAsConcat, + IgnoreSpace, + NoBackslashEscapes, +} + +/** The base lexer class provides a number of functions needed in actions in the lexer (grammar). */ +export abstract class MySQLLexerBase extends Lexer { + public serverVersion = 0; + public sqlModes = new Set(); + + /** Enable Multi Language Extension support. */ + public supportMle = true; + + public charSets: Set = new Set(); // Used to check repertoires. + protected inVersionComment = false; + + private pendingTokens: Token[] = []; + + static #longString = "2147483647"; + static #longLength = 10; + static #signedLongString = "-2147483648"; + static #longLongString = "9223372036854775807"; + static #longLongLength = 19; + static #signedLongLongString = "-9223372036854775808"; + static #signedLongLongLength = 19; + static #unsignedLongLongString = "18446744073709551615"; + static #unsignedLongLongLength = 20; + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public isSqlModeActive(mode: SqlMode): boolean { + return this.sqlModes.has(mode); + } + + /** + * Converts a mode string into individual mode flags. + * + * @param modes The input string to parse. + */ + public sqlModeFromString(modes: string): void { + this.sqlModes = new Set(); + + const parts = modes.toUpperCase().split(","); + parts.forEach((mode: string) => { + if (mode === "ANSI" || mode === "DB2" || mode === "MAXDB" || mode === "MSSQL" || mode === "ORACLE" || + mode === "POSTGRESQL") { + this.sqlModes.add(SqlMode.AnsiQuotes).add(SqlMode.PipesAsConcat).add(SqlMode.IgnoreSpace); + } else if (mode === "ANSI_QUOTES") { + this.sqlModes.add(SqlMode.AnsiQuotes); + } else if (mode === "PIPES_AS_CONCAT") { + this.sqlModes.add(SqlMode.PipesAsConcat); + } else if (mode === "NO_BACKSLASH_ESCAPES") { + this.sqlModes.add(SqlMode.NoBackslashEscapes); + } else if (mode === "IGNORE_SPACE") { + this.sqlModes.add(SqlMode.IgnoreSpace); + } else if (mode === "HIGH_NOT_PRECEDENCE" || mode === "MYSQL323" || mode === "MYSQL40") { + this.sqlModes.add(SqlMode.HighNotPrecedence); + } + }); + } + + /** + * Resets the lexer by setting initial values to transient member, resetting the input stream position etc. + */ + public reset(): void { + this.inVersionComment = false; + super.reset(); + } + + /** + * Implements the multi token feature required in our lexer. + * A lexer rule can emit more than a single token, if needed. + * + * @returns The next token in the token stream. + */ + public nextToken(): Token { + // First respond with pending tokens to the next token request, if there are any. + let pending = this.pendingTokens.shift(); + if (pending) { + return pending; + } + + // Let the main lexer class run the next token recognition. + // This might create additional tokens again. + const next = super.nextToken(); + pending = this.pendingTokens.shift(); + if (pending) { + this.pendingTokens.push(next); + + return pending; + } + + return next; + } + + /** + * Checks if the version number in the token text is less than or equal to the current server version. + * + * @param text The text from a matched token. + * @returns True if so the number matches, otherwise false. + */ + protected checkMySQLVersion(text: string): boolean { + if (text.length < 8) {// Minimum is: /*!12345 + return false; + } + + // Skip version comment introducer. + const version = parseInt(text.substring(3), 10); + if (version <= this.serverVersion) { + this.inVersionComment = true; + + return true; + } + + return false; + } + + /** + * Called when a keyword was consumed that represents an internal MySQL function and checks if that keyword is + * followed by an open parenthesis. If not then it is not considered a keyword but treated like a normal identifier. + * + * @param proposed The token type to use if the check succeeds. + * + * @returns If a function call is found then return the proposed token type, otherwise just IDENTIFIER. + */ + protected determineFunction(proposed: number): number { + // Skip any whitespace character if the sql mode says they should be ignored, + // before actually trying to match the open parenthesis. + let input = String.fromCharCode(this.inputStream.LA(1)); + if (this.isSqlModeActive(SqlMode.IgnoreSpace)) { + while (input === " " || input === "\t" || input === "\r" || input === "\n") { + this.interpreter.consume(this.inputStream); + this.channel = Lexer.HIDDEN; + this.type = MySQLLexer.WHITESPACE; + input = String.fromCharCode(this.inputStream.LA(1)); + } + } + + return input === "(" ? proposed : MySQLLexer.IDENTIFIER; + + } + + /** + * Checks the given text and determines the smallest number type from it. Code has been taken from sql_lex.cc. + * + * @param text The text to parse (which must be a number). + * + * @returns The token type for that text. + */ + protected determineNumericType(text: string): number { + // The original code checks for leading +/- but actually that can never happen, neither in the + // server parser (as a digit is used to trigger processing in the lexer) nor in our parser + // as our rules are defined without signs. But we do it anyway for maximum compatibility. + let length = text.length - 1; + if (length < MySQLLexerBase.#longLength) { // quick normal case + return MySQLLexer.INT_NUMBER; + } + + let negative = false; + let index = 0; + if (text.charAt(index) === "+") { // Remove sign and pre-zeros + ++index; + --length; + } else if (text.charAt(index) === "-") { + ++index; + --length; + negative = true; + } + + while (text.charAt(index) === "0" && length > 0) { + ++index; + --length; + } + + if (length < MySQLLexerBase.#longLength) { + return MySQLLexer.INT_NUMBER; + } + + let smaller: number; + let bigger: number; + let cmp: string; + if (negative) { + if (length === MySQLLexerBase.#longLength) { + cmp = MySQLLexerBase.#signedLongString.substring(1); + smaller = MySQLLexer.INT_NUMBER; // If <= signed_long_str + bigger = MySQLLexer.LONG_NUMBER; // If >= signed_long_str + } else if (length < MySQLLexerBase.#signedLongLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.#signedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.#signedLongLongString.substring(1); + smaller = MySQLLexer.LONG_NUMBER; // If <= signed_longlong_str + bigger = MySQLLexer.DECIMAL_NUMBER; + } + } else { + if (length === MySQLLexerBase.#longLength) { + cmp = MySQLLexerBase.#longString; + smaller = MySQLLexer.INT_NUMBER; + bigger = MySQLLexer.LONG_NUMBER; + } else if (length < MySQLLexerBase.#longLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.#longLongLength) { + if (length > MySQLLexerBase.#unsignedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } + cmp = MySQLLexerBase.#unsignedLongLongString; + smaller = MySQLLexer.ULONGLONG_NUMBER; + bigger = MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.#longLongString; + smaller = MySQLLexer.LONG_NUMBER; + bigger = MySQLLexer.ULONGLONG_NUMBER; + } + } + + let otherIndex = 0; + while (index < text.length && cmp.charAt(otherIndex++) === text.charAt(index++)) { + // + } + + return text.charAt(index - 1) <= cmp.charAt(otherIndex - 1) ? smaller : bigger; + } + + /** + * Checks if the given text corresponds to a charset defined in the server (text is preceded by an underscore). + * + * @param text The text to check. + * + * @returns UNDERSCORE_CHARSET if so, otherwise IDENTIFIER. + */ + protected checkCharset(text: string): number { + return this.charSets.has(text) ? MySQLLexer.UNDERSCORE_CHARSET : MySQLLexer.IDENTIFIER; + } + + /** + * Creates a DOT token in the token stream. + */ + protected emitDot(): void { + this.pendingTokens.push(this.tokenFactory.create([this, this.inputStream], MySQLLexer.DOT_SYMBOL, + this.text, this.channel, this.tokenStartCharIndex, this.tokenStartCharIndex, this.line, + this.column, + )); + + ++this.column; + ++this.tokenStartCharIndex; + } + + public isServerVersionLt80024(): boolean + { + return this.serverVersion < 80024; + } + + public isServerVersionGe80024(): boolean + { + return this.serverVersion >= 80024; + } + + public isServerVersionGe80011(): boolean + { + return this.serverVersion >= 80011; + } + + public isServerVersionGe80013(): boolean + { + return this.serverVersion >= 80013; + } + + public isServerVersionLt80014(): boolean + { + return this.serverVersion < 80014; + } + + public isServerVersionGe80014(): boolean + { + return this.serverVersion >= 80014; + } + + public isServerVersionGe80017(): boolean + { + return this.serverVersion >= 80017; + } + + + public isServerVersionGe80018(): boolean { return this.serverVersion >= 80018; } + + public isMasterCompressionAlgorithm(): boolean { return this.serverVersion >= 80018 && this.isServerVersionLt80024(); } + + public isServerVersionLt80031(): boolean + { + return this.serverVersion < 80031; + } + + public doLogicalOr(): void + { + this.type = this.isSqlModeActive(SqlMode.PipesAsConcat) ? MySQLLexer.CONCAT_PIPES_SYMBOL : MySQLLexer.LOGICAL_OR_OPERATOR; + } + + public doIntNumber(): void + { + this.type = this.determineNumericType(this.text); + } + + public doAdddate(): void + { + this.type = this.determineFunction(MySQLLexer.ADDDATE_SYMBOL); + } + + public doBitAnd(): void + { + this.type = this.determineFunction(MySQLLexer.BIT_AND_SYMBOL); + } + + public doBitOr(): void + { + this.type = this.determineFunction(MySQLLexer.BIT_OR_SYMBOL); + } + + public doBitXor(): void + { + this.type = this.determineFunction(MySQLLexer.BIT_XOR_SYMBOL); + } + + public doCast(): void + { + this.type = this.determineFunction(MySQLLexer.CAST_SYMBOL); + } + + public doCount(): void + { + this.type = this.determineFunction(MySQLLexer.COUNT_SYMBOL); + } + + public doCurdate(): void + { + this.type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); + } + + public doCurrentDate(): void + { + this.type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); + } + + public doCurrentTime(): void + { + this.type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); + } + + public doCurtime(): void + { + this.type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); + } + + public doDateAdd(): void + { + this.type = this.determineFunction(MySQLLexer.DATE_ADD_SYMBOL); + } + + public doDateSub(): void + { + this.type = this.determineFunction(MySQLLexer.DATE_SUB_SYMBOL); + } + + public doExtract(): void + { + this.type = this.determineFunction(MySQLLexer.EXTRACT_SYMBOL); + } + + public doGroupConcat(): void + { + this.type = this.determineFunction(MySQLLexer.GROUP_CONCAT_SYMBOL); + } + + public doMax(): void + { + this.type = this.determineFunction(MySQLLexer.MAX_SYMBOL); + } + + public doMid(): void + { + this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + } + + public doMin(): void + { + this.type = this.determineFunction(MySQLLexer.MIN_SYMBOL); + } + + public doNot(): void + { + this.type = this.isSqlModeActive(SqlMode.HighNotPrecedence) ? MySQLLexer.NOT2_SYMBOL: MySQLLexer.NOT_SYMBOL; + } + + public doNow(): void + { + this.type = this.determineFunction(MySQLLexer.NOW_SYMBOL); + } + + public doPosition(): void + { + this.type = this.determineFunction(MySQLLexer.POSITION_SYMBOL); + } + + public doSessionUser(): void + { + this.type = this.determineFunction(MySQLLexer.USER_SYMBOL); + } + + public doStddevSamp(): void + { + this.type = this.determineFunction(MySQLLexer.STDDEV_SAMP_SYMBOL); + } + + public doStddev(): void + { + this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); + } + + public doStddevPop(): void + { + this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); + } + + public doStd(): void + { + this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); + } + + public doSubdate(): void + { + this.type = this.determineFunction(MySQLLexer.SUBDATE_SYMBOL); + } + + public doSubstr(): void + { + this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + } + + public doSubstring(): void + { + this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + } + + public doSum(): void + { + this.type = this.determineFunction(MySQLLexer.SUM_SYMBOL); + } + + public doSysdate(): void + { + this.type = this.determineFunction(MySQLLexer.SYSDATE_SYMBOL); + } + + public doSystemUser(): void + { + this.type = this.determineFunction(MySQLLexer.USER_SYMBOL); + } + + public doTrim(): void + { + this.type = this.determineFunction(MySQLLexer.TRIM_SYMBOL); + } + + public doVariance(): void + { + this.type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); + } + + public doVarPop(): void + { + this.type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); + } + + public doVarSamp(): void + { + this.type = this.determineFunction(MySQLLexer.VAR_SAMP_SYMBOL); + } + + public doUnderscoreCharset(): void + { + this.type = this.checkCharset(this.text); + } + + public isVersionComment(): boolean + { + return this.checkMySQLVersion(this.text); + } + + public isBackTickQuotedId(): boolean + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public isDoubleQuotedText(): boolean + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public isSingleQuotedText(): boolean + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public startInVersionComment(): void + { + this.inVersionComment = true; + } + + public endInVersionComment(): void + { + this.inVersionComment = false; + } + + public isInVersionComment(): boolean + { + return this.inVersionComment; + } +} diff --git a/sql/mysql/Oracle/Antlr4ng/MySQLParserBase.ts b/sql/mysql/Oracle/Antlr4ng/MySQLParserBase.ts new file mode 100644 index 0000000000..3c80d99e1c --- /dev/null +++ b/sql/mysql/Oracle/Antlr4ng/MySQLParserBase.ts @@ -0,0 +1,48 @@ +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +import { Parser } from "antlr4ng"; + +import { SqlMode } from "./MySQLLexerBase.js"; + +export abstract class MySQLParserBase extends Parser { + + // To parameterize the parsing process. + public serverVersion = 0; + public sqlModes = new Set(); + + /** Enable Multi Language Extension support. */ + public supportMle = true; + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public isSqlModeActive(mode: SqlMode): boolean { + return this.sqlModes.has(mode); + } + + public isPureIdentifier(): boolean + { + return this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public isTextStringLiteral(): boolean + { + return !this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public isStoredRoutineBody(): boolean + { + return this.serverVersion >= 80032 && this.supportMle; + } + + public isSelectStatementWithInto(): boolean + { + return this.serverVersion >= 80024 && this.serverVersion < 80031; + } +} diff --git a/sql/mysql/Oracle/Antlr4ng/Test.ts b/sql/mysql/Oracle/Antlr4ng/Test.ts new file mode 100644 index 0000000000..b6384b4645 --- /dev/null +++ b/sql/mysql/Oracle/Antlr4ng/Test.ts @@ -0,0 +1,289 @@ +// Generated from trgen 0.23.7 + +import { ATNSimulator } from 'antlr4ng'; +import { BaseErrorListener } from 'antlr4ng'; +import { CharStream } from 'antlr4ng'; +import { CommonTokenStream } from 'antlr4ng'; +import { ConsoleErrorListener } from 'antlr4ng'; +import { ErrorNode } from 'antlr4ng'; +//import { InputStream } from 'antlr4ng'; +import { Parser } from 'antlr4ng'; +import { ParserRuleContext } from 'antlr4ng'; +import { ParseTree } from 'antlr4ng'; +import { Recognizer } from 'antlr4ng'; +import { RecognitionException } from 'antlr4ng'; +import { TerminalNode } from 'antlr4ng'; +import { Token } from 'antlr4ng'; +import { Trees } from 'antlr4ng'; +import { escapeWhitespace } from 'antlr4ng'; +import { readFileSync } from 'fs'; +import { writeFileSync } from 'fs'; +import { openSync } from 'fs'; +import { readSync } from 'fs'; +import { writeSync } from 'fs'; +import { closeSync } from 'fs'; +import { readFile } from 'fs/promises' +import { isToken } from 'antlr4ng'; + +import { MySQLLexer } from './MySQLLexer.js'; +import { MySQLParser } from './MySQLParser.js'; + +import { StringBuilder, emptyString, joinString, formatString, isNullOrWhiteSpace } from 'typescript-string-operations'; +import { Timer, Time, TimerOptions } from 'timer-node'; + + +function getChar() { + let buffer = Buffer.alloc(1); + var xx = 0; + try { + xx = readSync(0, buffer, 0, 1, null); + } catch (err) { + } + if (xx === 0) { + return ''; + } + return buffer.toString('utf8'); +} + + +class MyErrorListener extends ConsoleErrorListener { + _quiet: boolean; + _tee: boolean; + _output: any; + had_error: boolean; + + constructor(quiet: boolean, tee: boolean, output: any) { + super(); + this._quiet = quiet; + this._tee = tee; + this._output = output; + this.had_error = false; + } + + syntaxError(recognizer: Recognizer | null, offendingSymbol: unknown, line: number, column: number, msg: string | null, e: RecognitionException | null): void { + this.had_error = true; + if (this._tee) { + writeSync(this._output, `line ${line}:${column} ${msg}\n`); + } + if (!this._quiet) { + console.error(`line ${line}:${column} ${msg}`); + } + } +} + +var tee = false; +var show_profile = false; +var show_tree = false; +var show_tokens = false; +var show_trace = false; +var error_code = 0; +var quiet = false; +var enc = 'utf8'; +var string_instance = 0; +var prefix = ''; +var inputs: string[] = []; +var is_fns: boolean[] = []; + +function splitLines(t: string) { return t.split(/\r\n|\r|\n/); } + +function main() { + for (let i = 2; i &1 | Write-Host +} + +$(& npm install -g typescript ts-node ; $compile_exit_code = $LASTEXITCODE ) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} + +$(& npm install ; $compile_exit_code = $LASTEXITCODE ) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} + +$jarFile = Get-ChildItem ./node_modules/antlr4ng-cli/*.jar +$(& java -jar $jarFile.FullName MySQLLexer.g4 -encoding utf-8 -Dlanguage=TypeScript ; $compile_exit_code = $LASTEXITCODE) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} +$(& java -jar $jarFile.FullName MySQLParser.g4 -encoding utf-8 -Dlanguage=TypeScript ; $compile_exit_code = $LASTEXITCODE) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} + +if (Test-Path -Path "original") { + Remove-Item "original" -Recurse -Force +} + +$(& tsc -p tsconfig.json --pretty ; $compile_exit_code = $LASTEXITCODE ) | Write-Host + +exit $compile_exit_code diff --git a/sql/mysql/Oracle/Antlr4ng/build.sh b/sql/mysql/Oracle/Antlr4ng/build.sh new file mode 100644 index 0000000000..6fd9a9eabb --- /dev/null +++ b/sql/mysql/Oracle/Antlr4ng/build.sh @@ -0,0 +1,21 @@ +# Generated from trgen 0.23.7 +set -e +rm -rf node_modules package-lock.json +npm install -g typescript ts-node +npm install + +if [ -f transformGrammar.py ]; then python3 transformGrammar.py ; fi + +# Because there is no integrated build script for Dart targets, we need +# to manually look at the version in package.json and extract the +# version number. We can then use this with antlr4 to generate the +# parser and lexer. +version=`grep antlr4 package.json | awk '{print $2}' | tr -d '"' | tr -d ',' | tr -d '\r' | tr -d '\n'` + +java -jar ./node_modules/antlr4ng-cli/*.jar -encoding utf-8 -Dlanguage=TypeScript MySQLLexer.g4 +java -jar ./node_modules/antlr4ng-cli/*.jar -encoding utf-8 -Dlanguage=TypeScript MySQLParser.g4 + +rm -rf original + +tsc -p tsconfig.json --pretty +exit 0 diff --git a/sql/mysql/Oracle/Antlr4ng/transformGrammar.py b/sql/mysql/Oracle/Antlr4ng/transformGrammar.py new file mode 100644 index 0000000000..90b110076b --- /dev/null +++ b/sql/mysql/Oracle/Antlr4ng/transformGrammar.py @@ -0,0 +1,53 @@ +import sys, os, re, shutil +from glob import glob +from pathlib import Path + +def main(argv): + for file in glob("./*.g4"): + fix(file) + +def fix(file_path): + print("Altering " + file_path) + if not os.path.exists(file_path): + print(f"Could not find file: {file_path}") + sys.exit(1) + parts = os.path.split(file_path) + file_name = parts[-1] + shutil.move(file_path, file_path + ".bak") + input_file = open(file_path + ".bak",'r') + output_file = open(file_path, 'w') + for x in input_file: + if '// Insert here @header for lexer.' in x: + x = x.replace('// Insert here @header for lexer.', ''' +@header { +// Modified by transformGrammar.py +// This code is automatically inserted because it is for the Antlr4ng target. It cannot be +// in the .g4 directly, so we look for a specific comment in the .g4 and put it there. + +/* eslint-disable @typescript-eslint/no-unused-vars, no-useless-escape */ + +import { MySQLLexerBase, SqlMode } from "./MySQLLexerBase.js"; +} +''' + ) + if '// Insert here @header for parser.' in x: + x = x.replace('// Insert here @header for parser.', ''' +@header { +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable no-useless-escape, no-lone-blocks */ + +import { MySQLParserBase } from "./MySQLParserBase.js"; +import { SqlMode } from "./MySQLLexerBase.js"; +} +''' + ) + + output_file.write(x) + output_file.flush() + + print("Writing ...") + input_file.close() + output_file.close() + +if __name__ == '__main__': + main(sys.argv) diff --git a/sql/mysql/Oracle/CSharp/MySQLLexerBase.cs b/sql/mysql/Oracle/CSharp/MySQLLexerBase.cs new file mode 100644 index 0000000000..7f0e142624 --- /dev/null +++ b/sql/mysql/Oracle/CSharp/MySQLLexerBase.cs @@ -0,0 +1,408 @@ +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +/* eslint-disable no-underscore-dangle */ +/* cspell: ignore antlr, longlong, ULONGLONG, MAXDB */ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Channels; +using Antlr4.Runtime; +using static System.Net.WebRequestMethods; + +/** SQL modes that control parsing behavior. */ +public enum SqlMode { + NoMode, + AnsiQuotes, + HighNotPrecedence, + PipesAsConcat, + IgnoreSpace, + NoBackslashEscapes, +}; + +/** The base lexer class provides a number of functions needed in actions in the lexer (grammar). */ +public class MySQLLexerBase : Lexer { + public int serverVersion = 0; + public HashSet sqlModes = new HashSet(); + + /** Enable Multi Language Extension support. */ + public bool supportMle = true; + + public HashSet charSets = new HashSet(); // Used to check repertoires. + protected bool inVersionComment = false; + + private StackQueue pendingTokens = new StackQueue(); + + static string longString = "2147483647"; + static int longLength = 10; + static string signedLongString = "-2147483648"; + static string longLongString = "9223372036854775807"; + static int longLongLength = 19; + static string signedLongLongString = "-9223372036854775808"; + static int signedLongLongLength = 19; + static string unsignedLongLongString = "18446744073709551615"; + static int unsignedLongLongLength = 20; + + private bool JustEmitedDot = false; + + public override string[] RuleNames => throw new NotImplementedException(); + + public override IVocabulary Vocabulary => throw new NotImplementedException(); + + public override string GrammarFileName => throw new NotImplementedException(); + + + protected MySQLLexerBase(ICharStream input, TextWriter output, TextWriter errorOutput) + : base(input, output, errorOutput) + { + } + + public MySQLLexerBase(ICharStream input) + : base(input) + { + } + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public bool isSqlModeActive(SqlMode mode) + { + return this.sqlModes.Contains(mode); + } + + /** + * Converts a mode string into individual mode flags. + * + * @param modes The input string to parse. + */ + public void sqlModeFromString(string modes) + { + this.sqlModes = new HashSet(); + + var parts = modes.ToUpper().Split(","); + foreach (var mode in parts) + { + if (mode == "ANSI" || mode == "DB2" || mode == "MAXDB" || mode == "MSSQL" || mode == "ORACLE" || + mode == "POSTGRESQL") { + this.sqlModes.Add(SqlMode.AnsiQuotes); + this.sqlModes.Add(SqlMode.PipesAsConcat); + this.sqlModes.Add(SqlMode.IgnoreSpace); + } else if (mode == "ANSI_QUOTES") { + this.sqlModes.Add(SqlMode.AnsiQuotes); + } else if (mode == "PIPES_AS_CONCAT") { + this.sqlModes.Add(SqlMode.PipesAsConcat); + } else if (mode == "NO_BACKSLASH_ESCAPES") { + this.sqlModes.Add(SqlMode.NoBackslashEscapes); + } else if (mode == "IGNORE_SPACE") { + this.sqlModes.Add(SqlMode.IgnoreSpace); + } else if (mode == "HIGH_NOT_PRECEDENCE" || mode == "MYSQL323" || mode == "MYSQL40") { + this.sqlModes.Add(SqlMode.HighNotPrecedence); + } + } + } + + /** + * Resets the lexer by setting initial values to transient member, resetting the input stream position etc. + */ + public override void Reset() + { + this.inVersionComment = false; + base.Reset(); + } + + /** + * Implements the multi token feature required in our lexer. + * A lexer rule can emit more than a single token, if needed. + * + * @returns The next token in the token stream. + */ + public override IToken NextToken() + { + // First respond with pending tokens to the next token request, if there are any. + var pending = this.pendingTokens.DequeueBottom(); + if (pending != null) { + return pending; + } + + // Let the main lexer class run the next token recognition. + // This might create additional tokens again. + var next = base.NextToken(); + + pending = this.pendingTokens.DequeueBottom(); + if (pending != null) { + this.pendingTokens.Push(next); + + return pending; + } + + return next; + } + + /** + * Checks if the version number in the token text is less than or equal to the current server version. + * + * @param text The text from a matched token. + * @returns True if so the number matches, otherwise false. + */ + protected bool checkMySQLVersion(string text) + { + if (text.Length < 8) {// Minimum is: /*!12345 + return false; + } + + // Skip version comment introducer. + var version = Int32.Parse(text.Substring(3)); + if (version <= this.serverVersion) { + this.inVersionComment = true; + + return true; + } + + return false; + } + + /** + * Called when a keyword was consumed that represents an internal MySQL function and checks if that keyword is + * followed by an open parenthesis. If not then it is not considered a keyword but treated like a normal identifier. + * + * @param proposed The token type to use if the check succeeds. + * + * @returns If a function call is found then return the proposed token type, otherwise just IDENTIFIER. + */ + protected int determineFunction(int proposed) + { + // Skip any whitespace character if the sql mode says they should be ignored, + // before actually trying to match the open parenthesis. + var input = (char)this.InputStream.LA(1); + if (this.isSqlModeActive(SqlMode.IgnoreSpace)) { + while (input == ' ' || input == '\t' || input == '\r' || input == '\n') { + this.Interpreter.Consume((ICharStream)this.InputStream); + this.Channel = Hidden; + this.Type = MySQLLexer.WHITESPACE; + input = (char)this.InputStream.LA(1); + } + } + + return input == '(' ? proposed : MySQLLexer.IDENTIFIER; + + } + + /** + * Checks the given text and determines the smallest number type from it. Code has been taken from sql_lex.cc. + * + * @param text The text to parse (which must be a number). + * + * @returns The token type for that text. + */ + protected int determineNumericType(string text) + { + // The original code checks for leading +/- but actually that can never happen, neither in the + // server parser (as a digit is used to trigger processing in the lexer) nor in our parser + // as our rules are defined without signs. But we do it anyway for maximum compatibility. + var length = text.Length - 1; + if (length < MySQLLexerBase.longLength) { // quick normal case + return MySQLLexer.INT_NUMBER; + } + + var negative = false; + var index = 0; + if (text[index] == '+') { // Remove sign and pre-zeros + ++index; + --length; + } else if (text[index] == '-') { + ++index; + --length; + negative = true; + } + + while (text[index] == '0' && length > 0) { + ++index; + --length; + } + + if (length < MySQLLexerBase.longLength) { + return MySQLLexer.INT_NUMBER; + } + + int smaller; + int bigger; + string cmp; + if (negative) { + if (length == MySQLLexerBase.longLength) { + cmp = MySQLLexerBase.signedLongString.Substring(1); + smaller = MySQLLexer.INT_NUMBER; // If <= signed_long_str + bigger = MySQLLexer.LONG_NUMBER; // If >= signed_long_str + } else if (length < MySQLLexerBase.signedLongLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.signedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.signedLongLongString.Substring(1); + smaller = MySQLLexer.LONG_NUMBER; // If <= signed_longlong_str + bigger = MySQLLexer.DECIMAL_NUMBER; + } + } else { + if (length == MySQLLexerBase.longLength) { + cmp = MySQLLexerBase.longString; + smaller = MySQLLexer.INT_NUMBER; + bigger = MySQLLexer.LONG_NUMBER; + } else if (length < MySQLLexerBase.longLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.longLongLength) { + if (length > MySQLLexerBase.unsignedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } + cmp = MySQLLexerBase.unsignedLongLongString; + smaller = MySQLLexer.ULONGLONG_NUMBER; + bigger = MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.longLongString; + smaller = MySQLLexer.LONG_NUMBER; + bigger = MySQLLexer.ULONGLONG_NUMBER; + } + } + + var otherIndex = 0; + while (index < text.Length && cmp[otherIndex++] == text[index++]) { + // + } + + return text[index - 1] <= cmp[otherIndex - 1] ? smaller : bigger; + } + + /** + * Checks if the given text corresponds to a charset defined in the server (text is preceded by an underscore). + * + * @param text The text to check. + * + * @returns UNDERSCORE_CHARSET if so, otherwise IDENTIFIER. + */ + protected int checkCharset(string text) + { + return this.charSets.Contains(text) ? MySQLLexer.UNDERSCORE_CHARSET : MySQLLexer.IDENTIFIER; + } + + /** + * Creates a DOT token in the token stream. + */ + protected void emitDot() + { + this.pendingTokens.Push(this.TokenFactory.Create(new Tuple(this, (ICharStream)this.InputStream), MySQLLexer.DOT_SYMBOL, + this.Text, this.Channel, this.TokenStartCharIndex, this.TokenStartCharIndex, this.Line, + this.Column + )); + + ++this.Column; + this.JustEmitedDot = true; + } + + + // Version-related methods + public bool isServerVersionLt80024() => serverVersion < 80024; + public bool isServerVersionGe80024() => serverVersion >= 80024; + public bool isServerVersionGe80011() => serverVersion >= 80011; + public bool isServerVersionGe80013() => serverVersion >= 80013; + public bool isServerVersionLt80014() => serverVersion < 80014; + public bool isServerVersionGe80014() => serverVersion >= 80014; + public bool isServerVersionGe80017() => serverVersion >= 80017; + public bool isServerVersionGe80018() => serverVersion >= 80018; + + public bool isMasterCompressionAlgorithm() => serverVersion >= 80018 && isServerVersionLt80024(); + + public bool isServerVersionLt80031() => serverVersion < 80031; + + // Functions for specific token types + public void doLogicalOr() + { + Type = isSqlModeActive(SqlMode.PipesAsConcat) ? MySQLLexer.CONCAT_PIPES_SYMBOL : MySQLLexer.LOGICAL_OR_OPERATOR; + } + + public void doIntNumber() + { + Type = determineNumericType(Text); + } + + public void doAdddate() => Type = determineFunction(MySQLLexer.ADDDATE_SYMBOL); + public void doBitAnd() => Type = determineFunction(MySQLLexer.BIT_AND_SYMBOL); + public void doBitOr() => Type = determineFunction(MySQLLexer.BIT_OR_SYMBOL); + public void doBitXor() => Type = determineFunction(MySQLLexer.BIT_XOR_SYMBOL); + public void doCast() => Type = determineFunction(MySQLLexer.CAST_SYMBOL); + public void doCount() => Type = determineFunction(MySQLLexer.COUNT_SYMBOL); + public void doCurdate() => Type = determineFunction(MySQLLexer.CURDATE_SYMBOL); + public void doCurrentDate() => Type = determineFunction(MySQLLexer.CURDATE_SYMBOL); + public void doCurrentTime() => Type = determineFunction(MySQLLexer.CURTIME_SYMBOL); + public void doCurtime() => Type = determineFunction(MySQLLexer.CURTIME_SYMBOL); + public void doDateAdd() => Type = determineFunction(MySQLLexer.DATE_ADD_SYMBOL); + public void doDateSub() => Type = determineFunction(MySQLLexer.DATE_SUB_SYMBOL); + public void doExtract() => Type = determineFunction(MySQLLexer.EXTRACT_SYMBOL); + public void doGroupConcat() => Type = determineFunction(MySQLLexer.GROUP_CONCAT_SYMBOL); + public void doMax() => Type = determineFunction(MySQLLexer.MAX_SYMBOL); + public void doMid() => Type = determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + public void doMin() => Type = determineFunction(MySQLLexer.MIN_SYMBOL); + public void doNot() => Type = isSqlModeActive(SqlMode.HighNotPrecedence) ? MySQLLexer.NOT2_SYMBOL : MySQLLexer.NOT_SYMBOL; + public void doNow() => Type = determineFunction(MySQLLexer.NOW_SYMBOL); + public void doPosition() => Type = determineFunction(MySQLLexer.POSITION_SYMBOL); + public void doSessionUser() => Type = determineFunction(MySQLLexer.USER_SYMBOL); + public void doStddevSamp() => Type = determineFunction(MySQLLexer.STDDEV_SAMP_SYMBOL); + public void doStddev() => Type = determineFunction(MySQLLexer.STD_SYMBOL); + public void doStddevPop() => Type = determineFunction(MySQLLexer.STD_SYMBOL); + public void doStd() => Type = determineFunction(MySQLLexer.STD_SYMBOL); + public void doSubdate() => Type = determineFunction(MySQLLexer.SUBDATE_SYMBOL); + public void doSubstr() => Type = determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + public void doSubstring() => Type = determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + public void doSum() => Type = determineFunction(MySQLLexer.SUM_SYMBOL); + public void doSysdate() => Type = determineFunction(MySQLLexer.SYSDATE_SYMBOL); + public void doSystemUser() => Type = determineFunction(MySQLLexer.USER_SYMBOL); + public void doTrim() => Type = determineFunction(MySQLLexer.TRIM_SYMBOL); + public void doVariance() => Type = determineFunction(MySQLLexer.VARIANCE_SYMBOL); + public void doVarPop() => Type = determineFunction(MySQLLexer.VARIANCE_SYMBOL); + public void doVarSamp() => Type = determineFunction(MySQLLexer.VAR_SAMP_SYMBOL); + public void doUnderscoreCharset() => Type = checkCharset(Text); + + public bool isVersionComment() => checkMySQLVersion(Text); + + public bool isBackTickQuotedId() + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public bool isDoubleQuotedText() + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public bool isSingleQuotedText() + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public override IToken Emit() + { + IToken t = this.TokenFactory.Create(new Tuple(this, (ICharStream)this.InputStream), + this.Type, (this.Text!=null?(this.JustEmitedDot?this.Text.Substring(1):this.Text):null), this.Channel, this.TokenStartCharIndex + (this.JustEmitedDot?1:0), CharIndex - 1, this.TokenStartLine, this.TokenStartColumn); + this.JustEmitedDot = false; + base.Emit(t); + return t; + } + + public void startInVersionComment() + { + inVersionComment = true; + } + + public void endInVersionComment() + { + inVersionComment = false; + } + + public bool isInVersionComment() + { + return inVersionComment; + } +} diff --git a/sql/mysql/Oracle/CSharp/MySQLParserBase.cs b/sql/mysql/Oracle/CSharp/MySQLParserBase.cs new file mode 100644 index 0000000000..25233e7520 --- /dev/null +++ b/sql/mysql/Oracle/CSharp/MySQLParserBase.cs @@ -0,0 +1,52 @@ +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +using Antlr4.Runtime; +using System.Collections.Generic; +using System.IO; + +public abstract class MySQLParserBase : Parser { + + // To parameterize the parsing process. + public int serverVersion = 0; + public HashSet sqlModes = new HashSet(); + + /** Enable Multi Language Extension support. */ + public bool supportMle = true; + + protected MySQLParserBase(ITokenStream input, TextWriter output, TextWriter errorOutput) : base(input, output, errorOutput) + { + } + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public bool isSqlModeActive(SqlMode mode) { + return this.sqlModes.Contains(mode); + } + + public bool isPureIdentifier() + { + return this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public bool isTextStringLiteral() + { + return !this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public bool isStoredRoutineBody() + { + return serverVersion >= 80032 && supportMle; + } + + public bool isSelectStatementWithInto() + { + return serverVersion >= 80024 && serverVersion < 80031; + } +} diff --git a/sql/mysql/Oracle/CSharp/StackQueue.cs b/sql/mysql/Oracle/CSharp/StackQueue.cs new file mode 100644 index 0000000000..6bc4e296dd --- /dev/null +++ b/sql/mysql/Oracle/CSharp/StackQueue.cs @@ -0,0 +1,141 @@ +using System.Collections; +using System.Collections.Generic; + +public class StackQueue : IEnumerable +{ + private readonly List _items; + + public StackQueue() + { + _items = new List(); + } + + public StackQueue(T value) + { + _items = new List(); + _items.Add(value); + } + + public StackQueue(StackQueue other) + { + _items = new List(); + _items.AddRange(other._items); + } + + public virtual int Size() + { + return _items.Count; + } + + public virtual int Count => _items.Count; + + public virtual T Pop() + { + if (_items.Count > 0) + { + var result = _items[_items.Count - 1]; + _items.RemoveAt(_items.Count - 1); + return result; + } + else return default; + } + + public virtual T this[int n] + { + get => PeekBottom(n); + set => _items[n] = value; + } + + public virtual T Peek() + { + return PeekTop(0); + } + + public bool Any() + { + return _items.Count > 0; + } + + public virtual T PeekTop(int n = 0) + { + if (_items.Count - n > 0) + { + int index = _items.Count - n - 1; + var result = _items[index]; + return result; + } + else return default; + } + + public virtual T PeekBottom(int n) + { + if (n >= 0 && n < _items.Count - 1) + { + var result = _items[n]; + return result; + } + else return default; + } + + public virtual void Push(T value) + { + _items.Add(value); + } + + public virtual void Push(IEnumerable collection) + { + foreach (T t in collection) + { + _items.Add(t); + } + } + + public virtual void PushMultiple(params T[] values) + { + int count = values.Length; + for (int i = 0; i < count; i++) _items.Add(values[i]); + } + + public virtual void EnqueueTop(T value) + { + Push(value); + } + + public virtual void EnqueueBottom(T value) + { + _items.Insert(0, value); + } + + public virtual T DequeueTop() + { + return Pop(); + } + + public virtual T DequeueBottom() + { + if (_items.Count > 0) + { + var result = _items[0]; + _items.RemoveAt(0); + return result; + } + else return default; + } + + public virtual bool Contains(T item) + { + return _items.Contains(item); + } + + public virtual System.Collections.Generic.IEnumerator GetEnumerator() + { + for (int i = _items.Count - 1; i >= 0; i--) + yield return _items[i]; + } + + IEnumerator IEnumerable.GetEnumerator() + { + for (int i = _items.Count - 1; i >= 0; i--) + yield return _items[i]; + } +} diff --git a/sql/mysql/Oracle/CSharp/Test.cs b/sql/mysql/Oracle/CSharp/Test.cs new file mode 100644 index 0000000000..5c4636221c --- /dev/null +++ b/sql/mysql/Oracle/CSharp/Test.cs @@ -0,0 +1,483 @@ +// Generated from trgen 0.23.7 + +using Antlr4.Runtime; +using Antlr4.Runtime.Atn; +using Antlr4.Runtime.Tree; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +public class Program +{ + public static MySQLParser Parser { get; set; } + public static ErrorListener ParserErrorListener { get; set; } + public static MySQLLexer Lexer { get; set; } + public static ErrorListener LexerErrorListener { get; set; } + public static ITokenStream TokenStream { get; set; } + public static ICharStream CharStream { get; set; } + public static IParseTree Tree { get; set; } + public static List Trees { get; set; } + public static string StartSymbol { get; set; } = "queries"; + public static string Input { get; set; } + public static bool HeatMap { get; set; } = false; + public static void SetupParse2(string input, bool quiet = false) + { + ICharStream str = new AntlrInputStream(input); + CharStream = str; + var lexer = new MySQLLexer(str); + lexer.serverVersion = 80200; + lexer.sqlModeFromString("ANSI_QUOTES"); + Lexer = lexer; + CommonTokenStream tokens = null; + if (HeatMap) { + tokens = new ProfilingCommonTokenStream(lexer); + } + else { + tokens = new CommonTokenStream(lexer); + } + TokenStream = tokens; + var parser = new MyParser(tokens); + parser.serverVersion = lexer.serverVersion; + parser.sqlModes = lexer.sqlModes; + Parser = parser; + var listener_lexer = new ErrorListener(false, false, System.Console.Error); + var listener_parser = new ErrorListener(false, false, System.Console.Error); + LexerErrorListener = listener_lexer; + ParserErrorListener = listener_parser; + lexer.RemoveErrorListeners(); + parser.RemoveErrorListeners(); + lexer.AddErrorListener(listener_lexer); + parser.AddErrorListener(listener_parser); + } + + public static IParseTree Parse2() + { + var tree = Parser.queries(); + Input = Lexer.InputStream.ToString(); + TokenStream = Parser.TokenStream; + Tree = tree; + return tree; + } + + public static List>> Parse3() + { + Parser.Profile = true; + var tree = Parser.queries(); + var decisions = Parser.ParseInfo.getDecisionInfo().Where(d => d.ambiguities.Any()).ToList(); + var result = new List>>(); + foreach (var decision in decisions) + { + var am = decision.ambiguities; + var trees = new List(); + foreach (AmbiguityInfo ai in am) + { + var parser_decision = ai.decision; + var parser_alts = ai.ambigAlts; + var parser_startIndex = ai.startIndex; + var parser_stopIndex = ai.stopIndex; + var p = Parser.RuleNames.Select((value, index) => new { value, index }) + .Where(pair => (pair.value == "queries")) + .Select(pair => pair.index).First(); + var parser_startRuleIndex = p; + var parser_trees = ((MyParser)Parser).getAllPossibleParseTrees( + parser_decision, + parser_alts, + parser_startIndex, + parser_stopIndex, + parser_startRuleIndex); + trees.AddRange(parser_trees); + } + result.Add(new Tuple>(decision.decision, trees)); + } + Input = Lexer.InputStream.ToString(); + TokenStream = Parser.TokenStream; + return result; + } + + public static bool AnyErrors() + { + return ParserErrorListener.had_error || LexerErrorListener.had_error; + } + + public static IParseTree Parse(string input) + { + ICharStream str = new AntlrInputStream(input); + CharStream = str; + var lexer = new MySQLLexer(str); + lexer.serverVersion = 80200; + lexer.sqlModeFromString("ANSI_QUOTES"); + Lexer = lexer; + CommonTokenStream tokens = null; + if (show_hit) { + tokens = new ProfilingCommonTokenStream(lexer); + } + else { + tokens = new CommonTokenStream(lexer); + } + TokenStream = tokens; + var parser = new MySQLParser(tokens); + parser.serverVersion = lexer.serverVersion; + parser.sqlModes = lexer.sqlModes; + Parser = parser; + var listener_lexer = new ErrorListener(false, false, System.Console.Error); + var listener_parser = new ErrorListener(false, false, System.Console.Error); + lexer.RemoveErrorListeners(); + parser.RemoveErrorListeners(); + lexer.AddErrorListener(listener_lexer); + parser.AddErrorListener(listener_parser); + var tree = parser.queries(); + Input = lexer.InputStream.ToString(); + TokenStream = parser.TokenStream; + Tree = tree; + return tree; + } + + static bool tee = false; + static bool show_diagnostic = false; + static bool show_hit = false; + static bool show_ambig = false; + static bool show_profile = false; + static bool show_tokens = false; + static bool show_trace = false; + static bool show_tree = false; + static bool old = false; + static bool two_byte = false; + static int exit_code = 0; + static Encoding encoding = null; + static int string_instance = 0; + static string prefix = ""; + static bool quiet = false; + + static void Main(string[] args) + { + List is_fns = new List(); + List inputs = new List(); + for (int i = 0; i < args.Length; ++i) + { + if (args[i] == "-d") + { + show_diagnostic = true; + } + else if (args[i] == "-ambig") + { + show_ambig = true; + } + else if (args[i] == "-profile") + { + show_profile = true; + } + else if (args[i] == "-tokens") + { + show_tokens = true; + } + else if (args[i] == "-two-byte") + { + two_byte = true; + } + else if (args[i] == "-old") + { + old = true; + } + else if (args[i] == "-tree") + { + show_tree = true; + } + else if (args[i] == "-prefix") + { + prefix = args[++i] + " "; + } + else if (args[i] == "-input") + { + inputs.Add(args[++i]); + is_fns.Add(false); + } + else if (args[i] == "-tee") + { + tee = true; + } + else if (args[i] == "-encoding") + { + ++i; + encoding = Encoding.GetEncoding( + args[i], + new EncoderReplacementFallback("(unknown)"), + new DecoderReplacementFallback("(error)")); + if (encoding == null) + throw new Exception(@"Unknown encoding. Must be an Internet Assigned Numbers Authority (IANA) code page name. https://www.iana.org/assignments/character-sets/character-sets.xhtml"); + } + else if (args[i] == "-x") + { + for (; ; ) + { + var line = System.Console.In.ReadLine(); + line = line?.Trim(); + if (line == null || line == "") + { + break; + } + inputs.Add(line); + is_fns.Add(true); + } + } + else if (args[i] == "-q") + { + quiet = true; + } + else if (args[i] == "-trace") + { + show_trace = true; + } + else + { + inputs.Add(args[i]); + is_fns.Add(true); + } + } + if (inputs.Count() == 0) + { + ParseStdin(); + } + else + { + DateTime before = DateTime.Now; + for (int f = 0; f < inputs.Count(); ++f) + { + if (is_fns[f]) + ParseFilename(inputs[f], f); + else + ParseString(inputs[f], f); + } + DateTime after = DateTime.Now; + if (!quiet) System.Console.Error.WriteLine("Total Time: " + (after - before).TotalSeconds); + } + Environment.ExitCode = exit_code; + } + + static void ParseStdin() + { + ICharStream str = null; + str = CharStreams.fromStream(System.Console.OpenStandardInput()); + DoParse(str, "stdin", 0); + } + + static void ParseString(string input, int row_number) + { + ICharStream str = null; + str = CharStreams.fromString(input); + DoParse(str, "string" + string_instance++, row_number); + } + + static void ParseFilename(string input, int row_number) + { + ICharStream str = null; + if (two_byte) + str = new TwoByteCharStream(input); + else if (old) + { + FileStream fs = new FileStream(input, FileMode.Open); + str = new Antlr4.Runtime.AntlrInputStream(fs); + } + else if (encoding == null) + str = CharStreams.fromPath(input); + else + str = CharStreams.fromPath(input, encoding); + DoParse(str, input, row_number); + } + + static void DoParse(ICharStream str, string input_name, int row_number) + { + var lexer = new MySQLLexer(str); + lexer.serverVersion = 80200; + lexer.sqlModeFromString("ANSI_QUOTES"); + if (show_tokens) + { + StringBuilder new_s = new StringBuilder(); + for (int i = 0; ; ++i) + { + var ro_token = lexer.NextToken(); + var token = (CommonToken)ro_token; + token.TokenIndex = i; + new_s.AppendLine(token.ToString()); + if (token.Type == Antlr4.Runtime.TokenConstants.EOF) + break; + } + System.Console.Error.WriteLine(new_s.ToString()); + lexer.Reset(); + } + CommonTokenStream tokens = null; + if (show_hit) { + tokens = new ProfilingCommonTokenStream(lexer); + } + else { + tokens = new CommonTokenStream(lexer); + } + var parser = new MyParser(tokens); + parser.serverVersion = lexer.serverVersion; + parser.sqlModes = lexer.sqlModes; + var output = tee ? new StreamWriter(input_name + ".errors") : System.Console.Error; + var listener_lexer = new ErrorListener(quiet, tee, output); + var listener_parser = new ErrorListener(quiet, tee, output); + lexer.RemoveErrorListeners(); + parser.RemoveErrorListeners(); + lexer.AddErrorListener(listener_lexer); + parser.AddErrorListener(listener_parser); + if (show_diagnostic) + { + parser.AddErrorListener(new MyDiagnosticErrorListener()); + } + if (show_profile || show_ambig) + { + parser.Profile = true; + } + if (show_trace) + { + parser.Trace = true; +// ParserATNSimulator.trace_atn_sim = true; + } + DateTime before = DateTime.Now; + var tree = parser.queries(); + DateTime after = DateTime.Now; + var result = ""; + if (listener_lexer.had_error || listener_parser.had_error) + { + result = "fail"; + exit_code = 1; + } + else + { + result = "success"; + } + if (show_tree) + { + if (tee) + { + System.IO.File.WriteAllText(input_name + ".tree", tree.ToStringTree(parser)); + } else { + System.Console.Error.WriteLine(tree.ToStringTree(parser)); + } + } + if (show_profile) + { + System.Console.Error.WriteLine(String.Join(",\n\r", parser.ParseInfo.getDecisionInfo().Select(d => d.ToString()))); + } + if (show_ambig) + { + var decs = parser.ParseInfo.getDecisionInfo().Where(d => + d.ambiguities.Any()).Select(d => d.ambiguities).ToList(); + foreach (var decision in decs) + { + foreach (var ai in decision) + { + var parser_decision = ai.decision; + var parser_alts = ai.ambigAlts; + var parser_startIndex = ai.startIndex; + var parser_stopIndex = ai.stopIndex; + var nfa_state = parser.Atn.states.Where(s => + { + if (s is BasicBlockStartState s2) return s2.decision == parser_decision; + else return false; + }).ToList(); + var p = parser.RuleNames.Select((value, index) => new { value, index }) + .Where(pair => (pair.value == "queries")) + .Select(pair => pair.index).First(); + var parser_startRuleIndex = p; + var parser_trees = parser.getAllPossibleParseTrees( + parser_decision, + parser_alts, + parser_startIndex, + parser_stopIndex, + parser_startRuleIndex); + foreach (var parser_tree in parser_trees) + { + System.Console.WriteLine(parser_tree.ToStringTree(parser)); + System.Console.WriteLine(); + } + } + } + } + if (!quiet) + { + System.Console.Error.WriteLine(prefix + "CSharp " + row_number + " " + input_name + " " + result + " " + (after - before).TotalSeconds); + } + if (tee) output.Close(); + } + + public static string ToStringTree(ITree tree, Parser recog) + { + StringBuilder sb = new StringBuilder(); + string[] ruleNames = recog != null ? recog.RuleNames : null; + IList ruleNamesList = ruleNames != null ? ruleNames.ToList() : null; + ToStringTree(sb, tree, 0, ruleNamesList); + return sb.ToString(); + } + + public static void ToStringTree(StringBuilder sb, ITree t, int indent, IList ruleNames) + { + string s = Antlr4.Runtime.Misc.Utils.EscapeWhitespace(GetNodeText(t, ruleNames), false); + if (t.ChildCount == 0) + { + for (int i = 0; i < indent; ++i) sb.Append(" "); + sb.AppendLine(s); + return; + } + s = Antlr4.Runtime.Misc.Utils.EscapeWhitespace(GetNodeText(t, ruleNames), false); + for (int i = 0; i < indent; ++i) sb.Append(' '); + sb.AppendLine(s); + for (int i = 0; i < t.ChildCount; i++) + { + ToStringTree(sb, t.GetChild(i), indent+1, ruleNames); + } + } + + public static string GetNodeText(ITree t, Parser recog) + { + string[] ruleNames = recog != null ? recog.RuleNames : null; + IList ruleNamesList = ruleNames != null ? ruleNames.ToList() : null; + return GetNodeText(t, ruleNamesList); + } + + public static string GetNodeText(ITree t, IList ruleNames) + { + if (ruleNames != null) + { + if (t is RuleContext) + { + int ruleIndex = ((RuleContext)t).RuleIndex; + string ruleName = ruleNames[ruleIndex]; + int altNumber = ((RuleContext)t).getAltNumber(); + if ( altNumber!= Antlr4.Runtime.Atn.ATN.INVALID_ALT_NUMBER ) { + return ruleName+":"+altNumber; + } + return ruleName; + } + else + { + if (t is IErrorNode) + { + return t.ToString(); + } + else + { + if (t is ITerminalNode) + { + IToken symbol = ((ITerminalNode)t).Symbol; + if (symbol != null) + { + string s = symbol.Text; + return s; + } + } + } + } + } + // no recog for rule names + object payload = t.Payload; + if (payload is IToken) + { + return ((IToken)payload).Text; + } + return t.Payload.ToString(); + } +} + diff --git a/sql/mysql/Oracle/Java/MySQLLexerBase.java b/sql/mysql/Oracle/Java/MySQLLexerBase.java new file mode 100644 index 0000000000..c020d4a162 --- /dev/null +++ b/sql/mysql/Oracle/Java/MySQLLexerBase.java @@ -0,0 +1,325 @@ +/* + * Copyright 2024, Oracle and/or its affiliates + */ + +/* eslint-disable no-underscore-dangle */ +/* cspell: ignore antlr, longlong, ULONGLONG, MAXDB */ + +import org.antlr.v4.runtime.*; +import java.util.*; + + +/** The base lexer class provides a number of functions needed in actions in the lexer (grammar). */ +public abstract class MySQLLexerBase extends Lexer { + + public MySQLLexerBase(CharStream input) { + super(input); + } + + public int serverVersion = 0; + public Set sqlModes = new HashSet<>(); + + /** Enable Multi Language Extension support. */ + public boolean supportMle = true; + + public Set charSets = new HashSet<>(); // Used to check repertoires. + protected boolean inVersionComment = false; + + private Deque pendingTokens = new ArrayDeque<>(); + + static String longString = "2147483647"; + static int longLength = 10; + static String signedLongString = "-2147483648"; + static String longLongString = "9223372036854775807"; + static int longLongLength = 19; + static String signedLongLongString = "-9223372036854775808"; + static int signedLongLongLength = 19; + static String unsignedLongLongString = "18446744073709551615"; + static int unsignedLongLongLength = 20; + + private boolean justEmitedDot = false; + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public boolean isSqlModeActive(SqlMode mode) { + return this.sqlModes.contains(mode); + } + + /** + * Converts a mode string into individual mode flags. + * + * @param modes The input string to parse. + */ + public void sqlModeFromString(String modes) { + this.sqlModes = new HashSet<>(); + + String[] parts = modes.toUpperCase().split(","); + for (String mode : parts) { + switch (mode) { + case "ANSI": + case "DB2": + case "MAXDB": + case "MSSQL": + case "ORACLE": + case "POSTGRESQL": + this.sqlModes.add(SqlMode.AnsiQuotes); + this.sqlModes.add(SqlMode.PipesAsConcat); + this.sqlModes.add(SqlMode.IgnoreSpace); + break; + case "ANSI_QUOTES": + this.sqlModes.add(SqlMode.AnsiQuotes); + break; + case "PIPES_AS_CONCAT": + this.sqlModes.add(SqlMode.PipesAsConcat); + break; + case "NO_BACKSLASH_ESCAPES": + this.sqlModes.add(SqlMode.NoBackslashEscapes); + break; + case "IGNORE_SPACE": + this.sqlModes.add(SqlMode.IgnoreSpace); + break; + case "HIGH_NOT_PRECEDENCE": + case "MYSQL323": + case "MYSQL40": + this.sqlModes.add(SqlMode.HighNotPrecedence); + break; + } + } + } + + @Override + public void reset() { + this.inVersionComment = false; + super.reset(); + } + + @Override + public Token nextToken() { + Token pending = pendingTokens.pollLast(); + if (pending != null) { + return pending; + } + + Token next = super.nextToken(); + + pending = pendingTokens.pollLast(); + if (pending != null) { + pendingTokens.push(next); + return pending; + } + + return next; + } + + protected boolean checkMySQLVersion(String text) { + if (text.length() < 8) { // Minimum is: /*!12345 + return false; + } + + int version = Integer.parseInt(text.substring(3)); + if (version <= this.serverVersion) { + this.inVersionComment = true; + return true; + } + + return false; + } + + protected int determineFunction(int proposed) { + char input = (char) this._input.LA(1); + if (this.isSqlModeActive(SqlMode.IgnoreSpace)) { + while (input == ' ' || input == '\t' || input == '\r' || input == '\n') { + this.getInterpreter().consume(this._input); + this._channel = HIDDEN; + this._type = MySQLLexer.WHITESPACE; + input = (char) this._input.LA(1); + } + } + return input == '(' ? proposed : MySQLLexer.IDENTIFIER; + } + + protected int determineNumericType(String text) { + int length = text.length() - 1; + if (length < MySQLLexerBase.longLength) { + return MySQLLexer.INT_NUMBER; + } + + boolean negative = false; + int index = 0; + if (text.charAt(index) == '+') { + ++index; + --length; + } else if (text.charAt(index) == '-') { + ++index; + --length; + negative = true; + } + + while (text.charAt(index) == '0' && length > 0) { + ++index; + --length; + } + + if (length < MySQLLexerBase.longLength) { + return MySQLLexer.INT_NUMBER; + } + + String cmp; + int smaller; + int bigger; + if (negative) { + if (length == MySQLLexerBase.longLength) { + cmp = MySQLLexerBase.signedLongString.substring(1); + smaller = MySQLLexer.INT_NUMBER; + bigger = MySQLLexer.LONG_NUMBER; + } else if (length < MySQLLexerBase.signedLongLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.signedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.signedLongLongString.substring(1); + smaller = MySQLLexer.LONG_NUMBER; + bigger = MySQLLexer.DECIMAL_NUMBER; + } + } else { + if (length == MySQLLexerBase.longLength) { + cmp = MySQLLexerBase.longString; + smaller = MySQLLexer.INT_NUMBER; + bigger = MySQLLexer.LONG_NUMBER; + } else if (length < MySQLLexerBase.longLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.longLongLength) { + if (length > MySQLLexerBase.unsignedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } + cmp = MySQLLexerBase.unsignedLongLongString; + smaller = MySQLLexer.ULONGLONG_NUMBER; + bigger = MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.longLongString; + smaller = MySQLLexer.LONG_NUMBER; + bigger = MySQLLexer.ULONGLONG_NUMBER; + } + } + + int otherIndex = 0; + while (index < text.length() && cmp.charAt(otherIndex++) == text.charAt(index++)) {} + + return text.charAt(index - 1) <= cmp.charAt(otherIndex - 1) ? smaller : bigger; + } + + protected int checkCharset(String text) { + return this.charSets.contains(text) ? MySQLLexer.UNDERSCORE_CHARSET : MySQLLexer.IDENTIFIER; + } + + protected void emitDot() { + pendingTokens.push(this._factory.create(this._tokenFactorySourcePair, MySQLLexer.DOT_SYMBOL, + this.getText(), this._channel, this._tokenStartCharIndex, this._tokenStartCharIndex, this.getLine(), this.getCharPositionInLine())); + ++this._tokenStartCharPositionInLine; + this.justEmitedDot = true; + } + + public boolean isServerVersionLt80024() { return serverVersion < 80024; } + public boolean isServerVersionGe80024() { return serverVersion >= 80024; } + public boolean isServerVersionGe80011() { return serverVersion >= 80011; } + public boolean isServerVersionGe80013() { return serverVersion >= 80013; } + public boolean isServerVersionLt80014() { return serverVersion < 80014; } + public boolean isServerVersionGe80014() { return serverVersion >= 80014; } + public boolean isServerVersionGe80017() { return serverVersion >= 80017; } + public boolean isServerVersionGe80018() { return serverVersion >= 80018; } + public boolean isMasterCompressionAlgorithm() { return serverVersion >= 80018 && isServerVersionLt80024(); } + public boolean isServerVersionLt80031() { return serverVersion < 80031; } + + public void doLogicalOr() { + this._type = isSqlModeActive(SqlMode.PipesAsConcat) ? MySQLLexer.CONCAT_PIPES_SYMBOL : MySQLLexer.LOGICAL_OR_OPERATOR; + } + + public void doIntNumber() { + this._type = determineNumericType(this.getText()); + } + + public void doAdddate() { this._type = determineFunction(MySQLLexer.ADDDATE_SYMBOL); } + public void doBitAnd() { this._type = determineFunction(MySQLLexer.BIT_AND_SYMBOL); } + public void doBitOr() { this._type = determineFunction(MySQLLexer.BIT_OR_SYMBOL); } + public void doBitXor() { this._type = determineFunction(MySQLLexer.BIT_XOR_SYMBOL); } + public void doCast() { this._type = determineFunction(MySQLLexer.CAST_SYMBOL); } + public void doCount() { this._type = determineFunction(MySQLLexer.COUNT_SYMBOL); } + public void doCurdate() { this._type = determineFunction(MySQLLexer.CURDATE_SYMBOL); } + public void doCurrentDate() { this._type = determineFunction(MySQLLexer.CURDATE_SYMBOL); } + public void doCurrentTime() { this._type = determineFunction(MySQLLexer.CURTIME_SYMBOL); } + public void doCurtime() { this._type = determineFunction(MySQLLexer.CURTIME_SYMBOL); } + public void doDateAdd() { this._type = determineFunction(MySQLLexer.DATE_ADD_SYMBOL); } + public void doDateSub() { this._type = determineFunction(MySQLLexer.DATE_SUB_SYMBOL); } + public void doExtract() { this._type = determineFunction(MySQLLexer.EXTRACT_SYMBOL); } + public void doGroupConcat() { this._type = determineFunction(MySQLLexer.GROUP_CONCAT_SYMBOL); } + public void doMax() { this._type = determineFunction(MySQLLexer.MAX_SYMBOL); } + public void doMid() { this._type = determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + public void doMin() { this._type = determineFunction(MySQLLexer.MIN_SYMBOL); } + public void doNot() { this._type = isSqlModeActive(SqlMode.HighNotPrecedence) ? MySQLLexer.NOT2_SYMBOL : MySQLLexer.NOT_SYMBOL; } + public void doNow() { this._type = determineFunction(MySQLLexer.NOW_SYMBOL); } + public void doPosition() { this._type = determineFunction(MySQLLexer.POSITION_SYMBOL); } + public void doSessionUser() { this._type = determineFunction(MySQLLexer.USER_SYMBOL); } + public void doStddevSamp() { this._type = determineFunction(MySQLLexer.STDDEV_SAMP_SYMBOL); } + public void doStddev() { this._type = determineFunction(MySQLLexer.STD_SYMBOL); } + public void doStddevPop() { this._type = determineFunction(MySQLLexer.STD_SYMBOL); } + public void doStd() { this._type = determineFunction(MySQLLexer.STD_SYMBOL); } + public void doSubdate() { this._type = determineFunction(MySQLLexer.SUBDATE_SYMBOL); } + public void doSubstr() { this._type = determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + public void doSubstring() { this._type = determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + public void doSum() { this._type = determineFunction(MySQLLexer.SUM_SYMBOL); } + public void doSysdate() { this._type = determineFunction(MySQLLexer.SYSDATE_SYMBOL); } + public void doSystemUser() { this._type = determineFunction(MySQLLexer.USER_SYMBOL); } + public void doTrim() { this._type = determineFunction(MySQLLexer.TRIM_SYMBOL); } + public void doVariance() { this._type = determineFunction(MySQLLexer.VARIANCE_SYMBOL); } + public void doVarPop() { this._type = determineFunction(MySQLLexer.VARIANCE_SYMBOL); } + public void doVarSamp() { this._type = determineFunction(MySQLLexer.VAR_SAMP_SYMBOL); } + public void doUnderscoreCharset() { this._type = checkCharset(this.getText()); } + + public boolean isVersionComment() { + return checkMySQLVersion(this.getText()); + } + + public boolean isBackTickQuotedId() + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public boolean isDoubleQuotedText() + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public boolean isSingleQuotedText() + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + @Override + public Token emit() { + Token t = this._factory.create(this._tokenFactorySourcePair, + this._type, this.getText() != null ? (this.justEmitedDot ? this.getText().substring(1) : this.getText()) : null, this._channel, this._tokenStartCharIndex + (this.justEmitedDot ? 1 : 0), this.getCharIndex() - 1, this.getLine(), this.getCharPositionInLine()); + this.justEmitedDot = false; + super.emit(t); + return t; + } + + public void startInVersionComment() + { + inVersionComment = true; + } + + public void endInVersionComment() + { + inVersionComment = false; + } + + public boolean isInVersionComment() + { + return inVersionComment; + } +} diff --git a/sql/mysql/Oracle/Java/MySQLParserBase.java b/sql/mysql/Oracle/Java/MySQLParserBase.java new file mode 100644 index 0000000000..e10dc207a0 --- /dev/null +++ b/sql/mysql/Oracle/Java/MySQLParserBase.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024, Oracle and/or its affiliates + */ + +import org.antlr.v4.runtime.*; +import java.util.*; +import java.io.*; + +public abstract class MySQLParserBase extends Parser { + + // To parameterize the parsing process. + public int serverVersion = 0; + public Set sqlModes = new HashSet<>(); + + /** Enable Multi Language Extension support. */ + public boolean supportMle = true; + + protected MySQLParserBase(TokenStream input) { + super(input); + } + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public boolean isSqlModeActive(SqlMode mode) { + return this.sqlModes.contains(mode); + } + + public boolean isPureIdentifier() + { + return this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public boolean isTextStringLiteral() + { + return !this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public boolean isStoredRoutineBody() + { + return serverVersion >= 80032 && supportMle; + } + + public boolean isSelectStatementWithInto() + { + return serverVersion >= 80024 && serverVersion < 80031; + } +} diff --git a/sql/mysql/Oracle/Java/SqlMode.java b/sql/mysql/Oracle/Java/SqlMode.java new file mode 100644 index 0000000000..80d9a50f70 --- /dev/null +++ b/sql/mysql/Oracle/Java/SqlMode.java @@ -0,0 +1,9 @@ +/** SQL modes that control parsing behavior. */ +public enum SqlMode { + NoMode, + AnsiQuotes, + HighNotPrecedence, + PipesAsConcat, + IgnoreSpace, + NoBackslashEscapes +} diff --git a/sql/mysql/Oracle/Java/Test.java b/sql/mysql/Oracle/Java/Test.java new file mode 100644 index 0000000000..038b7a5f52 --- /dev/null +++ b/sql/mysql/Oracle/Java/Test.java @@ -0,0 +1,291 @@ +// Generated from trgen 0.23.7 + +import java.io.FileNotFoundException; +import java.io.IOException; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.tree.ParseTree; +import java.time.Instant; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Scanner; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.OutputStreamWriter; +import java.io.FileOutputStream; +import java.nio.charset.StandardCharsets; +import java.io.File; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; + +public class Test { + + static boolean tee = false; + static boolean show_profile = false; + static boolean show_tree = false; + static boolean show_tokens = false; + static boolean show_trace = false; + static boolean show_diagnostic = false; + static int error_code = 0; + static java.nio.charset.Charset charset = null; + static int string_instance = 0; + static String prefix = ""; + static boolean quiet = false; + + public static void main(String[] args) throws FileNotFoundException, IOException + { + List is_fns = new ArrayList(); + List inputs = new ArrayList(); + for (int i = 0; i < args.length; ++i) + { + if (args[i].equals("-d")) + { + show_diagnostic = true; + } + else if (args[i].equals("-profile")) + { + show_profile = true; + } + else if (args[i].equals("-tokens")) + { + show_tokens = true; + } + else if (args[i].equals("-tree")) + { + show_tree = true; + } + else if (args[i].equals("-prefix")) + { + prefix = args[++i] + " "; + } + else if (args[i].equals("-input")) { + inputs.add(args[++i]); + is_fns.add(false); + } + else if (args[i].equals("-tee")) + { + tee = true; + } + else if (args[i].equals("-encoding")) + { + charset = java.nio.charset.Charset.forName(args[++i]); + } + else if (args[i].equals("-x")) + { + Scanner scanner = new Scanner(System.in); + for (; ; ) + { + if (!scanner.hasNext()) break; + String line = scanner.nextLine(); + if (line == null) break; + line = line.trim(); + if (line == "") break; + inputs.add(line); + is_fns.add(true); + } + } + else if (args[i].equals("-q")) + { + quiet = true; + } + else if (args[i].equals("-trace")) + { + show_trace = true; + continue; + } + else { + inputs.add(args[i]); + is_fns.add(true); + } + } + CharStream str = null; + if (inputs.size() == 0) + { + ParseStdin(); + } + else + { + Instant start = Instant.now(); + for (int f = 0; f < inputs.size(); ++f) + { + if (is_fns.get(f)) + ParseFilename(inputs.get(f), f); + else + ParseString(inputs.get(f), f); + } + Instant finish = Instant.now(); + long timeElapsed = Duration.between(start, finish).toMillis(); + if (!quiet) System.err.println("Total Time: " + (timeElapsed * 1.0) / 1000.0); + } + java.lang.System.exit(error_code); + } + + static void ParseStdin()throws IOException { + CharStream str = CharStreams.fromStream(System.in); + DoParse(str, "stdin", 0); + } + + static void ParseString(String input, int row_number) throws IOException { + var str = CharStreams.fromString(input); + DoParse(str, "string" + string_instance++, row_number); + } + + static void ParseFilename(String input, int row_number) throws IOException + { + CharStream str = null; + if (charset == null) + str = CharStreams.fromFileName(input); + else + str = CharStreams.fromFileName(input, charset); + DoParse(str, input, row_number); + } + + static void DoParse(CharStream str, String input_name, int row_number) { + MySQLLexer lexer = new MySQLLexer(str); + lexer.serverVersion = 80200; + lexer.sqlModeFromString("ANSI_QUOTES"); + if (show_tokens) + { + StringBuilder new_s = new StringBuilder(); + for (int i = 0; ; ++i) + { + var ro_token = lexer.nextToken(); + var token = (CommonToken)ro_token; + token.setTokenIndex(i); + new_s.append(token.toString()); + new_s.append(System.getProperty("line.separator")); + if (token.getType() == IntStream.EOF) + break; + } + System.err.println(new_s.toString()); + lexer.reset(); + } + var tokens = new CommonTokenStream(lexer); + MySQLParser parser = new MySQLParser(tokens); +//lexer.charSets = charSets; + parser.serverVersion = lexer.serverVersion; + parser.sqlModes = lexer.sqlModes; + PrintStream output = null; + try { + output = tee ? new PrintStream(new File(input_name + ".errors")) : System.out; + } catch (NullPointerException e) { + output = System.err; + } catch (FileNotFoundException e2) { + output = System.err; + } + ErrorListener listener_lexer = new ErrorListener(quiet, tee, output); + ErrorListener listener_parser = new ErrorListener(quiet, tee, output); + parser.removeErrorListeners(); + lexer.removeErrorListeners(); + parser.addErrorListener(listener_parser); + lexer.addErrorListener(listener_lexer); + if (show_diagnostic) + { + parser.addErrorListener(new MyDiagnosticErrorListener()); + } + if (show_trace) + { + parser.setTrace(true); +// ParserATNSimulator.trace_atn_sim = true; + } + Instant start = Instant.now(); + ParseTree tree = parser.queries(); + Instant finish = Instant.now(); + long timeElapsed = Duration.between(start, finish).toMillis(); + String result = ""; + if (listener_parser.had_error || listener_lexer.had_error) + { + result = "fail"; + error_code = 1; + } + else + result = "success"; + if (show_tree) + { + if (tee) + { + PrintWriter treef = null; + try { + treef = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(input_name + ".tree")), StandardCharsets.UTF_8), true); + //treef = new PrintStream(new File(input_name + ".tree")); + } catch (NullPointerException e) { + treef = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true);; + } catch (FileNotFoundException e2) { + treef = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true); + } + treef.print(tree.toStringTree(parser)); + treef.close(); + } else + { + System.err.println(tree.toStringTree(parser)); + } + } + if (!quiet) + { + System.err.println(prefix + "Java " + row_number + " " + input_name + " " + result + " " + (timeElapsed * 1.0) / 1000.0); + } + if (tee) output.close(); + } + + public static String toStringTree(Tree tree, Parser recog) { + StringBuilder sb = new StringBuilder(); + String[] ruleNames = recog != null ? recog.getRuleNames() : null; + List ruleNamesList = ruleNames != null ? List.of(ruleNames) : null; + toStringTree(sb, tree, 0, ruleNamesList); + return sb.toString(); + } + + public static void toStringTree(StringBuilder sb, Tree t, int indent, List ruleNames) { + String s = org.antlr.v4.runtime.misc.Utils.escapeWhitespace(getNodeText(t, ruleNames), false); + if (t.getChildCount() == 0) { + for (int i = 0; i < indent; ++i) sb.append(" "); + sb.append(s).append(System.lineSeparator()); + return; + } + s = org.antlr.v4.runtime.misc.Utils.escapeWhitespace(getNodeText(t, ruleNames), false); + for (int i = 0; i < indent; ++i) sb.append(' '); + sb.append(s).append(System.lineSeparator()); + for (int i = 0; i < t.getChildCount(); i++) { + toStringTree(sb, t.getChild(i), indent + 1, ruleNames); + } + } + + public static String getNodeText(Tree t, Parser recog) { + String[] ruleNames = recog != null ? recog.getRuleNames() : null; + List ruleNamesList = ruleNames != null ? java.util.Arrays.asList(ruleNames) : null; + return getNodeText(t, ruleNamesList); + } + + public static String getNodeText(Tree t, List ruleNames) { + if ( ruleNames!=null ) { + if ( t instanceof RuleContext ) { + int ruleIndex = ((RuleContext)t).getRuleContext().getRuleIndex(); + String ruleName = ruleNames.get(ruleIndex); + int altNumber = ((RuleContext) t).getAltNumber(); + if ( altNumber!=ATN.INVALID_ALT_NUMBER ) { + return ruleName+":"+altNumber; + } + return ruleName; + } + else if ( t instanceof ErrorNode) { + return t.toString(); + } + else if ( t instanceof TerminalNode) { + Token symbol = ((TerminalNode)t).getSymbol(); + if (symbol != null) { + String s = symbol.getText(); + return s; + } + } + } + // no recog for rule names + Object payload = t.getPayload(); + if ( payload instanceof Token ) { + return ((Token)payload).getText(); + } + return t.getPayload().toString(); + } + +} diff --git a/sql/mysql/Oracle/MySQLLexer.g4 b/sql/mysql/Oracle/MySQLLexer.g4 index a34db8de6b..d481d9ad56 100644 --- a/sql/mysql/Oracle/MySQLLexer.g4 +++ b/sql/mysql/Oracle/MySQLLexer.g4 @@ -27,7 +27,7 @@ lexer grammar MySQLLexer; // $antlr-format alignColons hanging options { - superClass = MySQLBaseLexer; + superClass = MySQLLexerBase; } tokens { @@ -40,15 +40,7 @@ tokens { ULONGLONG_NUMBER } -//------------------------------------------------------------------------------------------------- - -@header { -/* eslint-disable @typescript-eslint/no-unused-vars, no-useless-escape */ - -import { MySQLBaseLexer, SqlMode } from "../MySQLBaseLexer.js"; -} - -//------------------------------------------------------------------------------------------------- +// Insert here @header for lexer. // Operators EQUAL_OPERATOR @@ -136,8 +128,7 @@ BITWISE_XOR_OPERATOR ; LOGICAL_OR_OPERATOR - : '||' { this.type = this.isSqlModeActive(SqlMode.PipesAsConcat) ? MySQLLexer.CONCAT_PIPES_SYMBOL : MySQLLexer.LOGICAL_OR_OPERATOR; - } + : '||' { this.doLogicalOr(); } ; BITWISE_OR_OPERATOR @@ -340,7 +331,7 @@ BIN_NUMBER ; INT_NUMBER - : DIGITS { this.type = this.determineNumericType(this.text); } + : DIGITS { this.doIntNumber(); } ; // Float types must be handled first or the DOT_IDENTIIFER rule will make them to identifiers @@ -379,7 +370,7 @@ ADD_SYMBOL ; // SQL-2003-R ADDDATE_SYMBOL - : A D D D A T E { this.type = this.determineFunction(MySQLLexer.ADDDATE_SYMBOL); } + : A D D D A T E { this.doAdddate(); } ; // MYSQL-FUNC AFTER_SYMBOL @@ -487,11 +478,11 @@ BINLOG_SYMBOL ; BIT_AND_SYMBOL - : B I T '_' A N D { this.type = this.determineFunction(MySQLLexer.BIT_AND_SYMBOL); } + : B I T '_' A N D { this.doBitAnd(); } ; // MYSQL-FUNC BIT_OR_SYMBOL - : B I T '_' O R { this.type = this.determineFunction(MySQLLexer.BIT_OR_SYMBOL); } + : B I T '_' O R { this.doBitOr(); } ; // MYSQL-FUNC BIT_SYMBOL @@ -499,7 +490,7 @@ BIT_SYMBOL ; // MYSQL-FUNC BIT_XOR_SYMBOL - : B I T '_' X O R { this.type = this.determineFunction(MySQLLexer.BIT_XOR_SYMBOL); } + : B I T '_' X O R { this.doBitXor(); } ; // MYSQL-FUNC BLOB_SYMBOL @@ -555,7 +546,7 @@ CASE_SYMBOL ; // SQL-2003-R CAST_SYMBOL - : C A S T { this.type = this.determineFunction(MySQLLexer.CAST_SYMBOL); } + : C A S T { this.doCast(); } ; // SQL-2003-R CATALOG_NAME_SYMBOL @@ -723,7 +714,7 @@ CONVERT_SYMBOL ; // SQL-2003-N COUNT_SYMBOL - : C O U N T { this.type = this.determineFunction(MySQLLexer.COUNT_SYMBOL); } + : C O U N T { this.doCount(); } ; // SQL-2003-N CPU_SYMBOL @@ -743,7 +734,7 @@ CUBE_SYMBOL ; // SQL-2003-R CURDATE_SYMBOL - : C U R D A T E { this.type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); } + : C U R D A T E { this.doCurdate(); } ; // MYSQL-FUNC CURRENT_SYMBOL @@ -751,11 +742,11 @@ CURRENT_SYMBOL ; CURRENT_DATE_SYMBOL - : C U R R E N T '_' D A T E { this.type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); } + : C U R R E N T '_' D A T E { this.doCurrentDate(); } ; // Synonym, MYSQL-FUNC CURRENT_TIME_SYMBOL - : C U R R E N T '_' T I M E { this.type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); } + : C U R R E N T '_' T I M E { this.doCurrentTime(); } ; // Synonym, MYSQL-FUNC CURRENT_TIMESTAMP_SYMBOL @@ -775,7 +766,7 @@ CURSOR_NAME_SYMBOL ; // SQL-2003-N CURTIME_SYMBOL - : C U R T I M E { this.type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); } + : C U R T I M E { this.doCurtime(); } ; // MYSQL-FUNC DATABASE_SYMBOL @@ -799,11 +790,11 @@ DATETIME_SYMBOL ; // MYSQL DATE_ADD_SYMBOL - : D A T E '_' A D D { this.type = this.determineFunction(MySQLLexer.DATE_ADD_SYMBOL); } + : D A T E '_' A D D { this.doDateAdd(); } ; DATE_SUB_SYMBOL - : D A T E '_' S U B { this.type = this.determineFunction(MySQLLexer.DATE_SUB_SYMBOL); } + : D A T E '_' S U B { this.doDateSub(); } ; DATE_SYMBOL @@ -1059,7 +1050,7 @@ EXTENT_SIZE_SYMBOL ; EXTRACT_SYMBOL - : E X T R A C T { this.type = this.determineFunction(MySQLLexer.EXTRACT_SYMBOL); } + : E X T R A C T { this.doExtract(); } ; // SQL-2003-N FALSE_SYMBOL @@ -1203,7 +1194,7 @@ GROUP_SYMBOL ; // SQL-2003-R GROUP_CONCAT_SYMBOL - : G R O U P '_' C O N C A T { this.type = this.determineFunction(MySQLLexer.GROUP_CONCAT_SYMBOL); } + : G R O U P '_' C O N C A T { this.doGroupConcat(); } ; HANDLER_SYMBOL @@ -1507,95 +1498,95 @@ LOW_PRIORITY_SYMBOL ; MASTER_AUTO_POSITION_SYMBOL - : M A S T E R '_' A U T O '_' P O S I T I O N {this.serverVersion < 80024}? + : M A S T E R '_' A U T O '_' P O S I T I O N {this.isServerVersionLt80024()}? ; MASTER_BIND_SYMBOL - : M A S T E R '_' B I N D {this.serverVersion < 80024}? + : M A S T E R '_' B I N D {this.isServerVersionLt80024()}? ; MASTER_CONNECT_RETRY_SYMBOL - : M A S T E R '_' C O N N E C T '_' R E T R Y {this.serverVersion < 80024}? + : M A S T E R '_' C O N N E C T '_' R E T R Y {this.isServerVersionLt80024()}? ; MASTER_DELAY_SYMBOL - : M A S T E R '_' D E L A Y {this.serverVersion < 80024}? + : M A S T E R '_' D E L A Y {this.isServerVersionLt80024()}? ; MASTER_HOST_SYMBOL - : M A S T E R '_' H O S T {this.serverVersion < 80024}? + : M A S T E R '_' H O S T {this.isServerVersionLt80024()}? ; MASTER_LOG_FILE_SYMBOL - : M A S T E R '_' L O G '_' F I L E {this.serverVersion < 80024}? + : M A S T E R '_' L O G '_' F I L E {this.isServerVersionLt80024()}? ; MASTER_LOG_POS_SYMBOL - : M A S T E R '_' L O G '_' P O S {this.serverVersion < 80024}? + : M A S T E R '_' L O G '_' P O S {this.isServerVersionLt80024()}? ; MASTER_PASSWORD_SYMBOL - : M A S T E R '_' P A S S W O R D {this.serverVersion < 80024}? + : M A S T E R '_' P A S S W O R D {this.isServerVersionLt80024()}? ; MASTER_PORT_SYMBOL - : M A S T E R '_' P O R T {this.serverVersion < 80024}? + : M A S T E R '_' P O R T {this.isServerVersionLt80024()}? ; MASTER_RETRY_COUNT_SYMBOL - : M A S T E R '_' R E T R Y '_' C O U N T {this.serverVersion < 80024}? + : M A S T E R '_' R E T R Y '_' C O U N T {this.isServerVersionLt80024()}? ; MASTER_SSL_CAPATH_SYMBOL - : M A S T E R '_' S S L '_' C A P A T H {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' C A P A T H {this.isServerVersionLt80024()}? ; MASTER_SSL_CA_SYMBOL - : M A S T E R '_' S S L '_' C A {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' C A {this.isServerVersionLt80024()}? ; MASTER_SSL_CERT_SYMBOL - : M A S T E R '_' S S L '_' C E R T {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' C E R T {this.isServerVersionLt80024()}? ; MASTER_SSL_CIPHER_SYMBOL - : M A S T E R '_' S S L '_' C I P H E R {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' C I P H E R {this.isServerVersionLt80024()}? ; MASTER_SSL_CRL_SYMBOL - : M A S T E R '_' S S L '_' C R L {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' C R L {this.isServerVersionLt80024()}? ; MASTER_SSL_CRLPATH_SYMBOL - : M A S T E R '_' S S L '_' C R L P A T H {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' C R L P A T H {this.isServerVersionLt80024()}? ; MASTER_SSL_KEY_SYMBOL - : M A S T E R '_' S S L '_' K E Y {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' K E Y {this.isServerVersionLt80024()}? ; MASTER_SSL_SYMBOL - : M A S T E R '_' S S L {this.serverVersion < 80024}? + : M A S T E R '_' S S L {this.isServerVersionLt80024()}? ; MASTER_SSL_VERIFY_SERVER_CERT_SYMBOL - : M A S T E R '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T {this.serverVersion < 80024}? + : M A S T E R '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T {this.isServerVersionLt80024()}? ; MASTER_SYMBOL - : M A S T E R {this.serverVersion < 80024}? + : M A S T E R {this.isServerVersionLt80024()}? ; MASTER_TLS_VERSION_SYMBOL - : M A S T E R '_' T L S '_' V E R S I O N {this.serverVersion < 80024}? + : M A S T E R '_' T L S '_' V E R S I O N {this.isServerVersionLt80024()}? ; MASTER_USER_SYMBOL - : M A S T E R '_' U S E R {this.serverVersion < 80024}? + : M A S T E R '_' U S E R {this.isServerVersionLt80024()}? ; MASTER_HEARTBEAT_PERIOD_SYMBOL - : M A S T E R '_' H E A R T B E A T '_' P E R I O D {this.serverVersion < 80024}? + : M A S T E R '_' H E A R T B E A T '_' P E R I O D {this.isServerVersionLt80024()}? ; MATCH_SYMBOL @@ -1619,7 +1610,7 @@ MAX_SIZE_SYMBOL ; MAX_SYMBOL - : M A X { this.type = this.determineFunction(MySQLLexer.MAX_SYMBOL); } + : M A X { this.doMax(); } ; // SQL-2003-N MAX_UPDATES_PER_HOUR_SYMBOL @@ -1667,7 +1658,7 @@ MICROSECOND_SYMBOL ; // MYSQL-FUNC MID_SYMBOL - : M I D { this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + : M I D { this.doMid(); } ; // Synonym MIDDLEINT_SYMBOL @@ -1695,7 +1686,7 @@ MIN_ROWS_SYMBOL ; MIN_SYMBOL - : M I N { this.type = this.determineFunction(MySQLLexer.MIN_SYMBOL); } + : M I N { this.doMin(); } ; // SQL-2003-N MODE_SYMBOL @@ -1787,11 +1778,11 @@ NONE_SYMBOL ; // SQL-2003-R NOT_SYMBOL - : N O T { this.type = this.isSqlModeActive(SqlMode.HighNotPrecedence) ? MySQLLexer.NOT2_SYMBOL: MySQLLexer.NOT_SYMBOL; } + : N O T { this.doNot(); } ; // SQL-2003-R NOW_SYMBOL - : N O W { this.type = this.determineFunction(MySQLLexer.NOW_SYMBOL); } + : N O W { this.doNow(); } ; NO_SYMBOL @@ -1955,7 +1946,7 @@ PORT_SYMBOL ; POSITION_SYMBOL - : P O S I T I O N { this.type = this.determineFunction(MySQLLexer.POSITION_SYMBOL); } + : P O S I T I O N { this.doPosition(); } ; // SQL-2003-N PRECEDES_SYMBOL @@ -2311,7 +2302,7 @@ SERVER_SYMBOL ; SESSION_USER_SYMBOL - : S E S S I O N '_' U S E R { this.type = this.determineFunction(MySQLLexer.USER_SYMBOL); } + : S E S S I O N '_' U S E R { this.doSessionUser(); } ; // Synonym SET_SYMBOL @@ -2475,19 +2466,19 @@ STATUS_SYMBOL ; STDDEV_SAMP_SYMBOL - : S T D D E V '_' S A M P { this.type = this.determineFunction(MySQLLexer.STDDEV_SAMP_SYMBOL); } + : S T D D E V '_' S A M P { this.doStddevSamp(); } ; // SQL-2003-N STDDEV_SYMBOL - : S T D D E V { this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); } + : S T D D E V { this.doStddev(); } ; // Synonym STDDEV_POP_SYMBOL - : S T D D E V '_' P O P { this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); } + : S T D D E V '_' P O P { this.doStddevPop(); } ; // Synonym STD_SYMBOL - : S T D { this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); } + : S T D { this.doStd(); } ; STOP_SYMBOL @@ -2515,7 +2506,7 @@ SUBCLASS_ORIGIN_SYMBOL ; // SQL-2003-N SUBDATE_SYMBOL - : S U B D A T E { this.type = this.determineFunction(MySQLLexer.SUBDATE_SYMBOL); } + : S U B D A T E { this.doSubdate(); } ; SUBJECT_SYMBOL @@ -2531,15 +2522,15 @@ SUBPARTITION_SYMBOL ; SUBSTR_SYMBOL - : S U B S T R { this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + : S U B S T R { this.doSubstr(); } ; // Synonym SUBSTRING_SYMBOL - : S U B S T R I N G { this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + : S U B S T R I N G { this.doSubstring(); } ; // SQL-2003-N SUM_SYMBOL - : S U M { this.type = this.determineFunction(MySQLLexer.SUM_SYMBOL); } + : S U M { this.doSum(); } ; // SQL-2003-N SUPER_SYMBOL @@ -2559,11 +2550,11 @@ SWITCHES_SYMBOL ; SYSDATE_SYMBOL - : S Y S D A T E { this.type = this.determineFunction(MySQLLexer.SYSDATE_SYMBOL); } + : S Y S D A T E { this.doSysdate(); } ; SYSTEM_USER_SYMBOL - : S Y S T E M '_' U S E R { this.type = this.determineFunction(MySQLLexer.USER_SYMBOL); } + : S Y S T E M '_' U S E R { this.doSystemUser(); } ; TABLES_SYMBOL @@ -2659,7 +2650,7 @@ TRIGGER_SYMBOL ; // SQL-2003-R TRIM_SYMBOL - : T R I M { this.type = this.determineFunction(MySQLLexer.TRIM_SYMBOL); } + : T R I M { this.doTrim(); } ; // SQL-2003-N TRUE_SYMBOL @@ -2679,7 +2670,7 @@ TYPE_SYMBOL ; // SQL-2003-N UDF_RETURNS_SYMBOL - : U D F '_' R E T U R N S {this.serverVersion < 80031}? + : U D F '_' R E T U R N S {this.isServerVersionLt80031()}? ; UNCOMMITTED_SYMBOL @@ -2807,7 +2798,7 @@ VARIABLES_SYMBOL ; VARIANCE_SYMBOL - : V A R I A N C E { this.type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); } + : V A R I A N C E { this.doVariance(); } ; VARYING_SYMBOL @@ -2815,11 +2806,11 @@ VARYING_SYMBOL ; // SQL-2003-R VAR_POP_SYMBOL - : V A R '_' P O P { this.type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); } + : V A R '_' P O P { this.doVarPop(); } ; // Synonym VAR_SAMP_SYMBOL - : V A R '_' S A M P { this.type = this.determineFunction(MySQLLexer.VAR_SAMP_SYMBOL); } + : V A R '_' S A M P { this.doVarSamp(); } ; VIEW_SYMBOL @@ -2986,7 +2977,7 @@ BUCKETS_SYMBOL ; // MYSQL REMOTE_SYMBOL - : R E M O T E {this.serverVersion < 80014}? + : R E M O T E {this.isServerVersionLt80014()}? ; // MYSQL CLONE_SYMBOL @@ -3134,95 +3125,95 @@ MASTER_PUBLIC_KEY_PATH_SYMBOL ; // MYSQL GET_MASTER_PUBLIC_KEY_SYMBOL - : G E T '_' M A S T E R '_' P U B L I C '_' K E Y '_' S Y M {this.serverVersion < 80024}? + : G E T '_' M A S T E R '_' P U B L I C '_' K E Y '_' S Y M {this.isServerVersionLt80024()}? ; // MYSQL RESTART_SYMBOL - : R E S T A R T {this.serverVersion >= 80011}? + : R E S T A R T {this.isServerVersionGe80011()}? ; // SQL-2003-N DEFINITION_SYMBOL - : D E F I N I T I O N {this.serverVersion >= 80011}? + : D E F I N I T I O N {this.isServerVersionGe80011()}? ; // MYSQL DESCRIPTION_SYMBOL - : D E S C R I P T I O N {this.serverVersion >= 80011}? + : D E S C R I P T I O N {this.isServerVersionGe80011()}? ; // MYSQL ORGANIZATION_SYMBOL - : O R G A N I Z A T I O N {this.serverVersion >= 80011}? + : O R G A N I Z A T I O N {this.isServerVersionGe80011()}? ; // MYSQL REFERENCE_SYMBOL - : R E F E R E N C E {this.serverVersion >= 80011}? + : R E F E R E N C E {this.isServerVersionGe80011()}? ; // MYSQL OPTIONAL_SYMBOL - : O P T I O N A L {this.serverVersion >= 80013}? + : O P T I O N A L {this.isServerVersionGe80013()}? ; // MYSQL SECONDARY_SYMBOL - : S E C O N D A R Y {this.serverVersion >= 80013}? + : S E C O N D A R Y {this.isServerVersionGe80013()}? ; // MYSQL SECONDARY_ENGINE_SYMBOL - : S E C O N D A R Y '_' E N G I N E {this.serverVersion >= 80013}? + : S E C O N D A R Y '_' E N G I N E {this.isServerVersionGe80013()}? ; // MYSQL SECONDARY_LOAD_SYMBOL - : S E C O N D A R Y '_' L O A D {this.serverVersion >= 80013}? + : S E C O N D A R Y '_' L O A D {this.isServerVersionGe80013()}? ; // MYSQL SECONDARY_UNLOAD_SYMBOL - : S E C O N D A R Y '_' U N L O A D {this.serverVersion >= 80013}? + : S E C O N D A R Y '_' U N L O A D {this.isServerVersionGe80013()}? ; // MYSQL ACTIVE_SYMBOL - : A C T I V E {this.serverVersion >= 80014}? + : A C T I V E {this.isServerVersionGe80014()}? ; // MYSQL INACTIVE_SYMBOL - : I N A C T I V E {this.serverVersion >= 80014}? + : I N A C T I V E {this.isServerVersionGe80014()}? ; // MYSQL LATERAL_SYMBOL - : L A T E R A L {this.serverVersion >= 80014}? + : L A T E R A L {this.isServerVersionGe80014()}? ; // SQL-2003-R RETAIN_SYMBOL - : R E T A I N {this.serverVersion >= 80014}? + : R E T A I N {this.isServerVersionGe80014()}? ; // MYSQL OLD_SYMBOL - : O L D {this.serverVersion >= 80014}? + : O L D {this.isServerVersionGe80014()}? ; // SQL-2003-R NETWORK_NAMESPACE_SYMBOL - : N E T W O R K '_' N A M E S P A C E {this.serverVersion >= 80017}? + : N E T W O R K '_' N A M E S P A C E {this.isServerVersionGe80017()}? ; // MYSQL ENFORCED_SYMBOL - : E N F O R C E D {this.serverVersion >= 80017}? + : E N F O R C E D {this.isServerVersionGe80017()}? ; // SQL-2003-N ARRAY_SYMBOL - : A R R A Y {this.serverVersion >= 80017}? + : A R R A Y {this.isServerVersionGe80017()}? ; // SQL-2003-R OJ_SYMBOL - : O J {this.serverVersion >= 80017}? + : O J {this.isServerVersionGe80017()}? ; // ODBC MEMBER_SYMBOL - : M E M B E R {this.serverVersion >= 80017}? + : M E M B E R {this.isServerVersionGe80017()}? ; // SQL-2003-R RANDOM_SYMBOL - : R A N D O M {this.serverVersion >= 80018}? + : R A N D O M {this.isServerVersionGe80018()}? ; // MYSQL MASTER_COMPRESSION_ALGORITHM_SYMBOL - : M A S T E R '_' C O M P R E S S I O N '_' A L G O R I T H M {this.serverVersion >= 80018 && this.serverVersion < 80024}? + : M A S T E R '_' C O M P R E S S I O N '_' A L G O R I T H M {this.isMasterCompressionAlgorithm()}? ; // MYSQL MASTER_ZSTD_COMPRESSION_LEVEL_SYMBOL @@ -3262,159 +3253,159 @@ OFF_SYMBOL ; // SQL-1999-R RETURNING_SYMBOL - : R E T U R N I N G {this.serverVersion >= 80024}? + : R E T U R N I N G {this.isServerVersionGe80024()}? ; // SQL-2016-N JSON_VALUE_SYMBOL - : J S O N '_' V A L U E {this.serverVersion >= 80024}? + : J S O N '_' V A L U E {this.isServerVersionGe80024()}? ; // SQL-2016-R TLS_SYMBOL - : T L S {this.serverVersion >= 80024}? + : T L S {this.isServerVersionGe80024()}? ; // MYSQL ATTRIBUTE_SYMBOL - : A T T R I B U T E {this.serverVersion >= 80024}? + : A T T R I B U T E {this.isServerVersionGe80024()}? ; // SQL-2003-N ENGINE_ATTRIBUTE_SYMBOL - : E N G I N E '_' A T T R I B U T E {this.serverVersion >= 80024}? + : E N G I N E '_' A T T R I B U T E {this.isServerVersionGe80024()}? ; // MYSQL SECONDARY_ENGINE_ATTRIBUTE_SYMBOL - : S E C O N D A R Y '_' E N G I N E '_' A T T R I B U T E {this.serverVersion >= 80024}? + : S E C O N D A R Y '_' E N G I N E '_' A T T R I B U T E {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_CONNECTION_AUTO_FAILOVER_SYMBOL - : S O U R C E '_' C O N N E C T I O N '_' A U T O '_' F A I L O V E R {this.serverVersion >= 80024}? + : S O U R C E '_' C O N N E C T I O N '_' A U T O '_' F A I L O V E R {this.isServerVersionGe80024()}? ; // MYSQL ZONE_SYMBOL - : Z O N E {this.serverVersion >= 80024}? + : Z O N E {this.isServerVersionGe80024()}? ; // SQL-2003-N GRAMMAR_SELECTOR_DERIVED_EXPR - : G R A M M A R '_' S E L E C T O R '_' D E R I V E D {this.serverVersion >= 80024}? + : G R A M M A R '_' S E L E C T O R '_' D E R I V E D {this.isServerVersionGe80024()}? ; // synthetic token: starts derived table expressions. REPLICA_SYMBOL - : R E P L I C A {this.serverVersion >= 80024}? + : R E P L I C A {this.isServerVersionGe80024()}? ; REPLICAS_SYMBOL - : R E P L I C A S {this.serverVersion >= 80024}? + : R E P L I C A S {this.isServerVersionGe80024()}? ; ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_SYMBOL - : A S S I G N '_' G T I D S '_' T O '_' A N O N Y M O U S '_' T R A N S A C T I O N S {this.serverVersion >= 80024}? + : A S S I G N '_' G T I D S '_' T O '_' A N O N Y M O U S '_' T R A N S A C T I O N S {this.isServerVersionGe80024()}? ; // MYSQL GET_SOURCE_PUBLIC_KEY_SYMBOL - : G E T '_' S O U R C E '_' P U B L I C '_' K E Y {this.serverVersion >= 80024}? + : G E T '_' S O U R C E '_' P U B L I C '_' K E Y {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_AUTO_POSITION_SYMBOL - : S O U R C E '_' A U T O '_' P O S I T I O N {this.serverVersion >= 80024}? + : S O U R C E '_' A U T O '_' P O S I T I O N {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_BIND_SYMBOL - : S O U R C E '_' B I N D {this.serverVersion >= 80024}? + : S O U R C E '_' B I N D {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_COMPRESSION_ALGORITHM_SYMBOL - : S O U R C E '_' C O M P R E S S I O N '_' A L G O R I T H M {this.serverVersion >= 80024}? + : S O U R C E '_' C O M P R E S S I O N '_' A L G O R I T H M {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_CONNECT_RETRY_SYMBOL - : S O U R C E '_' C O N N E C T '_' R E T R Y {this.serverVersion >= 80024}? + : S O U R C E '_' C O N N E C T '_' R E T R Y {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_DELAY_SYMBOL - : S O U R C E '_' D E L A Y {this.serverVersion >= 80024}? + : S O U R C E '_' D E L A Y {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_HEARTBEAT_PERIOD_SYMBOL - : S O U R C E '_' H E A R T B E A T '_' P E R I O D {this.serverVersion >= 80024}? + : S O U R C E '_' H E A R T B E A T '_' P E R I O D {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_HOST_SYMBOL - : S O U R C E '_' H O S T {this.serverVersion >= 80024}? + : S O U R C E '_' H O S T {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_LOG_FILE_SYMBOL - : S O U R C E '_' L O G '_' F I L E {this.serverVersion >= 80024}? + : S O U R C E '_' L O G '_' F I L E {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_LOG_POS_SYMBOL - : S O U R C E '_' L O G '_' P O S {this.serverVersion >= 80024}? + : S O U R C E '_' L O G '_' P O S {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_PASSWORD_SYMBOL - : S O U R C E '_' P A S S W O R D {this.serverVersion >= 80024}? + : S O U R C E '_' P A S S W O R D {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_PORT_SYMBOL - : S O U R C E '_' P O R T {this.serverVersion >= 80024}? + : S O U R C E '_' P O R T {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_PUBLIC_KEY_PATH_SYMBOL - : S O U R C E '_' P U B L I C '_' K E Y '_' P A T H {this.serverVersion >= 80024}? + : S O U R C E '_' P U B L I C '_' K E Y '_' P A T H {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_RETRY_COUNT_SYMBOL - : S O U R C E '_' R E T R Y '_' C O U N T {this.serverVersion >= 80024}? + : S O U R C E '_' R E T R Y '_' C O U N T {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_SYMBOL - : S O U R C E '_' S S L {this.serverVersion >= 80024}? + : S O U R C E '_' S S L {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_CA_SYMBOL - : S O U R C E '_' S S L '_' C A {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C A {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_CAPATH_SYMBOL - : S O U R C E '_' S S L '_' C A P A T H {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C A P A T H {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_CERT_SYMBOL - : S O U R C E '_' S S L '_' C E R T {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C E R T {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_CIPHER_SYMBOL - : S O U R C E '_' S S L '_' C I P H E R {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C I P H E R {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_CRL_SYMBOL - : S O U R C E '_' S S L '_' C R L {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C R L {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_CRLPATH_SYMBOL - : S O U R C E '_' S S L '_' C R L P A T H {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C R L P A T H {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_KEY_SYMBOL - : S O U R C E '_' S S L '_' C R L P A T H {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' C R L P A T H {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_SSL_VERIFY_SERVER_CERT_SYMBOL - : S O U R C E '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T {this.serverVersion >= 80024}? + : S O U R C E '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_TLS_CIPHERSUITES_SYMBOL - : S O U R C E '_' T L S '_' C I P H E R S U I T E S {this.serverVersion >= 80024}? + : S O U R C E '_' T L S '_' C I P H E R S U I T E S {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_TLS_VERSION_SYMBOL - : S O U R C E '_' T L S '_' V E R S I O N {this.serverVersion >= 80024}? + : S O U R C E '_' T L S '_' V E R S I O N {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_USER_SYMBOL - : S O U R C E '_' U S E R {this.serverVersion >= 80024}? + : S O U R C E '_' U S E R {this.isServerVersionGe80024()}? ; // MYSQL SOURCE_ZSTD_COMPRESSION_LEVEL_SYMBOL - : S O U R C E '_' Z S T D '_' C O M P R E S S I O N '_' L E V E L {this.serverVersion >= 80024}? + : S O U R C E '_' Z S T D '_' C O M P R E S S I O N '_' L E V E L {this.isServerVersionGe80024()}? ; // MYSQL ST_COLLECT_SYMBOL @@ -3594,7 +3585,7 @@ INVALID_INPUT // The underscore charset token is used to defined the repertoire of a string, though it conflicts // with normal identifiers, which also can start with an underscore. UNDERSCORE_CHARSET - : UNDERLINE_SYMBOL [a-z0-9]+ { this.type = this.checkCharset(this.text); } + : UNDERLINE_SYMBOL [a-z0-9]+ { this.doUnderscoreCharset(); } ; // Identifiers might start with a digit, even though it is discouraged, and may not consist entirely of digits only. @@ -3627,18 +3618,18 @@ fragment DOUBLE_QUOTE ; BACK_TICK_QUOTED_ID - : BACK_TICK (({!this.isSqlModeActive(SqlMode.NoBackslashEscapes)}? '\\')? .)*? BACK_TICK + : BACK_TICK (({this.isBackTickQuotedId()}? '\\')? .)*? BACK_TICK ; DOUBLE_QUOTED_TEXT : ( - DOUBLE_QUOTE (({!this.isSqlModeActive(SqlMode.NoBackslashEscapes)}? '\\')? .)*? DOUBLE_QUOTE + DOUBLE_QUOTE (({this.isDoubleQuotedText()}? '\\')? .)*? DOUBLE_QUOTE )+ ; SINGLE_QUOTED_TEXT : ( - SINGLE_QUOTE (({!this.isSqlModeActive(SqlMode.NoBackslashEscapes)}? '\\')? .)*? SINGLE_QUOTE + SINGLE_QUOTE (({this.isSingleQuotedText()}? '\\')? .)*? SINGLE_QUOTE )+ ; @@ -3654,7 +3645,7 @@ DOLLAR_QUOTED_STRING_TEXT // the current server version (specifying so the minimum server version the code can run with). VERSION_COMMENT_START : ('/*!' DIGITS) ( - {this.checkMySQLVersion(this.text)}? // Will set this.inVersionComment if the number matches. + {this.isVersionComment()}? // Will set this.inVersionComment if the number matches. | .*? '*/' ) -> channel(HIDDEN) ; @@ -3662,11 +3653,11 @@ VERSION_COMMENT_START // this.inVersionComment is a variable in the base lexer. // TODO: use a lexer mode instead of a member variable. MYSQL_COMMENT_START - : '/*!' { this.inVersionComment = true; } -> channel(HIDDEN) + : '/*!' { this.startInVersionComment(); } -> channel(HIDDEN) ; VERSION_COMMENT_END - : '*/' {this.inVersionComment}? { this.inVersionComment = false; } -> channel(HIDDEN) + : '*/' {this.isInVersionComment()}? { this.endInVersionComment(); } -> channel(HIDDEN) ; BLOCK_COMMENT diff --git a/sql/mysql/Oracle/MySQLParser.g4 b/sql/mysql/Oracle/MySQLParser.g4 index ad6e2ac7bb..4c7f4afcdf 100644 --- a/sql/mysql/Oracle/MySQLParser.g4 +++ b/sql/mysql/Oracle/MySQLParser.g4 @@ -27,22 +27,20 @@ parser grammar MySQLParser; // $antlr-format alignColons hanging options { - superClass = MySQLBaseRecognizer; + superClass = MySQLParserBase; tokenVocab = MySQLLexer; } -@header { -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable no-useless-escape, no-lone-blocks */ - -import { MySQLBaseRecognizer } from "../MySQLBaseRecognizer.js"; -import { SqlMode } from "../MySQLBaseLexer.js"; -} +// Insert here @header for parser. //---------------------------------------------------------------------------------------------------------------------- +queries + : query* EOF + ; + query - : ((simpleStatement | beginWork) SEMICOLON_SYMBOL?)? EOF + : (simpleStatement | beginWork) SEMICOLON_SYMBOL ; simpleStatement @@ -497,7 +495,7 @@ routineString storedRoutineBody : compoundStatement - | {this.serverVersion >= 80032 && this.supportMle}? AS_SYMBOL routineString + | {this.isStoredRoutineBody()}? AS_SYMBOL routineString ; createFunction @@ -1061,7 +1059,7 @@ selectStatementWithInto : OPEN_PAR_SYMBOL selectStatementWithInto CLOSE_PAR_SYMBOL | queryExpression intoClause lockingClauseList? | queryExpression lockingClauseList intoClause - | {this.serverVersion >= 80024 && this.serverVersion < 80031}? queryExpressionParens intoClause + | {this.isSelectStatementWithInto()}? queryExpressionParens intoClause ; queryExpression @@ -4410,7 +4408,7 @@ windowName // Identifiers excluding keywords (except if they are quoted). IDENT_sys in sql_yacc.yy. pureIdentifier : (IDENTIFIER | BACK_TICK_QUOTED_ID) - | {this.isSqlModeActive(SqlMode.AnsiQuotes)}? DOUBLE_QUOTED_TEXT + | {this.isPureIdentifier()}? DOUBLE_QUOTED_TEXT ; // Identifiers including a certain set of keywords, which are allowed also if not quoted. @@ -4512,7 +4510,7 @@ stringList // TEXT_STRING_validated in sql_yacc.yy. textStringLiteral : value = SINGLE_QUOTED_TEXT - | {!this.isSqlModeActive(SqlMode.AnsiQuotes)}? value = DOUBLE_QUOTED_TEXT + | {this.isTextStringLiteral()}? value = DOUBLE_QUOTED_TEXT ; textString diff --git a/sql/mysql/Oracle/Python3/MySQLLexerBase.py b/sql/mysql/Oracle/Python3/MySQLLexerBase.py new file mode 100644 index 0000000000..967cc32e19 --- /dev/null +++ b/sql/mysql/Oracle/Python3/MySQLLexerBase.py @@ -0,0 +1,331 @@ +from antlr4 import * +import re +from collections import deque +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO +from SqlMode import SqlMode +from MySQLParser import MySQLParser + +class MySQLLexerBase(Lexer): + longString = "2147483647" + longLength = 10 + signedLongString = "-2147483648" + longLongString = "9223372036854775807" + longLongLength = 19 + signedLongLongString = "-9223372036854775808" + signedLongLongLength = 19 + unsignedLongLongString = "18446744073709551615" + unsignedLongLongLength = 20 + + def __init__(self, input=None, output:TextIO = sys.stdout): + super().__init__(input, output) + self.serverVersion = 0 + self.sqlModes = set() + self.supportMle = True + self.charSets = set() + self.inVersionComment = False + self.pendingTokens = deque() + self.justEmitedDot = False + + def isSqlModeActive(self, mode): + return mode in self.sqlModes + + def sqlModeFromString(self, modes): + self.sqlModes.clear() + parts = modes.upper().split(",") + for mode in parts: + if mode in {"ANSI", "DB2", "MAXDB", "MSSQL", "ORACLE", "POSTGRESQL"}: + self.sqlModes.update({SqlMode.AnsiQuotes, SqlMode.PipesAsConcat, SqlMode.IgnoreSpace}) + elif mode == "ANSI_QUOTES": + self.sqlModes.add(SqlMode.AnsiQuotes) + elif mode == "PIPES_AS_CONCAT": + self.sqlModes.add(SqlMode.PipesAsConcat) + elif mode == "NO_BACKSLASH_ESCAPES": + self.sqlModes.add(SqlMode.NoBackslashEscapes) + elif mode == "IGNORE_SPACE": + self.sqlModes.add(SqlMode.IgnoreSpace) + elif mode in {"HIGH_NOT_PRECEDENCE", "MYSQL323", "MYSQL40"}: + self.sqlModes.add(SqlMode.HighNotPrecedence) + + def reset(self): + self.inVersionComment = False + super().reset() + + def nextToken(self): + if self.pendingTokens: + return self.pendingTokens.popleft() + + next_token = super().nextToken() + if self.pendingTokens: + self.pendingTokens.append(next_token) + return self.pendingTokens.popleft() + + return next_token + + def checkMySQLVersion(self, text): + if text is None: + return False + if len(text) < 8: + return False + version = int(text[3:]) + if version <= self.serverVersion: + self.inVersionComment = True + return True + return False + + def determineFunction(self, proposed): + input_char = chr(self._input.LA(1)) + if self.isSqlModeActive(SqlMode.IgnoreSpace): + while input_char in " \t\r\n": + self._input.consume() + self._channel = Lexer.HIDDEN + self._type = self.WHITESPACE + input_char = chr(self._input.LA(1)) + + return proposed if input_char == '(' else self.IDENTIFIER + + def determineNumericType(self, text): + if text is None: + return MySQLParser.INT_NUMBER + + length = len(text) - 1 + if length < MySQLLexerBase.longLength: + return MySQLParser.INT_NUMBER + + negative = text[0] == '-' + index = 1 if text[0] in '+-' else 0 + length -= index + + while text[index] == '0' and length > 0: + index += 1 + length -= 1 + + if length < MySQLLexerBase.longLength: + return MySQLParser.INT_NUMBER + + smaller, bigger, cmp = None, None, None + if negative: + if length == MySQLLexerBase.longLength: + cmp = MySQLLexerBase.signedLongString[1:] + smaller = self.INT_NUMBER + bigger = self.LONG_NUMBER + elif length < MySQLLexerBase.signedLongLongLength: + return self.LONG_NUMBER + elif length > MySQLLexerBase.signedLongLongLength: + return self.DECIMAL_NUMBER + else: + cmp = MySQLLexerBase.signedLongLongString[1:] + smaller = self.LONG_NUMBER + bigger = self.DECIMAL_NUMBER + else: + if length == MySQLLexerBase.longLength: + cmp = MySQLLexerBase.longString + smaller = self.INT_NUMBER + bigger = self.LONG_NUMBER + elif length < MySQLLexerBase.longLongLength: + return self.LONG_NUMBER + elif length > MySQLLexerBase.longLongLength: + return self.DECIMAL_NUMBER if length > MySQLLexerBase.unsignedLongLongLength else self.ULONGLONG_NUMBER + else: + cmp = MySQLLexerBase.longLongString + smaller = self.LONG_NUMBER + bigger = self.ULONGLONG_NUMBER + + for idx, char in enumerate(cmp): + if text[index + idx] != char: + break + + return smaller if text[index + idx - 1] <= cmp[idx - 1] else bigger + + def checkCharset(self, text): + return self.UNDERSCORE_CHARSET if text in self.charSets else self.IDENTIFIER + + def emitDot(self): + self.pendingTokens.append(self._factory.create(self._tokenFactorySourcePair, self.DOT_SYMBOL, self._text, self._channel, self._tokenStartCharIndex, self._tokenStartCharIndex, self._tokenStartLine, self._tokenStartColumn)) + self._tokenStartColumn += 1 + self.justEmitedDot = True + + def isServerVersionLt80024(self): + return self.serverVersion < 80024 + + def isServerVersionGe80024(self): + return self.serverVersion >= 80024 + + def isServerVersionGe80011(self): + return self.serverVersion >= 80011 + + def isServerVersionGe80013(self): + return self.serverVersion >= 80013 + + def isServerVersionLt80014(self): + return self.serverVersion < 80014 + + def isServerVersionGe80014(self): + return self.serverVersion >= 80014 + + def isServerVersionGe80017(self): + return self.serverVersion >= 80017 + + def isServerVersionGe80018(self): + return self.serverVersion >= 80018 + + def isMasterCompressionAlgorithm(self): + return self.serverVersion >= 80018 and self.isServerVersionLt80024(); + + def isServerVersionLt80031(self): + return self.serverVersion < 80031 + + # Function handling methods + def doLogicalOr(self): + self._type = self.CONCAT_PIPES_SYMBOL if self.isSqlModeActive(SqlMode.PipesAsConcat) else self.LOGICAL_OR_OPERATOR + + def doIntNumber(self): + self._type = self.determineNumericType(self._text) + + def doAdddate(self): + self._type = self.determineFunction(self.ADDDATE_SYMBOL) + + def doBitAnd(self): + self._type = self.determineFunction(self.BIT_AND_SYMBOL) + + def doBitOr(self): + self._type = self.determineFunction(self.BIT_OR_SYMBOL) + + def doBitXor(self): + self._type = self.determineFunction(self.BIT_XOR_SYMBOL) + + def doCast(self): + self._type = self.determineFunction(self.CAST_SYMBOL) + + def doCount(self): + self._type = self.determineFunction(self.COUNT_SYMBOL) + + def doCurdate(self): + self._type = self.determineFunction(self.CURDATE_SYMBOL) + + def doCurrentDate(self): + self._type = self.determineFunction(self.CURDATE_SYMBOL) + + def doCurrentTime(self): + self._type = self.determineFunction(self.CURTIME_SYMBOL) + + def doCurtime(self): + self._type = self.determineFunction(self.CURTIME_SYMBOL) + + def doDateAdd(self): + self._type = self.determineFunction(self.DATE_ADD_SYMBOL) + + def doDateSub(self): + self._type = self.determineFunction(self.DATE_SUB_SYMBOL) + + def doExtract(self): + self._type = self.determineFunction(self.EXTRACT_SYMBOL) + + def doGroupConcat(self): + self._type = self.determineFunction(self.GROUP_CONCAT_SYMBOL) + + def doMax(self): + self._type = self.determineFunction(self.MAX_SYMBOL) + + def doMid(self): + self._type = self.determineFunction(self.SUBSTRING_SYMBOL) + + def doMin(self): + self._type = self.determineFunction(self.MIN_SYMBOL) + + def doNot(self): + self._type = self.NOT2_SYMBOL if self.isSqlModeActive(SqlMode.HighNotPrecedence) else self.NOT_SYMBOL + + def doNow(self): + self._type = self.determineFunction(self.NOW_SYMBOL) + + def doPosition(self): + self._type = self.determineFunction(self.POSITION_SYMBOL) + + def doSessionUser(self): + self._type = self.determineFunction(self.USER_SYMBOL) + + def doStddevSamp(self): + self._type = self.determineFunction(self.STDDEV_SAMP_SYMBOL) + + def doStddev(self): + self._type = self.determineFunction(self.STD_SYMBOL) + + def doStddevPop(self): + self._type = self.determineFunction(self.STD_SYMBOL) + + def doStd(self): + self._type = self.determineFunction(self.STD_SYMBOL) + + def doSubdate(self): + self._type = self.determineFunction(self.SUBDATE_SYMBOL) + + def doSubstr(self): + self._type = self.determineFunction(self.SUBSTRING_SYMBOL) + + def doSubstring(self): + self._type = self.determineFunction(self.SUBSTRING_SYMBOL) + + def doSum(self): + self._type = self.determineFunction(self.SUM_SYMBOL) + + def doSysdate(self): + self._type = self.determineFunction(self.SYSDATE_SYMBOL) + + def doSystemUser(self): + self._type = self.determineFunction(self.USER_SYMBOL) + + def doTrim(self): + self._type = self.determineFunction(self.TRIM_SYMBOL) + + def doVariance(self): + self._type = self.determineFunction(self.VARIANCE_SYMBOL) + + def doVarPop(self): + self._type = self.determineFunction(self.VARIANCE_SYMBOL) + + def doVarSamp(self): + self._type = self.determineFunction(self.VAR_SAMP_SYMBOL) + + def doUnderscoreCharset(self): + self._type = self.checkCharset(self._text) + + def isVersionComment(self): + return self.checkMySQLVersion(self._text) + + def isBackTickQuotedId(self): + return not self.isSqlModeActive(SqlMode.NoBackslashEscapes) + + def isDoubleQuotedText(self): + return not self.isSqlModeActive(SqlMode.NoBackslashEscapes) + + def isSingleQuotedText(self): + return not self.isSqlModeActive(SqlMode.NoBackslashEscapes) + + def emit(self): + if self._text is None: + text = self._text + elif self._text is NoneType: + text = self._text + elif self.justEmitedDot: + text = self._text[1:] + else: + text = self._text + token = self._factory.create(self._tokenFactorySourcePair, self._type, self._text, self._channel, self._tokenStartCharIndex, + self.getCharIndex()-1, self._tokenStartLine, self._tokenStartColumn) + self.emitToken(token) + self.justEmitedDot = False + self.emitToken(token) + return token + + def startInVersionComment(self): + self.inVersionComment = True + + def endInVersionComment(self): + self.inVersionComment = False + + def isInVersionComment(self): + return self.inVersionComment diff --git a/sql/mysql/Oracle/Python3/MySQLParserBase.py b/sql/mysql/Oracle/Python3/MySQLParserBase.py new file mode 100644 index 0000000000..12c789fb1d --- /dev/null +++ b/sql/mysql/Oracle/Python3/MySQLParserBase.py @@ -0,0 +1,45 @@ +from antlr4 import * +import re +import sys +if sys.version_info[1] > 5: + from typing import TextIO +else: + from typing.io import TextIO +from SqlMode import SqlMode + +class MySQLParserBase(Parser): + def __init__(self, input:TokenStream, output:TextIO = sys.stdout): + super().__init__(input, output) + self.serverVersion = 0 + self.sqlModes = set() + self.supportMle = True + + def isSqlModeActive(self, mode): + """ + Determines if the given SQL mode is currently active in the lexer. + + :param mode: The mode to check. + :return: True if the mode is one of the currently active modes. + """ + return mode in self.sqlModes + + def isPureIdentifier(self): + """ + Determines if a pure identifier is being parsed based on the active SQL mode. + :return: True if the AnsiQuotes mode is active. + """ + return self.isSqlModeActive(SqlMode.AnsiQuotes) + + def isTextStringLiteral(self): + """ + Determines if the current parsing process treats the text as a string literal. + :return: True if AnsiQuotes mode is not active. + """ + return not self.isSqlModeActive(SqlMode.AnsiQuotes) + + def isStoredRoutineBody(self): + return self.serverVersion >= 80032 and self.supportMle; + + def isSelectStatementWithInto(self): + return self.serverVersion >= 80024 and self.serverVersion < 80031; + \ No newline at end of file diff --git a/sql/mysql/Oracle/Python3/SqlMode.py b/sql/mysql/Oracle/Python3/SqlMode.py new file mode 100644 index 0000000000..fe03ed6b0b --- /dev/null +++ b/sql/mysql/Oracle/Python3/SqlMode.py @@ -0,0 +1,8 @@ +class SqlMode: + NoMode = 0 + AnsiQuotes = 1 + HighNotPrecedence = 2 + PipesAsConcat = 3 + IgnoreSpace = 4 + NoBackslashEscapes = 5 + diff --git a/sql/mysql/Oracle/Python3/Test.py b/sql/mysql/Oracle/Python3/Test.py new file mode 100644 index 0000000000..1351d3e57c --- /dev/null +++ b/sql/mysql/Oracle/Python3/Test.py @@ -0,0 +1,201 @@ +# Generated from trgen 0.23.7 + +import sys +from antlr4 import * +from antlr4.error.ErrorListener import ErrorListener +from readchar import readchar +from MySQLLexer import MySQLLexer; +from MySQLParser import MySQLParser; +from datetime import datetime + +def getChar(): + xx = readchar() + if (xx == 0): + return ''; + return xx + +class MyErrorListener(ErrorListener): + + def __init__(self, q, t, o): + super().__init__() + self.had_error = False + self.quiet = q + self.tee = t; + self.output = o + + def syntaxError(self, recognizer, offendingSymbol, line, column, msg, e): + self.had_error = True + if ( self.tee ): + self.output.write(f"line {line}:{column} {msg}\n"); + if (not self.quiet): + print(f"line {line}:{column} {msg}", file=sys.stderr); + +tee = False +show_tokens = False +show_tree = False +show_trace = False +encoding = "utf-8" +error_code = 0 +string_instance = 0 +prefix = "" +quiet = False + +def main(argv): + global tee + global show_tokens + global show_tree + global show_trace + global encoding + global prefix + global quiet + global error_code + + inputs = [] + is_fns = [] + prefix = "" + i = 1 + while i < len(argv): + arg = argv[i] + if arg == "-tokens": + show_tokens = True + elif arg == "-tree": + show_tree = True + elif arg == "-prefix": + i = i + 1 + prefix = argv[i] + " " + elif arg == "-input": + i = i + 1 + inputs.append(argv[i]) + is_fns.append(False) + elif arg == "-encoding": + i = i + 1 + encoding = argv[i] + elif arg == "-tee": + tee = True + elif arg == "-x": + while f := sys.stdin.readline(): + f = f.strip() + inputs.append(f) + is_fns.append(True) + elif arg == "-q": + quiet = True + elif arg == "-trace": + show_trace = True + else: + inputs.append(argv[i]) + is_fns.append(True) + i = i + 1 + if len(inputs) == 0: + ParseStdin() + else: + start_time = datetime.now() + for f in range(0, len(inputs)): + if is_fns[f]: + ParseFilename(inputs[f], f) + else: + ParseString(inputs[f], f) + end_time = datetime.now() + diff = end_time - start_time + diff_time = diff.total_seconds() + if (not quiet): + print(f'Total Time: {diff_time}', file=sys.stderr); + sys.exit(error_code) + +def ParseStdin(): + sb = "" + ch = getChar() + while (ch != ''): + sb = sb + ch + ch = getChar() + input = sb + str = InputStream(input); + DoParse(str, 'stdin', 0) + +def ParseString(input, row_number): + global string_instance + str = InputStream(input) + DoParse(str, 'string', row_number) + string_instance = string_instance + 1 + +def ParseFilename(input, row_number): + global encoding + str = FileStream(input, encoding) + DoParse(str, input, row_number) + +def DoParse(str, input_name, row_number): + global tee + global show_tokens + global show_tree + global show_trace + global encoding + global prefix + global quiet + global error_code + + lexer = MySQLLexer(str) + lexer.serverVersion = 80200; + lexer.sqlModeFromString("ANSI_QUOTES"); + lexer.removeErrorListeners() + if (tee): + output = open(input_name + ".errors", "w") + else: + output = sys.stderr + listener_lexer = MyErrorListener(quiet, tee, output) + lexer.addErrorListener(listener_lexer) + # lexer.strictMode = false + tokens = CommonTokenStream(lexer) + parser = MySQLParser(tokens) + parser.serverVersion = lexer.serverVersion; + parser.sqlModes = lexer.sqlModes; + parser.removeErrorListeners() + listener_parser = MyErrorListener(quiet, tee, output) + parser.addErrorListener(listener_parser) + if (show_tokens): + i = 0 + while True: + ro_token = lexer.nextToken() + token = ro_token + # token.TokenIndex = i + i = i + 1 + print(token, file=sys.stderr) + if (token.type == -1): + break + lexer.reset() + if (show_trace) : + parser.setTrace(False) + ParserATNSimulator.trace_atn_sim = True + PredictionContext._trace_atn_sim = True + start_time = datetime.now() + tree = parser.queries() + end_time = datetime.now() + diff = end_time - start_time + diff_time = diff.total_seconds() + result = '' + if listener_parser.had_error or listener_lexer.had_error: + result = 'fail' + error_code = 1 + else: + result = 'success' + if (show_tree): + if (tee): + f = open(input_name + '.tree', 'w', encoding='utf-8') + f.write(tree.toStringTree(recog=parser)) + f.close() + else: + print(tree.toStringTree(recog=parser), file=sys.stderr) + if (not quiet): + sys.stderr.write(prefix) + sys.stderr.write('Python3 ') + sys.stderr.write(f'{row_number}') + sys.stderr.write(' ') + sys.stderr.write(input_name) + sys.stderr.write(' ') + sys.stderr.write(result) + sys.stderr.write(' ') + sys.stderr.write(f'{diff_time}') + sys.stderr.write('\n') + if (tee): + output.close() + +if __name__ == '__main__': + main(sys.argv) diff --git a/sql/mysql/Oracle/Python3/transformGrammar.py b/sql/mysql/Oracle/Python3/transformGrammar.py new file mode 100644 index 0000000000..093b1f9ee8 --- /dev/null +++ b/sql/mysql/Oracle/Python3/transformGrammar.py @@ -0,0 +1,31 @@ +import sys, os, re, shutil +from glob import glob +from pathlib import Path + +def main(argv): + for file in glob("./*.g4"): + fix(file) + +def fix(file_path): + print("Altering " + file_path) + if not os.path.exists(file_path): + print(f"Could not find file: {file_path}") + sys.exit(1) + parts = os.path.split(file_path) + file_name = parts[-1] + + shutil.move(file_path, file_path + ".bak") + input_file = open(file_path + ".bak",'r') + output_file = open(file_path, 'w') + for x in input_file: + if 'this.' in x: + x = x.replace('this.', 'self.') + output_file.write(x) + output_file.flush() + + print("Writing ...") + input_file.close() + output_file.close() + +if __name__ == '__main__': + main(sys.argv) diff --git a/sql/mysql/Oracle/TypeScript/MySQLLexerBase.ts b/sql/mysql/Oracle/TypeScript/MySQLLexerBase.ts new file mode 100644 index 0000000000..12cec1412d --- /dev/null +++ b/sql/mysql/Oracle/TypeScript/MySQLLexerBase.ts @@ -0,0 +1,537 @@ +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +/* eslint-disable no-underscore-dangle */ +/* cspell: ignore antlr, longlong, ULONGLONG, MAXDB */ + +import { Lexer } from "antlr4"; +import { Token } from "antlr4"; +import { CommonToken } from "antlr4"; +import MySQLLexer from "./MySQLLexer"; +import SqlMode from "./SqlMode"; + +/** The base lexer class provides a number of functions needed in actions in the lexer (grammar). */ +export default abstract class MySQLLexerBase extends Lexer { + public serverVersion = 0; + public sqlModes = new Set(); + + /** Enable Multi Language Extension support. */ + public supportMle = true; + + public charSets: Set = new Set(); // Used to check repertoires. + protected inVersionComment = false; + + private pendingTokens: Token[] = []; + + static #longString = "2147483647"; + static #longLength = 10; + static #signedLongString = "-2147483648"; + static #longLongString = "9223372036854775807"; + static #longLongLength = 19; + static #signedLongLongString = "-9223372036854775808"; + static #signedLongLongLength = 19; + static #unsignedLongLongString = "18446744073709551615"; + static #unsignedLongLongLength = 20; + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public isSqlModeActive(mode: SqlMode): boolean { + return this.sqlModes.has(mode); + } + + /** + * Converts a mode string into individual mode flags. + * + * @param modes The input string to parse. + */ + public sqlModeFromString(modes: string): void { + this.sqlModes = new Set(); + + const parts = modes.toUpperCase().split(","); + parts.forEach((mode: string) => { + if (mode === "ANSI" || mode === "DB2" || mode === "MAXDB" || mode === "MSSQL" || mode === "ORACLE" || + mode === "POSTGRESQL") { + this.sqlModes.add(SqlMode.AnsiQuotes).add(SqlMode.PipesAsConcat).add(SqlMode.IgnoreSpace); + } else if (mode === "ANSI_QUOTES") { + this.sqlModes.add(SqlMode.AnsiQuotes); + } else if (mode === "PIPES_AS_CONCAT") { + this.sqlModes.add(SqlMode.PipesAsConcat); + } else if (mode === "NO_BACKSLASH_ESCAPES") { + this.sqlModes.add(SqlMode.NoBackslashEscapes); + } else if (mode === "IGNORE_SPACE") { + this.sqlModes.add(SqlMode.IgnoreSpace); + } else if (mode === "HIGH_NOT_PRECEDENCE" || mode === "MYSQL323" || mode === "MYSQL40") { + this.sqlModes.add(SqlMode.HighNotPrecedence); + } + }); + } + + /** + * Resets the lexer by setting initial values to transient member, resetting the input stream position etc. + */ + public reset(): void { + this.inVersionComment = false; + super.reset(); + } + + /** + * Implements the multi token feature required in our lexer. + * A lexer rule can emit more than a single token, if needed. + * + * @returns The next token in the token stream. + */ + public nextToken(): Token { + // First respond with pending tokens to the next token request, if there are any. + let pending = this.pendingTokens.shift(); + if (pending) { + return pending; + } + + // Let the main lexer class run the next token recognition. + // This might create additional tokens again. + const next = super.nextToken(); + pending = this.pendingTokens.shift(); + if (pending) { + this.pendingTokens.push(next); + + return pending; + } + + return next; + } + + /** + * Checks if the version number in the token text is less than or equal to the current server version. + * + * @param text The text from a matched token. + * @returns True if so the number matches, otherwise false. + */ + protected checkMySQLVersion(text: string): boolean { + if (text.length < 8) {// Minimum is: /*!12345 + return false; + } + + // Skip version comment introducer. + const version = parseInt(text.substring(3), 10); + if (version <= this.serverVersion) { + this.inVersionComment = true; + + return true; + } + + return false; + } + + /** + * Called when a keyword was consumed that represents an internal MySQL function and checks if that keyword is + * followed by an open parenthesis. If not then it is not considered a keyword but treated like a normal identifier. + * + * @param proposed The token type to use if the check succeeds. + * + * @returns If a function call is found then return the proposed token type, otherwise just IDENTIFIER. + */ + protected determineFunction(proposed: number): number { + // Skip any whitespace character if the sql mode says they should be ignored, + // before actually trying to match the open parenthesis. + let input = String.fromCharCode(this._input.LA(1)); + if (this.isSqlModeActive(SqlMode.IgnoreSpace)) { + while (input === " " || input === "\t" || input === "\r" || input === "\n") { + this._interp.consume(this._input); +// this.channel = Lexer.HIDDEN; + this._type = MySQLLexer.WHITESPACE; + input = String.fromCharCode(this._input.LA(1)); + } + } + + return input === "(" ? proposed : MySQLLexer.IDENTIFIER; + + } + + /** + * Checks the given text and determines the smallest number type from it. Code has been taken from sql_lex.cc. + * + * @param text The text to parse (which must be a number). + * + * @returns The token type for that text. + */ + protected determineNumericType(text: string): number { + // The original code checks for leading +/- but actually that can never happen, neither in the + // server parser (as a digit is used to trigger processing in the lexer) nor in our parser + // as our rules are defined without signs. But we do it anyway for maximum compatibility. + let length = text.length - 1; + if (length < MySQLLexerBase.#longLength) { // quick normal case + return MySQLLexer.INT_NUMBER; + } + + let negative = false; + let index = 0; + if (text.charAt(index) === "+") { // Remove sign and pre-zeros + ++index; + --length; + } else if (text.charAt(index) === "-") { + ++index; + --length; + negative = true; + } + + while (text.charAt(index) === "0" && length > 0) { + ++index; + --length; + } + + if (length < MySQLLexerBase.#longLength) { + return MySQLLexer.INT_NUMBER; + } + + let smaller: number; + let bigger: number; + let cmp: string; + if (negative) { + if (length === MySQLLexerBase.#longLength) { + cmp = MySQLLexerBase.#signedLongString.substring(1); + smaller = MySQLLexer.INT_NUMBER; // If <= signed_long_str + bigger = MySQLLexer.LONG_NUMBER; // If >= signed_long_str + } else if (length < MySQLLexerBase.#signedLongLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.#signedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.#signedLongLongString.substring(1); + smaller = MySQLLexer.LONG_NUMBER; // If <= signed_longlong_str + bigger = MySQLLexer.DECIMAL_NUMBER; + } + } else { + if (length === MySQLLexerBase.#longLength) { + cmp = MySQLLexerBase.#longString; + smaller = MySQLLexer.INT_NUMBER; + bigger = MySQLLexer.LONG_NUMBER; + } else if (length < MySQLLexerBase.#longLongLength) { + return MySQLLexer.LONG_NUMBER; + } else if (length > MySQLLexerBase.#longLongLength) { + if (length > MySQLLexerBase.#unsignedLongLongLength) { + return MySQLLexer.DECIMAL_NUMBER; + } + cmp = MySQLLexerBase.#unsignedLongLongString; + smaller = MySQLLexer.ULONGLONG_NUMBER; + bigger = MySQLLexer.DECIMAL_NUMBER; + } else { + cmp = MySQLLexerBase.#longLongString; + smaller = MySQLLexer.LONG_NUMBER; + bigger = MySQLLexer.ULONGLONG_NUMBER; + } + } + + let otherIndex = 0; + while (index < text.length && cmp.charAt(otherIndex++) === text.charAt(index++)) { + // + } + + return text.charAt(index - 1) <= cmp.charAt(otherIndex - 1) ? smaller : bigger; + } + + /** + * Checks if the given text corresponds to a charset defined in the server (text is preceded by an underscore). + * + * @param text The text to check. + * + * @returns UNDERSCORE_CHARSET if so, otherwise IDENTIFIER. + */ + protected checkCharset(text: string): number { + return this.charSets.has(text) ? MySQLLexer.UNDERSCORE_CHARSET : MySQLLexer.IDENTIFIER; + } + + /** + * Creates a DOT token in the token stream. + */ + protected emitDot(): void { + let t = new CommonToken([this, this._input], + MySQLLexer.DOT_SYMBOL, 0, this._tokenStartCharIndex, this._tokenStartCharIndex); + this.pendingTokens.push(t); + ++this.column; + ++this._tokenStartCharIndex; + } + + public isServerVersionLt80024(): boolean + { + return this.serverVersion < 80024; + } + + public isServerVersionGe80024(): boolean + { + return this.serverVersion >= 80024; + } + + public isServerVersionGe80011(): boolean + { + return this.serverVersion >= 80011; + } + + public isServerVersionGe80013(): boolean + { + return this.serverVersion >= 80013; + } + + public isServerVersionLt80014(): boolean + { + return this.serverVersion < 80014; + } + + public isServerVersionGe80014(): boolean + { + return this.serverVersion >= 80014; + } + + public isServerVersionGe80017(): boolean + { + return this.serverVersion >= 80017; + } + + + public isServerVersionGe80018(): boolean { return this.serverVersion >= 80018; } + + public isMasterCompressionAlgorithm(): boolean { return this.serverVersion >= 80018 && this.isServerVersionLt80024(); } + + public isServerVersionLt80031(): boolean + { + return this.serverVersion < 80031; + } + + public doLogicalOr(): void + { + this._type = this.isSqlModeActive(SqlMode.PipesAsConcat) ? MySQLLexer.CONCAT_PIPES_SYMBOL : MySQLLexer.LOGICAL_OR_OPERATOR; + } + + public doIntNumber(): void + { + this._type = this.determineNumericType(this.text); + } + + public doAdddate(): void + { + this._type = this.determineFunction(MySQLLexer.ADDDATE_SYMBOL); + } + + public doBitAnd(): void + { + this._type = this.determineFunction(MySQLLexer.BIT_AND_SYMBOL); + } + + public doBitOr(): void + { + this._type = this.determineFunction(MySQLLexer.BIT_OR_SYMBOL); + } + + public doBitXor(): void + { + this._type = this.determineFunction(MySQLLexer.BIT_XOR_SYMBOL); + } + + public doCast(): void + { + this._type = this.determineFunction(MySQLLexer.CAST_SYMBOL); + } + + public doCount(): void + { + this._type = this.determineFunction(MySQLLexer.COUNT_SYMBOL); + } + + public doCurdate(): void + { + this._type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); + } + + public doCurrentDate(): void + { + this._type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); + } + + public doCurrentTime(): void + { + this._type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); + } + + public doCurtime(): void + { + this._type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); + } + + public doDateAdd(): void + { + this._type = this.determineFunction(MySQLLexer.DATE_ADD_SYMBOL); + } + + public doDateSub(): void + { + this._type = this.determineFunction(MySQLLexer.DATE_SUB_SYMBOL); + } + + public doExtract(): void + { + this._type = this.determineFunction(MySQLLexer.EXTRACT_SYMBOL); + } + + public doGroupConcat(): void + { + this._type = this.determineFunction(MySQLLexer.GROUP_CONCAT_SYMBOL); + } + + public doMax(): void + { + this._type = this.determineFunction(MySQLLexer.MAX_SYMBOL); + } + + public doMid(): void + { + this._type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + } + + public doMin(): void + { + this._type = this.determineFunction(MySQLLexer.MIN_SYMBOL); + } + + public doNot(): void + { + this._type = this.isSqlModeActive(SqlMode.HighNotPrecedence) ? MySQLLexer.NOT2_SYMBOL: MySQLLexer.NOT_SYMBOL; + } + + public doNow(): void + { + this._type = this.determineFunction(MySQLLexer.NOW_SYMBOL); + } + + public doPosition(): void + { + this._type = this.determineFunction(MySQLLexer.POSITION_SYMBOL); + } + + public doSessionUser(): void + { + this._type = this.determineFunction(MySQLLexer.USER_SYMBOL); + } + + public doStddevSamp(): void + { + this._type = this.determineFunction(MySQLLexer.STDDEV_SAMP_SYMBOL); + } + + public doStddev(): void + { + this._type = this.determineFunction(MySQLLexer.STD_SYMBOL); + } + + public doStddevPop(): void + { + this._type = this.determineFunction(MySQLLexer.STD_SYMBOL); + } + + public doStd(): void + { + this._type = this.determineFunction(MySQLLexer.STD_SYMBOL); + } + + public doSubdate(): void + { + this._type = this.determineFunction(MySQLLexer.SUBDATE_SYMBOL); + } + + public doSubstr(): void + { + this._type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + } + + public doSubstring(): void + { + this._type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); + } + + public doSum(): void + { + this._type = this.determineFunction(MySQLLexer.SUM_SYMBOL); + } + + public doSysdate(): void + { + this._type = this.determineFunction(MySQLLexer.SYSDATE_SYMBOL); + } + + public doSystemUser(): void + { + this._type = this.determineFunction(MySQLLexer.USER_SYMBOL); + } + + public doTrim(): void + { + this._type = this.determineFunction(MySQLLexer.TRIM_SYMBOL); + } + + public doVariance(): void + { + this._type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); + } + + public doVarPop(): void + { + this._type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); + } + + public doVarSamp(): void + { + this._type = this.determineFunction(MySQLLexer.VAR_SAMP_SYMBOL); + } + + public doUnderscoreCharset(): void + { + this._type = this.checkCharset(this.text); + } + + public isVersionComment(): boolean + { + return this.checkMySQLVersion(this.text); + } + + public isBackTickQuotedId(): boolean + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public isDoubleQuotedText(): boolean + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public isSingleQuotedText(): boolean + { + return !this.isSqlModeActive(SqlMode.NoBackslashEscapes); + } + + public override emit(): Token + { + let t = super.emit(); + if (t.type == MySQLLexer.WHITESPACE) + t.channel = Token.HIDDEN_CHANNEL; + return t; + } + + public startInVersionComment(): void + { + this.inVersionComment = true; + } + + public endInVersionComment(): void + { + this.inVersionComment = false; + } + + public isInVersionComment(): boolean + { + return this.inVersionComment; + } +} diff --git a/sql/mysql/Oracle/TypeScript/MySQLParserBase.ts b/sql/mysql/Oracle/TypeScript/MySQLParserBase.ts new file mode 100644 index 0000000000..231280f665 --- /dev/null +++ b/sql/mysql/Oracle/TypeScript/MySQLParserBase.ts @@ -0,0 +1,48 @@ +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +import { Parser } from "antlr4"; +import MySQLParser from "./MySQLParser"; +import SqlMode from "./SqlMode"; + +export default abstract class MySQLParserBase extends Parser { + + // To parameterize the parsing process. + public serverVersion = 0; + public sqlModes = new Set(); + + /** Enable Multi Language Extension support. */ + public supportMle = true; + + /** + * Determines if the given SQL mode is currently active in the lexer. + * + * @param mode The mode to check. + * + * @returns True if the mode is one of the currently active modes. + */ + public isSqlModeActive(mode: SqlMode): boolean { + return this.sqlModes.has(mode); + } + + public isPureIdentifier(): boolean + { + return this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public isTextStringLiteral(): boolean + { + return !this.isSqlModeActive(SqlMode.AnsiQuotes); + } + + public isStoredRoutineBody(): boolean + { + return this.serverVersion >= 80032 && this.supportMle; + } + + public isSelectStatementWithInto(): boolean + { + return this.serverVersion >= 80024 && this.serverVersion < 80031; + } +} diff --git a/sql/mysql/Oracle/TypeScript/SqlMode.ts b/sql/mysql/Oracle/TypeScript/SqlMode.ts new file mode 100644 index 0000000000..acebb55637 --- /dev/null +++ b/sql/mysql/Oracle/TypeScript/SqlMode.ts @@ -0,0 +1,11 @@ +/** SQL modes that control parsing behavior. */ +enum SqlMode { + NoMode, + AnsiQuotes, + HighNotPrecedence, + PipesAsConcat, + IgnoreSpace, + NoBackslashEscapes, +} + +export default SqlMode; diff --git a/sql/mysql/Oracle/TypeScript/Test.ts b/sql/mysql/Oracle/TypeScript/Test.ts new file mode 100644 index 0000000000..584c83079e --- /dev/null +++ b/sql/mysql/Oracle/TypeScript/Test.ts @@ -0,0 +1,229 @@ +// Generated from trgen 0.23.7 + +import { CharStream } from 'antlr4'; +import { CharStreams } from 'antlr4'; +import { CommonTokenStream } from 'antlr4'; +import { ErrorListener } from 'antlr4'; +import { InputStream } from 'antlr4'; +import { Recognizer } from 'antlr4'; +import { RecognitionException } from 'antlr4'; +import { Token } from 'antlr4'; +import { readFileSync } from 'fs'; +import { writeFileSync } from 'fs'; +import { openSync } from 'fs'; +import { readSync } from 'fs'; +import { writeSync } from 'fs'; +import { closeSync } from 'fs'; +import { readFile } from 'fs/promises' + +import MySQLLexer from './MySQLLexer.js'; +import MySQLParser from './MySQLParser.js'; + +import { StringBuilder, emptyString, joinString, formatString, isNullOrWhiteSpace } from 'typescript-string-operations'; +import { Timer, Time, TimerOptions } from 'timer-node'; + + +function getChar() { + let buffer = Buffer.alloc(1); + var xx = 0; + try { + xx = readSync(0, buffer, 0, 1, null); + } catch (err) { + } + if (xx === 0) { + return ''; + } + return buffer.toString('utf8'); +} + + +class MyErrorListener extends ErrorListener { + _quiet: boolean; + _tee: boolean; + _output: any; + had_error: boolean; + + constructor(quiet: boolean, tee: boolean, output: any) { + super(); + this._quiet = quiet; + this._tee = tee; + this._output = output; + this.had_error = false; + } + + syntaxError(recognizer: Recognizer, offendingSymbol: T, line: number, column: number, msg: string, e: RecognitionException | undefined): void { + this.had_error = true; + if (this._tee) { + writeSync(this._output, `line ${line}:${column} ${msg}\n`); + } + if (!this._quiet) { + console.error(`line ${line}:${column} ${msg}`); + } + } +} + +var tee = false; +var show_profile = false; +var show_tree = false; +var show_tokens = false; +var show_trace = false; +var error_code = 0; +var quiet = false; +var encoding = 'utf8'; +var string_instance = 0; +var prefix = ''; +var inputs: string[] = []; +var is_fns: boolean[] = []; + +function splitLines(t: string) { return t.split(/\r\n|\r|\n/); } + +function main() { + for (let i = 2; i &1 | Write-Host +} + +# Because there is no integrated build script for Dart targets, we need +# to manually look at the version in package.json and extract the +# version number. We can then use this with antlr4 to generate the +# parser and lexer. +$version = (Select-String -Path "package.json" -Pattern "antlr4" | ForEach-Object {$_.Line.Split(" ")[5]}) -replace '"|,|\r|\n' + +$(& antlr4 -v $version MySQLLexer.g4 -encoding utf-8 -Dlanguage=TypeScript ; $compile_exit_code = $LASTEXITCODE) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} +$(& antlr4 -v $version MySQLParser.g4 -encoding utf-8 -Dlanguage=TypeScript ; $compile_exit_code = $LASTEXITCODE) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} + + +$(& npm install -g typescript ts-node ; $compile_exit_code = $LASTEXITCODE ) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} + +$(& npm install ; $compile_exit_code = $LASTEXITCODE ) | Write-Host +if($compile_exit_code -ne 0){ + exit $compile_exit_code +} + +if (Test-Path -Path "original") { + Remove-Item "original" -Recurse -Force +} + +$(& tsc -p tsconfig.json --pretty ; $compile_exit_code = $LASTEXITCODE ) | Write-Host + +exit $compile_exit_code diff --git a/sql/mysql/Oracle/TypeScript/build.sh b/sql/mysql/Oracle/TypeScript/build.sh new file mode 100644 index 0000000000..4ea0bc6dd0 --- /dev/null +++ b/sql/mysql/Oracle/TypeScript/build.sh @@ -0,0 +1,20 @@ +# Generated from trgen 0.23.7 +set -e + +if [ -f transformGrammar.py ]; then python3 transformGrammar.py ; fi + +# Because there is no integrated build script for Dart targets, we need +# to manually look at the version in package.json and extract the +# version number. We can then use this with antlr4 to generate the +# parser and lexer. +version=`grep antlr4 package.json | awk '{print $2}' | tr -d '"' | tr -d ',' | tr -d '\r' | tr -d '\n'` + +antlr4 -v $version -encoding utf-8 -Dlanguage=TypeScript MySQLLexer.g4 +antlr4 -v $version -encoding utf-8 -Dlanguage=TypeScript MySQLParser.g4 + +rm -rf original + +npm install -g typescript ts-node +npm install +tsc -p tsconfig.json --pretty +exit 0 diff --git a/sql/mysql/Oracle/desc.xml b/sql/mysql/Oracle/desc.xml index 6d397a28fc..5819861f41 100644 --- a/sql/mysql/Oracle/desc.xml +++ b/sql/mysql/Oracle/desc.xml @@ -1,6 +1,5 @@ - ^4.10 - - MySQLLexer.g4;MySQLParser.g4 + Antlr4ng;CSharp;Java;Python3;TypeScript + examples/**/*.sql diff --git a/sql/mysql/Oracle/examples/admin.sql b/sql/mysql/Oracle/examples/admin.sql new file mode 100644 index 0000000000..0450dcfb89 --- /dev/null +++ b/sql/mysql/Oracle/examples/admin.sql @@ -0,0 +1,7 @@ +-- https://dev.mysql.com/doc/refman/8.0/en/set-statement.html +SET GLOBAL v1=1; +SET @@global.v2=2; +SET LOCAL v1=1; +SET @@local.v2=2; +SET SESSION v1=1; +SET @@session.v2=2; \ No newline at end of file diff --git a/sql/mysql/Oracle/examples/analyze.sql b/sql/mysql/Oracle/examples/analyze.sql new file mode 100644 index 0000000000..78b7ef14a5 --- /dev/null +++ b/sql/mysql/Oracle/examples/analyze.sql @@ -0,0 +1,8 @@ +#begin +ANALYZE TABLE t1; +ANALYZE TABLE t2, t3; +#NB ANALYZE TABLES t2, t3; +ANALYZE TABLE t1 UPDATE HISTOGRAM ON c1, c2; +#NB ANALYZE TABLE t2 UPDATE HISTOGRAM ON c1 WITH 2 BUCKETS; +ANALYZE TABLE t2 DROP HISTOGRAM ON c1; +#end diff --git a/sql/mysql/Oracle/examples/bitrix_queries_cut.sql b/sql/mysql/Oracle/examples/bitrix_queries_cut.sql new file mode 100644 index 0000000000..48511b7ffb --- /dev/null +++ b/sql/mysql/Oracle/examples/bitrix_queries_cut.sql @@ -0,0 +1,2006 @@ +#begin 1 +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/eda' + AND RELATIVE_PATH = '/s1/bitrix/menu/06f' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/eda', '/s1/bitrix/menu/06f', 'bitrix:menu'); +SELECT * FROM `b_forum_user` LIMIT 0; +UPDATE b_forum_user SET LAST_VISIT=now() WHERE USER_ID = 1; +UPDATE b_forum_stat SET `USER_ID` = 1, `IP_ADDRESS` = '10.0.70.52', `SHOW_NAME` = 'admin', `LAST_VISIT` = now(), `SITE_ID` = 's1', `FORUM_ID` = 0, `TOPIC_ID` = 0 WHERE PHPSESSID='o50tf3qfh12hfbbfcpis0npeb2'; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/eda' + AND RELATIVE_PATH = '/s1/bitrix/menu/345' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/eda', '/s1/bitrix/menu/345', 'bitrix:menu'); + + SELECT + COUNT(ST.ID) as CNT + FROM + b_sticker ST + WHERE + ((ST.PERSONAL='Y' AND ST.CREATED_BY=1) OR ST.PERSONAL='N') + AND ST.CLOSED='N' AND ST.DELETED='N' AND ST.SITE_ID='s1' + AND ST.PAGE_URL='/forum/rules/'; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +SELECT * FROM `b_forum_user` LIMIT 0; +UPDATE b_forum_user SET LAST_VISIT=now() WHERE USER_ID = 1; +UPDATE b_forum_stat SET `USER_ID` = 1, `IP_ADDRESS` = '10.0.70.52', `SHOW_NAME` = 'admin', `LAST_VISIT` = now(), `SITE_ID` = 's1', `FORUM_ID` = 1, `TOPIC_ID` = 0 WHERE PHPSESSID='o50tf3qfh12hfbbfcpis0npeb2'; + + SELECT BF.ID AS FORUM_ID , COUNT(FT_RENEW.ID) TCRENEW + FROM b_forum BF + LEFT JOIN b_forum_user_forum FUF ON (FUF.USER_ID = 1 AND FUF.FORUM_ID = BF.ID) + LEFT JOIN b_forum_user_forum FUF_ALL ON (FUF_ALL.USER_ID = 1 AND FUF_ALL.FORUM_ID = 0) + LEFT JOIN b_forum_topic FT_RENEW ON + ( + BF.ID = FT_RENEW.FORUM_ID AND FT_RENEW.STATE != 'L' AND + (FUF_ALL.LAST_VISIT IS NULL OR FT_RENEW.ABS_LAST_POST_DATE > FUF_ALL.LAST_VISIT) + ) + LEFT JOIN b_forum_user_topic FUT_RENEW ON ( + FUT_RENEW.FORUM_ID = BF.ID AND FUT_RENEW.TOPIC_ID = FT_RENEW.ID AND FUT_RENEW.USER_ID = 1) + WHERE( + (BF.ID IN (1 ,2)) + AND + ( + FUT_RENEW.LAST_VISIT IS NULL + AND + ( + (FUF_ALL.LAST_VISIT IS NULL AND FUF.LAST_VISIT IS NULL) + OR + ( + FUF.LAST_VISIT IS NOT NULL + AND + (FUF.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE OR FUF.LAST_VISIT < FT_RENEW.LAST_POST_DATE) + ) + OR + ( + FUF.LAST_VISIT IS NULL + AND + FUF_ALL.LAST_VISIT IS NOT NULL + AND + ( + ( + FUF_ALL.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE + OR + FUF_ALL.LAST_VISIT < FT_RENEW.LAST_POST_DATE + ) + ) + ) + ) + ) + OR ( + FUT_RENEW.LAST_VISIT IS NOT NULL + AND + ( + FUT_RENEW.LAST_VISIT < FT_RENEW.ABS_LAST_POST_DATE + OR + FUT_RENEW.LAST_VISIT < FT_RENEW.LAST_POST_DATE + ) + ) + ) + GROUP BY BF.ID + ; +SELECT FST.*, FU.*, FSTAT.IP_ADDRESS, FSTAT.PHPSESSID, + DATE_FORMAT(FSTAT.LAST_VISIT, '%d.%m.%Y %H:%i:%s') AS LAST_VISIT, + FSTAT.FORUM_ID, FSTAT.TOPIC_ID, + U.LOGIN, U.NAME, U.SECOND_NAME, U.LAST_NAME, + FSTAT.SHOW_NAME + FROM ( SELECT FSTAT.USER_ID, MAX(FSTAT.ID) FST_ID, COUNT(FSTAT.PHPSESSID) COUNT_USER FROM b_forum_stat FSTAT LEFT JOIN b_user U ON (FSTAT.USER_ID=U.ID) WHERE 1=1 AND (FSTAT.SITE_ID = 's1') AND (FSTAT.USER_ID = 0 OR U.ACTIVE = 'Y') AND (FROM_UNIXTIME(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) - 600) <= FSTAT.LAST_VISIT) GROUP BY FSTAT.USER_ID) FST LEFT JOIN b_forum_stat FSTAT ON (FST.FST_ID = FSTAT.ID) LEFT JOIN b_forum_user FU ON (FST.USER_ID = FU.USER_ID) LEFT JOIN b_user U ON (FST.USER_ID = U.ID) ORDER BY FSTAT.USER_ID DESC; +SELECT COUNT('x') as C FROM b_user; +SELECT COUNT(FU.ID) AS CNT FROM b_forum_user FU INNER JOIN b_user U ON (U.ID = FU.USER_ID) WHERE (U.ACTIVE = 'Y') ; +SELECT COUNT(FU.ID) AS CNT FROM b_forum_user FU INNER JOIN b_user U ON (U.ID = FU.USER_ID) WHERE (NUM_POSTS > 0) AND (U.ACTIVE = 'Y') ; +SELECT F_FORUM.*, F.FORUM_GROUP_ID, F.NAME, F.DESCRIPTION, F.SORT, F.ACTIVE, + F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_IMG, F.ALLOW_VIDEO, + F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_FONT, F.ALLOW_SMILES, + F.ALLOW_ALIGN, F.ALLOW_UPLOAD, F.ALLOW_UPLOAD_EXT, F.ALLOW_MOVE_TOPIC, + F.ALLOW_NL2BR, F.ALLOW_TABLE, F.ALLOW_TOPIC_TITLED, F.ALLOW_SIGNATURE, + + F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, + F.ORDER_BY, F.ORDER_DIRECTION, + '' as LID, '' as DIR, + F.TOPICS, F.XML_ID, + F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, + DATE_FORMAT(F.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE, + F.LAST_MESSAGE_ID, FM.TOPIC_ID as TID, F.LAST_MESSAGE_ID as MID, + F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, + DATE_FORMAT(F.ABS_LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as ABS_LAST_POST_DATE, + F.ABS_LAST_MESSAGE_ID, FM_ABS.TOPIC_ID as ABS_TID, + F.EVENT1, F.EVENT2, F.EVENT3, + FT.TITLE, FT.SOCNET_GROUP_ID, FT.OWNER_ID, + TRIM(BOTH '-' FROM REPLACE(CONCAT_WS('-',FT.ID,FT.TITLE_SEO), '--', '-')) AS TITLE_SEO, + FT.HTML AS TOPIC_HTML, FM.PARAM1, FM.PARAM2, + FT_ABS.TITLE as ABS_TITLE, FT_ABS.SOCNET_GROUP_ID as ABS_SOCNET_GROUP_ID, FT_ABS.OWNER_ID as ABS_OWNER_ID, + TRIM(BOTH '-' FROM REPLACE(CONCAT_WS('-',FT_ABS.ID,FT_ABS.TITLE_SEO), '--', '-')) AS ABS_TITLE_SEO, + FT_ABS.HTML AS ABS_TOPIC_HTML, FM_ABS.PARAM1 as ABS_PARAM1, FM_ABS.PARAM2 as ABS_PARAM2, + F.HTML + FROM + ( + SELECT F.ID , F2S.PATH2FORUM_MESSAGE + FROM b_forum F + + INNER JOIN b_forum2site F2S ON (F2S.FORUM_ID=F.ID) + WHERE (1=1 AND ((F2S.SITE_ID = 's1')) AND ((F.ID IN (1, 2))) ) + + GROUP BY F.ID,F2S.PATH2FORUM_MESSAGE + ) F_FORUM + INNER JOIN b_forum F ON (F_FORUM.ID = F.ID) + LEFT JOIN b_forum_group FG ON F.FORUM_GROUP_ID = FG.ID + LEFT JOIN b_forum_message FM ON F.LAST_MESSAGE_ID = FM.ID + LEFT JOIN b_forum_topic FT ON FM.TOPIC_ID = FT.ID + LEFT JOIN b_forum_message FM_ABS ON F.ABS_LAST_MESSAGE_ID = FM_ABS.ID + LEFT JOIN b_forum_topic FT_ABS ON FM_ABS.TOPIC_ID = FT_ABS.ID + ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/6b3' + AND RELATIVE_PATH = '/s1/bitrix/menu/06f' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/6b3', '/s1/bitrix/menu/06f', 'bitrix:menu'); +SELECT * FROM `b_forum_user` LIMIT 0; +UPDATE b_forum_user SET LAST_VISIT=now() WHERE USER_ID = 1; +UPDATE b_forum_stat SET `USER_ID` = 1, `IP_ADDRESS` = '10.0.70.52', `SHOW_NAME` = 'admin', `LAST_VISIT` = now(), `SITE_ID` = 's1', `FORUM_ID` = 0, `TOPIC_ID` = 0 WHERE PHPSESSID='o50tf3qfh12hfbbfcpis0npeb2'; +SELECT F_FORUM.*, F.FORUM_GROUP_ID, F.NAME, F.DESCRIPTION, F.SORT, F.ACTIVE, + F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, F.ALLOW_IMG, F.ALLOW_VIDEO, + F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, F.ALLOW_FONT, F.ALLOW_SMILES, + F.ALLOW_ALIGN, F.ALLOW_UPLOAD, F.ALLOW_UPLOAD_EXT, F.ALLOW_MOVE_TOPIC, + F.ALLOW_NL2BR, F.ALLOW_TABLE, F.ALLOW_TOPIC_TITLED, F.ALLOW_SIGNATURE, + '' as PATH2FORUM_MESSAGE, + F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, + F.ORDER_BY, F.ORDER_DIRECTION, + '' as LID, '' as DIR, + F.TOPICS, F.XML_ID, + F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, + DATE_FORMAT(F.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE, + F.LAST_MESSAGE_ID, FM.TOPIC_ID as TID, F.LAST_MESSAGE_ID as MID, + F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, + DATE_FORMAT(F.ABS_LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as ABS_LAST_POST_DATE, + F.ABS_LAST_MESSAGE_ID, FM_ABS.TOPIC_ID as ABS_TID, + F.EVENT1, F.EVENT2, F.EVENT3, + FT.TITLE, FT.SOCNET_GROUP_ID, FT.OWNER_ID, + TRIM(BOTH '-' FROM REPLACE(CONCAT_WS('-',FT.ID,FT.TITLE_SEO), '--', '-')) AS TITLE_SEO, + FT.HTML AS TOPIC_HTML, FM.PARAM1, FM.PARAM2, + FT_ABS.TITLE as ABS_TITLE, FT_ABS.SOCNET_GROUP_ID as ABS_SOCNET_GROUP_ID, FT_ABS.OWNER_ID as ABS_OWNER_ID, + TRIM(BOTH '-' FROM REPLACE(CONCAT_WS('-',FT_ABS.ID,FT_ABS.TITLE_SEO), '--', '-')) AS ABS_TITLE_SEO, + FT_ABS.HTML AS ABS_TOPIC_HTML, FM_ABS.PARAM1 as ABS_PARAM1, FM_ABS.PARAM2 as ABS_PARAM2, + F.HTML + FROM + ( + SELECT F.ID + FROM b_forum F + + WHERE (1=1 ) + + GROUP BY F.ID + ) F_FORUM + INNER JOIN b_forum F ON (F_FORUM.ID = F.ID) + LEFT JOIN b_forum_group FG ON F.FORUM_GROUP_ID = FG.ID + LEFT JOIN b_forum_message FM ON F.LAST_MESSAGE_ID = FM.ID + LEFT JOIN b_forum_topic FT ON FM.TOPIC_ID = FT.ID + LEFT JOIN b_forum_message FM_ABS ON F.ABS_LAST_MESSAGE_ID = FM_ABS.ID + LEFT JOIN b_forum_topic FT_ABS ON FM_ABS.TOPIC_ID = FT_ABS.ID + ORDER BY F.SORT ASC ; +SELECT COUNT('x') as CNT FROM b_forum_user FU LEFT JOIN b_user U ON (FU.USER_ID = U.ID) WHERE 1 = 1 ; +SELECT FU.ID, U.ID as USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS, + FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, + FU.INTERESTS, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE, + FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, + U.EMAIL, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.LOGIN, U.PERSONAL_BIRTHDATE, + DATE_FORMAT(FU.DATE_REG, '%d.%m.%Y') as DATE_REG, + DATE_FORMAT(FU.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, + DATE_FORMAT(FU.LAST_VISIT, '%d.%m.%Y') as LAST_VISIT_SHORT, + DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y') as DATE_REGISTER_SHORT, + U.PERSONAL_ICQ, U.PERSONAL_WWW, U.PERSONAL_PROFESSION, U.DATE_REGISTER, + U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.PERSONAL_PHOTO, + U.PERSONAL_GENDER, FU.POINTS, FU.HIDE_FROM_ONLINE, + DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') as PERSONAL_BIRTHDAY , +CASE WHEN (FU.USER_ID > 0 AND FU.SHOW_NAME = 'Y' AND LENGTH(TRIM(CONCAT_WS('',U.NAME,' ',U.LAST_NAME))) > 0) THEN TRIM(REPLACE(CONCAT_WS(' ',U.NAME,' ',U.LAST_NAME), ' ', ' ')) ELSE U.LOGIN END AS SHOW_ABC FROM b_forum_user FU LEFT JOIN b_user U ON (FU.USER_ID = U.ID) WHERE 1 = 1 + ORDER BY FU.NUM_POSTS DESC LIMIT 0, 20; +SELECT UG.GROUP_ID FROM b_user_group UG WHERE UG.USER_ID = 1 AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= now())) AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= now())) ; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/6b3' + AND RELATIVE_PATH = '/s1/bitrix/menu/345' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/6b3', '/s1/bitrix/menu/345', 'bitrix:menu'); + + SELECT + COUNT(ST.ID) as CNT + FROM + b_sticker ST + WHERE + ((ST.PERSONAL='Y' AND ST.CREATED_BY=1) OR ST.PERSONAL='N') + AND ST.CLOSED='N' AND ST.DELETED='N' AND ST.SITE_ID='s1' + AND ST.PAGE_URL='/forum/users/'; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +SELECT * FROM `b_forum_user` LIMIT 0; +UPDATE b_forum_user SET LAST_VISIT=now() WHERE USER_ID = 1; +UPDATE b_forum_stat SET `USER_ID` = 1, `IP_ADDRESS` = '10.0.70.52', `SHOW_NAME` = 'admin', `LAST_VISIT` = now(), `SITE_ID` = 's1', `FORUM_ID` = 0, `TOPIC_ID` = 0 WHERE PHPSESSID='o50tf3qfh12hfbbfcpis0npeb2'; +SELECT COUNT('x') as CNT FROM b_forum_user FU LEFT JOIN b_user U ON (FU.USER_ID = U.ID) WHERE 1 = 1 ; +SELECT FU.ID, U.ID as USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS, + FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, + FU.INTERESTS, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE, + FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, + U.EMAIL, U.NAME, U.SECOND_NAME, U.LAST_NAME, U.LOGIN, U.PERSONAL_BIRTHDATE, + DATE_FORMAT(FU.DATE_REG, '%d.%m.%Y') as DATE_REG, + DATE_FORMAT(FU.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, + DATE_FORMAT(FU.LAST_VISIT, '%d.%m.%Y') as LAST_VISIT_SHORT, + DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y') as DATE_REGISTER_SHORT, + U.PERSONAL_ICQ, U.PERSONAL_WWW, U.PERSONAL_PROFESSION, U.DATE_REGISTER, + U.PERSONAL_CITY, U.PERSONAL_COUNTRY, U.PERSONAL_PHOTO, + U.PERSONAL_GENDER, FU.POINTS, FU.HIDE_FROM_ONLINE, + DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') as PERSONAL_BIRTHDAY , +CASE WHEN (FU.USER_ID > 0 AND FU.SHOW_NAME = 'Y' AND LENGTH(TRIM(CONCAT_WS('',U.NAME,' ',U.LAST_NAME))) > 0) THEN TRIM(REPLACE(CONCAT_WS(' ',U.NAME,' ',U.LAST_NAME), ' ', ' ')) ELSE U.LOGIN END AS SHOW_ABC FROM b_forum_user FU LEFT JOIN b_user U ON (FU.USER_ID = U.ID) WHERE 1 = 1 + ORDER BY FU.NUM_POSTS DESC LIMIT 0, 20; +SELECT UG.GROUP_ID FROM b_user_group UG WHERE UG.USER_ID = 1 AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= now())) AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= now())) ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/f25' + AND RELATIVE_PATH = '/s1/bitrix/menu/06f' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/f25', '/s1/bitrix/menu/06f', 'bitrix:menu'); +SELECT * FROM `b_forum_user` LIMIT 0; +UPDATE b_forum_user SET LAST_VISIT=now() WHERE USER_ID = 1; +UPDATE b_forum_stat SET `USER_ID` = 1, `IP_ADDRESS` = '10.0.70.52', `SHOW_NAME` = 'admin', `LAST_VISIT` = now(), `SITE_ID` = 's1', `FORUM_ID` = 0, `TOPIC_ID` = 0 WHERE PHPSESSID='o50tf3qfh12hfbbfcpis0npeb2'; +SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY + + + FROM + b_user U + + + WHERE + (1=1 + AND + ( + U.ID='1' + ) + ) + ORDER BY U.ID asc; +SELECT FU.ID, FU.USER_ID, FU.SHOW_NAME, FU.DESCRIPTION, FU.IP_ADDRESS, + FU.REAL_IP_ADDRESS, FU.AVATAR, FU.NUM_POSTS, FU.POINTS as NUM_POINTS, + FU.INTERESTS, FU.HIDE_FROM_ONLINE, FU.SUBSC_GROUP_MESSAGE, FU.SUBSC_GET_MY_MESSAGE, + FU.LAST_POST, FU.ALLOW_POST, FU.SIGNATURE, FU.RANK_ID, FU.POINTS, + DATE_FORMAT(FU.DATE_REG, '%d.%m.%Y') as DATE_REG, + DATE_FORMAT(FU.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT + FROM b_forum_user FU + WHERE FU.USER_ID = 1; +SELECT F_FORUM.*, F.NAME, F.DESCRIPTION, F.ACTIVE, F.MODERATION, F.INDEXATION, F.DEDUPLICATION, F.ALLOW_MOVE_TOPIC, '' as LID, + F.TOPICS, F.POSTS, F.LAST_POSTER_ID, F.LAST_POSTER_NAME, + DATE_FORMAT(F.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE, + F.LAST_MESSAGE_ID, F.LAST_MESSAGE_ID as MID, + F.POSTS_UNAPPROVED, F.ABS_LAST_POSTER_ID, F.ABS_LAST_POSTER_NAME, + DATE_FORMAT(F.ABS_LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as ABS_LAST_POST_DATE, + F.ABS_LAST_MESSAGE_ID, F.SORT, F.ORDER_BY, + F.ORDER_DIRECTION, F.ALLOW_HTML, F.ALLOW_ANCHOR, F.ALLOW_BIU, + F.ALLOW_IMG, F.ALLOW_VIDEO, F.ALLOW_TABLE, F.ALLOW_LIST, F.ALLOW_QUOTE, F.ALLOW_CODE, + F.ALLOW_ALIGN, F.ALLOW_FONT, F.ALLOW_SMILES, F.ALLOW_UPLOAD, F.EVENT1, F.EVENT2, + F.EVENT3, F.ALLOW_NL2BR, '' as PATH2FORUM_MESSAGE, F.ALLOW_UPLOAD_EXT, F.ALLOW_TOPIC_TITLED, + F.ALLOW_SIGNATURE, + F.FORUM_GROUP_ID, F.ASK_GUEST_EMAIL, F.USE_CAPTCHA, F.XML_ID + FROM + ( + SELECT F.ID + FROM b_forum F + , b_forum2site F2S + WHERE (1=1 AND (F.ID = F2S.FORUM_ID AND (F2S.SITE_ID = 's1' )) AND ((F.ID IN (1, 2))) ) + GROUP BY F.ID + ) F_FORUM + INNER JOIN b_forum F ON (F_FORUM.ID = F.ID) + ; +SELECT UG.GROUP_ID FROM b_user_group UG WHERE UG.USER_ID = 1 AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= now())) AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= now())) ; + + SELECT ENTITY_TYPE_ID, ENTITY_ID, PREVIOUS_VALUE, CURRENT_VALUE, PREVIOUS_POSITION, CURRENT_POSITION + FROM b_rating_results + WHERE RATING_ID = '2' AND ENTITY_ID IN (1) + ; + + SELECT FMM.*, FT.TITLE, FT.DESCRIPTION, FT.VIEWS, FT.LAST_POSTER_ID, + TRIM(BOTH '-' FROM REPLACE(CONCAT_WS('-',FT.ID,FT.TITLE_SEO), '--', '-')) as TITLE_SEO, + DATE_FORMAT(FT.START_DATE, '%d.%m.%Y %H:%i:%s') as START_DATE, + FT.USER_START_NAME, FT.USER_START_ID, FT.POSTS, FT.LAST_POSTER_NAME, + FT.LAST_MESSAGE_ID, '' as IMAGE, '' as IMAGE_DESCR, + FT.APPROVED, FT.STATE, FT.FORUM_ID, FT.ICON, FT.SORT, FT.HTML + FROM + ( + SELECT FM.TOPIC_ID, COUNT(FM.ID) AS COUNT_MESSAGE, MIN(FM.ID) AS FIRST_POST, MAX(FM.ID) AS LAST_POST + FROM b_forum_message FM + + WHERE 1=1 + AND (FM.AUTHOR_ID = (1)) AND (FM.FORUM_ID IN (1,2)) + GROUP BY FM.TOPIC_ID + ) FMM + LEFT JOIN b_forum_topic FT ON (FT.ID = FMM.TOPIC_ID) + ORDER BY FMM.LAST_POST DESC; +SELECT FM.ID, DATE_FORMAT(FM.POST_DATE, '%d.%m.%Y %H:%i:%s') AS POST_DATE FROM b_forum_message FM WHERE FM.ID=7 OR FM.ID=7; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/f25' + AND RELATIVE_PATH = '/s1/bitrix/menu/345' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/f25', '/s1/bitrix/menu/345', 'bitrix:menu'); + + SELECT + COUNT(ST.ID) as CNT + FROM + b_sticker ST + WHERE + ((ST.PERSONAL='Y' AND ST.CREATED_BY=1) OR ST.PERSONAL='N') + AND ST.CLOSED='N' AND ST.DELETED='N' AND ST.SITE_ID='s1' + AND ST.PAGE_URL='/forum/user/1/'; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID AND (L.LID='ru') AND (L.ACTIVE='Y') ORDER BY L.SORT ; +DELETE FROM b_admin_notify_lang WHERE NOTIFY_ID = 16; +DELETE FROM b_admin_notify WHERE ID = 16; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/903' + AND RELATIVE_PATH = '/s1/bitrix/menu/06f' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/903', '/s1/bitrix/menu/06f', 'bitrix:menu'); + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/903' + AND RELATIVE_PATH = '/s1/bitrix/menu/345' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/903', '/s1/bitrix/menu/345', 'bitrix:menu'); + + SELECT + COUNT(ST.ID) as CNT + FROM + b_sticker ST + WHERE + ((ST.PERSONAL='Y' AND ST.CREATED_BY=1) OR ST.PERSONAL='N') + AND ST.CLOSED='N' AND ST.DELETED='N' AND ST.SITE_ID='s1' + AND ST.PAGE_URL='/events-calendar/'; +SELECT AN.ID, AN.MODULE_ID, AN.TAG, AN.MESSAGE, AN.ENABLE_CLOSE, AN.PUBLIC_SECTION, ANL.MESSAGE as MESSAGE_LANG FROM b_admin_notify AN LEFT JOIN b_admin_notify_lang ANL ON (AN.ID = ANL.NOTIFY_ID AND ANL.LID = 'ru') WHERE (1=1 + AND + ( + AN.PUBLIC_SECTION='N' + ) + ) ORDER BY AN.ID DESC; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (6); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=6; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Analytics\\CounterDataTable::submitData();', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(now(), INTERVAL 60 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=6; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW()) DATE_DIFF FROM b_agent WHERE ACTIVE='Y' ; +DELETE FROM b_admin_notify_lang WHERE NOTIFY_ID IN (SELECT ID FROM b_admin_notify WHERE TAG like '%PHOTOGALLERY_UPLOADER%'); +DELETE FROM b_admin_notify WHERE TAG like '%PHOTOGALLERY_UPLOADER%'; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SELECT * FROM `b_admin_notify` LIMIT 0; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SELECT BE.ID as ID,BE.IBLOCK_ID as IBLOCK_ID,BE.ACTIVE as ACTIVE + FROM + b_iblock B + INNER JOIN b_lang L ON B.LID=L.LID + INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID + + + WHERE 1=1 + AND ( + + ((((BE.IBLOCK_ID = '9')))) + AND ((( BE.ACTIVE IS NULL OR NOT (BE.ACTIVE='Y')))) + ) + AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) + + LIMIT 1; +SELECT AN.ID, AN.MODULE_ID, AN.TAG, AN.MESSAGE, AN.ENABLE_CLOSE, AN.PUBLIC_SECTION, ANL.MESSAGE as MESSAGE_LANG FROM b_admin_notify AN LEFT JOIN b_admin_notify_lang ANL ON (AN.ID = ANL.NOTIFY_ID AND ANL.LID = 'ru') WHERE (1=1 + AND + ( + AN.PUBLIC_SECTION='N' + ) + ) ORDER BY AN.ID DESC; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +DELETE FROM b_admin_notify_lang WHERE NOTIFY_ID IN (SELECT ID FROM b_admin_notify WHERE TAG like '%PHOTOGALLERY_UPLOADER%'); +DELETE FROM b_admin_notify WHERE TAG like '%PHOTOGALLERY_UPLOADER%'; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SELECT * FROM `b_admin_notify` LIMIT 0; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +SELECT L.*, BS.* FROM b_iblock_site BS, b_lang L WHERE L.LID=BS.SITE_ID AND BS.IBLOCK_ID=9; +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/cache/photogallery.~853832', '*'); +SELECT A.ID, A.MODULE_ID, A.USER_ID, B.LOGIN, B.NAME as USER_NAME, B.LAST_NAME, A.SORT, A.NAME, A.ACTIVE, DATE_FORMAT(A.LAST_EXEC, '%d.%m.%Y %H:%i:%s') as LAST_EXEC, DATE_FORMAT(A.NEXT_EXEC, '%d.%m.%Y %H:%i:%s') as NEXT_EXEC, A.AGENT_INTERVAL, A.IS_PERIOD FROM b_agent A LEFT JOIN b_user B ON(A.USER_ID = B.ID) WHERE A.NAME LIKE '\\\\Bitrix\\\\Main\\\\Data\\\\CacheEngineFiles::delayedDelete(%' ORDER BY A.ID DESC; + + SELECT ID + FROM b_agent + WHERE NAME = '\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete();' + AND USER_ID IS NULL; +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/managed_cache/MYSQL/agents.~53033', '*'); +SELECT * FROM `b_agent` LIMIT 0; +INSERT INTO b_agent(`MODULE_ID`, `SORT`, `NAME`, `ACTIVE`, `NEXT_EXEC`, `AGENT_INTERVAL`, `IS_PERIOD`, `USER_ID`) VALUES('main', '100', '\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete();', 'Y', CURRENT_DATE, '1', 'Y', NULL ); +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/cache/s1/photogallery.~194981', '*'); +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +SELECT L.*, BS.* FROM b_iblock_site BS, b_lang L WHERE L.LID=BS.SITE_ID AND BS.IBLOCK_ID=9; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; +SELECT L.*, BS.* FROM b_iblock_site BS, b_lang L WHERE L.LID=BS.SITE_ID AND BS.IBLOCK_ID=9; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT BP.* + FROM b_iblock_property BP + + WHERE BP.ACTIVE = 'Y' + AND BP.VERSION = 2 + AND BP.IBLOCK_ID = 9 + + ORDER BY BP.SORT ASC + ; +SELECT BE.ID as ID,BE.IBLOCK_ID as IBLOCK_ID + FROM + b_iblock B + INNER JOIN b_lang L ON B.LID=L.LID + INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID + + + WHERE 1=1 + AND ( + + ((((BE.ID = '110')))) + AND ((((B.ACTIVE='Y')))) + AND ((((BE.IBLOCK_ID = '9')))) + ) + AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) + + ; + + SELECT BP.*, BEP.ID as PROPERTY_VALUE_ID, BEP.VALUE, BEP.DESCRIPTION, BEPE.VALUE VALUE_ENUM, BEPE.XML_ID VALUE_XML_ID, BEPE.SORT VALUE_SORT + FROM b_iblock B + INNER JOIN b_iblock_property BP ON B.ID=BP.IBLOCK_ID + LEFT JOIN b_iblock_element_property BEP ON (BP.ID = BEP.IBLOCK_PROPERTY_ID AND BEP.IBLOCK_ELEMENT_ID = 110) + LEFT JOIN b_iblock_property_enum BEPE ON (BP.PROPERTY_TYPE = 'L' AND BEPE.ID=BEP.VALUE_ENUM AND BEPE.PROPERTY_ID=BP.ID) + WHERE B.ID = 9 + AND BP.ACTIVE='Y' + + ORDER BY BP.SORT asc, BP.ID asc, BEPE.SORT asc, BEP.ID asc; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/c3f' + AND RELATIVE_PATH = '/s1/bitrix/iblock.vote/cd2' + ; +UPDATE b_iblock_element SET TIMESTAMP_X = TIMESTAMP_X, SHOW_COUNTER_START = ifnull(SHOW_COUNTER_START, now()), SHOW_COUNTER = ifnull(SHOW_COUNTER, 0) + 1 WHERE ID=110; +SELECT L.*, BS.* FROM b_iblock_site BS, b_lang L WHERE L.LID=BS.SITE_ID AND BS.IBLOCK_ID=9; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT BP.* + FROM b_iblock_property BP + + WHERE BP.ACTIVE = 'Y' + AND BP.VERSION = 2 + AND BP.IBLOCK_ID = 9 + + ORDER BY BP.SORT ASC + ; +SELECT BE.ID as ID,BE.IBLOCK_ID as IBLOCK_ID + FROM + b_iblock B + INNER JOIN b_lang L ON B.LID=L.LID + INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID + + + WHERE 1=1 + AND ( + + ((((BE.ID = '111')))) + AND ((((B.ACTIVE='Y')))) + AND ((((BE.IBLOCK_ID = '9')))) + ) + AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) + + ; + + SELECT BP.*, BEP.ID as PROPERTY_VALUE_ID, BEP.VALUE, BEP.DESCRIPTION, BEPE.VALUE VALUE_ENUM, BEPE.XML_ID VALUE_XML_ID, BEPE.SORT VALUE_SORT + FROM b_iblock B + INNER JOIN b_iblock_property BP ON B.ID=BP.IBLOCK_ID + LEFT JOIN b_iblock_element_property BEP ON (BP.ID = BEP.IBLOCK_PROPERTY_ID AND BEP.IBLOCK_ELEMENT_ID = 111) + LEFT JOIN b_iblock_property_enum BEPE ON (BP.PROPERTY_TYPE = 'L' AND BEPE.ID=BEP.VALUE_ENUM AND BEPE.PROPERTY_ID=BP.ID) + WHERE B.ID = 9 + AND BP.ACTIVE='Y' + + ORDER BY BP.SORT asc, BP.ID asc, BEPE.SORT asc, BEP.ID asc; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/c3f' + AND RELATIVE_PATH = '/s1/bitrix/iblock.vote/cd2' + ; +UPDATE b_iblock_element SET TIMESTAMP_X = TIMESTAMP_X, SHOW_COUNTER_START = ifnull(SHOW_COUNTER_START, now()), SHOW_COUNTER = ifnull(SHOW_COUNTER, 0) + 1 WHERE ID=111; +SELECT L.*, BS.* FROM b_iblock_site BS, b_lang L WHERE L.LID=BS.SITE_ID AND BS.IBLOCK_ID=9; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (20); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=20; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +UPDATE b_cache_tag SET RELATIVE_PATH='3:1469352763' WHERE TAG='**'; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=20; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT UG.GROUP_ID FROM b_user_group UG WHERE UG.USER_ID = 1 AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= now())) AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= now())) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT AN.ID, AN.MODULE_ID, AN.TAG, AN.MESSAGE, AN.ENABLE_CLOSE, AN.PUBLIC_SECTION, ANL.MESSAGE as MESSAGE_LANG FROM b_admin_notify AN LEFT JOIN b_admin_notify_lang ANL ON (AN.ID = ANL.NOTIFY_ID AND ANL.LID = 'ru') WHERE (1=1 + AND + ( + AN.PUBLIC_SECTION='N' + ) + ) ORDER BY AN.ID DESC; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (20); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=20; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +DELETE FROM b_cache_tag + WHERE SITE_ID = '*' + AND CACHE_SALT = '*' + AND RELATIVE_PATH = '/bitrix/cache/photogallery.~853832'; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +UPDATE b_cache_tag SET RELATIVE_PATH='2:1469352770' WHERE TAG='**'; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=20; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT UG.GROUP_ID FROM b_user_group UG WHERE UG.USER_ID = 1 AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= now())) AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= now())) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (20); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=20; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=20; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT UG.GROUP_ID FROM b_user_group UG WHERE UG.USER_ID = 1 AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= now())) AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= now())) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (20); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=20; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +DELETE FROM b_cache_tag + WHERE SITE_ID = '*' + AND CACHE_SALT = '*' + AND RELATIVE_PATH = '/bitrix/managed_cache/MYSQL/agents.~53033'; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +UPDATE b_cache_tag SET RELATIVE_PATH='1:1469352782' WHERE TAG='**'; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=20; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/f20' + AND RELATIVE_PATH = '/s1/bitrix/menu/06f' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/f20', '/s1/bitrix/menu/06f', 'bitrix:menu'); +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' AND B.GROUP_ID IN (1); +SELECT G.ID, G.NAME, G.SITE_ID FROM b_blog_group G WHERE G.ID = 1; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 3; +SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY + + + FROM + b_user U + + + WHERE + (1=1 + AND + ( + U.ID='3' + ) + ) + ORDER BY U.ID asc; +SELECT C.CATEGORY_ID as CATEGORY_ID, CC.NAME as NAME, COUNT( C.ID) as CNT FROM b_blog_post_category C LEFT JOIN b_blog_category CC ON (CC.ID = C.CATEGORY_ID) INNER JOIN b_blog_post P ON (P.ID = C.POST_ID) WHERE ((((C.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'P' )))) GROUP BY C.CATEGORY_ID, CC.NAME ORDER BY CC.NAME ASC ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG WHERE UG.USER_ID = 1 AND UG.BLOG_ID = 0 ; +SELECT DATE_FORMAT(P.DATE_PUBLISH, '%d.%m.%Y %H:%i:%s') as DATE_PUBLISH, P.ID as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'P' )))) ORDER BY P.DATE_PUBLISH ASC LIMIT 1; +SELECT DATE_FORMAT(P.DATE_PUBLISH, '%Y-%m-%d') as DATE_PUBLISH1, COUNT(P.ID) as CNT FROM b_blog_post P WHERE P.BLOG_ID = 2 AND P.DATE_PUBLISH >= '2016-07-01' AND P.DATE_PUBLISH < '2016-08-01' AND P.PUBLISH_STATUS = 'P' GROUP BY DATE_PUBLISH1 ORDER BY DATE_PUBLISH1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' ; + + SELECT + stags2.NAME + ,COUNT(DISTINCT stags2.SEARCH_CONTENT_ID) as CNT + ,MAX(sc.DATE_CHANGE) DC_TMP + ,DATE_FORMAT(MAX(sc.DATE_CHANGE), '%d.%m.%Y %H:%i:%s') as FULL_DATE_CHANGE + ,DATE_FORMAT(MAX(sc.DATE_CHANGE), '%d.%m.%Y') as DATE_CHANGE + FROM b_search_tags stags2 + INNER JOIN b_search_content sc ON (stags2.SEARCH_CONTENT_ID=sc.ID) + + INNER JOIN b_search_content_site scsite ON (sc.ID=scsite.SEARCH_CONTENT_ID AND stags2.SITE_ID=scsite.SITE_ID) + + WHERE + ((1=1)) + AND (1=1) + AND ( + ( +scsite.SITE_ID = 's1' +AND ( + ( + (sc.DATE_FROM IS NULL) + OR sc.DATE_FROM <= '2016-07-24 12:33:02' + ) + AND ( + (sc.DATE_TO IS NULL) + OR sc.DATE_TO >= '2016-07-24 12:33:02' + ) +)) + AND( + ( +sc.MODULE_ID = 'blog' +AND sc.PARAM1 = 'POST' +AND sc.PARAM2 = '2' + )) + ) + GROUP BY + stags2.NAME + ORDER BY CNT DESC + LIMIT 30; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/f20' + AND RELATIVE_PATH = '/s1/bitrix/search.tags.cloud/f20' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/f20', '/s1/bitrix/search.tags.cloud/f20', 'bitrix:search.tags.cloud'); +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG INNER JOIN b_blog B ON (UG.BLOG_ID = B.ID AND B.URL='s1_blog_3') WHERE UG.USER_ID = 1 ; +SELECT P.FAVORITE_SORT as FAVORITE_SORT, DATE_FORMAT(P.DATE_PUBLISH, '%d.%m.%Y %H:%i:%s') as DATE_PUBLISH, P.ID as ID, MAX('W') as PERMS, COUNT( P.ID) as CNT FROM b_blog_post P WHERE ((((P.PUBLISH_STATUS = 'P' )))) AND (((('W' > 'D' )))) AND ((((P.BLOG_ID = 2 )))) AND ((((P.FAVORITE_SORT > 0 )))) GROUP BY P.FAVORITE_SORT, P.DATE_PUBLISH, P.ID ORDER BY P.FAVORITE_SORT ASC, P.DATE_PUBLISH DESC LIMIT 25; +SELECT COUNT(DISTINCT P.ID) as CNT FROM b_blog_post P WHERE ((((P.PUBLISH_STATUS = 'P' )))) AND (((('W' > 'D' )))) AND ((((P.BLOG_ID = 2 )))) AND ((((P.DATE_PUBLISH <= '2016-07-24 12:33:02')))) GROUP BY P.DATE_PUBLISH, P.ID ; +SELECT DATE_FORMAT(P.DATE_PUBLISH, '%d.%m.%Y %H:%i:%s') as DATE_PUBLISH, P.ID as ID, MAX('W') as PERMS, COUNT( P.ID) as CNT FROM b_blog_post P WHERE ((((P.PUBLISH_STATUS = 'P' )))) AND (((('W' > 'D' )))) AND ((((P.BLOG_ID = 2 )))) AND ((((P.DATE_PUBLISH <= '2016-07-24 12:33:02')))) GROUP BY P.DATE_PUBLISH, P.ID ORDER BY P.DATE_PUBLISH DESC, P.ID DESC LIMIT 0, 27; +SELECT P.*, IF(P.DATE_PUBLISH <= NOW(), 'Y', 'N') as DATE_PUBLISHED, DATE_FORMAT(P.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(P.DATE_PUBLISH, '%d.%m.%Y %H:%i:%s') as DATE_PUBLISH FROM b_blog_post P WHERE P.ID = 3; +SELECT G.ID as ID, G.FILE_ID as FILE_ID, G.POST_ID as POST_ID, G.BLOG_ID as BLOG_ID, G.USER_ID as USER_ID, G.TITLE as TITLE, DATE_FORMAT(G.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X, G.IMAGE_SIZE as IMAGE_SIZE FROM b_blog_image G WHERE ((((G.POST_ID = 3 )))) AND ((((G.BLOG_ID = 2 )))) AND ((((G.IS_COMMENT = 'N' )))) ORDER BY G.ID ASC ; +SELECT G.* FROM b_blog_image G WHERE G.ID = 4; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 3; +SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY + + + FROM + b_user U + + + WHERE + (1=1 + AND + ( + U.ID='3' + ) + ) + ORDER BY U.ID asc; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 9; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 10; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 7; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 11; + + SELECT + UF.ID + ,UF.ENTITY_ID + ,UF.FIELD_NAME + ,UF.USER_TYPE_ID + ,UF.XML_ID + ,UF.SORT + ,UF.MULTIPLE + ,UF.MANDATORY + ,UF.SHOW_FILTER + ,UF.SHOW_IN_LIST + ,UF.EDIT_IN_LIST + ,UF.IS_SEARCHABLE + ,UF.SETTINGS + + ,UFL.EDIT_FORM_LABEL + ,UFL.LIST_COLUMN_LABEL + ,UFL.LIST_FILTER_LABEL + ,UFL.ERROR_MESSAGE + ,UFL.HELP_MESSAGE + + FROM + b_user_field UF + LEFT JOIN b_user_field_lang UFL on UFL.LANGUAGE_ID = 'ru' AND UFL.USER_FIELD_ID = UF.ID + +WHERE UF.ENTITY_ID = 'BLOG_POST' +ORDER BY UF.SORT ASC, UF.ID ASC; +SELECT VALUE_ID, UF_BLOG_POST_DOC, UF_BLOG_POST_URL_PRV, UF_GRATITUDE FROM b_uts_blog_post WHERE VALUE_ID = 3; +SELECT P.*, IF(P.DATE_PUBLISH <= NOW(), 'Y', 'N') as DATE_PUBLISHED, DATE_FORMAT(P.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(P.DATE_PUBLISH, '%d.%m.%Y %H:%i:%s') as DATE_PUBLISH FROM b_blog_post P WHERE P.ID = 2; +SELECT G.ID as ID, G.FILE_ID as FILE_ID, G.POST_ID as POST_ID, G.BLOG_ID as BLOG_ID, G.USER_ID as USER_ID, G.TITLE as TITLE, DATE_FORMAT(G.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X, G.IMAGE_SIZE as IMAGE_SIZE FROM b_blog_image G WHERE ((((G.POST_ID = 2 )))) AND ((((G.BLOG_ID = 2 )))) AND ((((G.IS_COMMENT = 'N' )))) ORDER BY G.ID ASC ; +SELECT G.* FROM b_blog_image G WHERE G.ID = 3; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 3; +SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY + + + FROM + b_user U + + + WHERE + (1=1 + AND + ( + U.ID='3' + ) + ) + ORDER BY U.ID asc; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 5; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 6; +SELECT C.ID, C.BLOG_ID, C.NAME FROM b_blog_category C WHERE C.ID = 8; +SELECT VALUE_ID, UF_BLOG_POST_DOC, UF_BLOG_POST_URL_PRV, UF_GRATITUDE FROM b_uts_blog_post WHERE VALUE_ID = 2; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/f20' + AND RELATIVE_PATH = '/s1/bitrix/menu/345' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/f20', '/s1/bitrix/menu/345', 'bitrix:menu'); + + SELECT + COUNT(ST.ID) as CNT + FROM + b_sticker ST + WHERE + ((ST.PERSONAL='Y' AND ST.CREATED_BY=1) OR ST.PERSONAL='N') + AND ST.CLOSED='N' AND ST.DELETED='N' AND ST.SITE_ID='s1' + AND ST.PAGE_URL='/blogs/s1_blog_3/'; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (20); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=20; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=20; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' AND B.GROUP_ID IN (1); +SELECT G.ID, G.NAME, G.SITE_ID FROM b_blog_group G WHERE G.ID = 1; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG WHERE UG.USER_ID = 1 AND UG.BLOG_ID = 0 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG INNER JOIN b_blog B ON (UG.BLOG_ID = B.ID AND B.URL='s1_blog_3') WHERE UG.USER_ID = 1 ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (20); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=20; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +DELETE FROM b_cache_tag + WHERE SITE_ID = '*' + AND CACHE_SALT = '*' + AND RELATIVE_PATH = '/bitrix/cache/s1/photogallery.~194981'; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +UPDATE b_cache_tag SET RELATIVE_PATH='0:1469352793' WHERE TAG='**'; +DELETE FROM b_agent WHERE ID=20; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' AND B.GROUP_ID IN (1); +SELECT G.ID, G.NAME, G.SITE_ID FROM b_blog_group G WHERE G.ID = 1; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG WHERE UG.USER_ID = 1 AND UG.BLOG_ID = 0 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG INNER JOIN b_blog B ON (UG.BLOG_ID = B.ID AND B.URL='s1_blog_3') WHERE UG.USER_ID = 1 ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW()) DATE_DIFF FROM b_agent WHERE ACTIVE='Y' ; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' AND B.GROUP_ID IN (1); +SELECT G.ID, G.NAME, G.SITE_ID FROM b_blog_group G WHERE G.ID = 1; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG WHERE UG.USER_ID = 1 AND UG.BLOG_ID = 0 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG INNER JOIN b_blog B ON (UG.BLOG_ID = B.ID AND B.URL='s1_blog_3') WHERE UG.USER_ID = 1 ; +SELECT C.ID as ID, C.BLOG_ID as BLOG_ID, C.USER_ID as USER_ID FROM b_blog_user2blog C WHERE ((((C.BLOG_ID = 2 )))) AND ((((C.USER_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.ID = 2; +SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY + + + FROM + b_user U + + + WHERE + (1=1 + AND + ( + U.ID='1' + ) + ) + ORDER BY U.ID asc; +SELECT * FROM `b_blog_user2blog` LIMIT 0; +INSERT INTO b_blog_user2blog(`USER_ID`, `BLOG_ID`) VALUES('1', '2'); +SELECT U2B.ID, U2B.BLOG_ID, U2B.USER_ID FROM b_blog_user2blog U2B WHERE U2B.ID = 1; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY + + + FROM + b_user U + + + WHERE + (1=1 + AND + ( + U.ID='3' + ) + ) + ORDER BY U.ID asc; +SELECT * FROM `b_event` LIMIT 0; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW()) DATE_DIFF FROM b_agent WHERE ACTIVE='Y' ; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' AND B.GROUP_ID IN (1); +SELECT G.ID, G.NAME, G.SITE_ID FROM b_blog_group G WHERE G.ID = 1; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG WHERE UG.USER_ID = 1 AND UG.BLOG_ID = 0 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG INNER JOIN b_blog B ON (UG.BLOG_ID = B.ID AND B.URL='s1_blog_3') WHERE UG.USER_ID = 1 ; +SELECT 'x' FROM b_event WHERE SUCCESS_EXEC='N' LIMIT 1; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_event', 0) as L; + + SELECT ID, C_FIELDS, EVENT_NAME, MESSAGE_ID, LID, DATE_FORMAT(DATE_INSERT, '%d.%m.%Y %H:%i:%s') as DATE_INSERT, DUPLICATE + FROM b_event + WHERE SUCCESS_EXEC='N' + ORDER BY ID + LIMIT 5; +SELECT + `main_mail_internal_event_attachment`.`FILE_ID` AS `FILE_ID` +FROM `b_event_attachment` `main_mail_internal_event_attachment` + +WHERE `main_mail_internal_event_attachment`.`EVENT_ID` = 1; +SELECT + `main_site`.`SERVER_NAME` AS `SERVER_NAME`, + `main_site_culture`.`CHARSET` AS `CULTURE_CHARSET` +FROM `b_lang` `main_site` +LEFT JOIN `b_culture` `main_site_culture` ON `main_site`.`CULTURE_ID` = `main_site_culture`.`ID` +WHERE (UPPER(`main_site`.`LID`) like upper('s1')); +SELECT + `main_mail_internal_event_message`.`ID` AS `ID` +FROM `b_event_message` `main_mail_internal_event_message` +LEFT JOIN `b_event_message_site` `main_mail_internal_event_message_event_message_site` ON `main_mail_internal_event_message`.`ID` = `main_mail_internal_event_message_event_message_site`.`EVENT_MESSAGE_ID` +WHERE UPPER(`main_mail_internal_event_message`.`ACTIVE`) like upper('Y') +AND UPPER(`main_mail_internal_event_message`.`EVENT_NAME`) like upper('BLOG_YOU_TO_BLOG') +AND (UPPER(`main_mail_internal_event_message_event_message_site`.`SITE_ID`) like upper('s1')) +GROUP BY `main_mail_internal_event_message`.`ID`; +SELECT + `main_mail_internal_event_message`.`ID` AS `ID`, + `main_mail_internal_event_message`.`TIMESTAMP_X` AS `TIMESTAMP_X`, + `main_mail_internal_event_message`.`EVENT_NAME` AS `EVENT_NAME`, + `main_mail_internal_event_message`.`LID` AS `LID`, + `main_mail_internal_event_message`.`ACTIVE` AS `ACTIVE`, + `main_mail_internal_event_message`.`EMAIL_FROM` AS `EMAIL_FROM`, + `main_mail_internal_event_message`.`EMAIL_TO` AS `EMAIL_TO`, + `main_mail_internal_event_message`.`SUBJECT` AS `SUBJECT`, + `main_mail_internal_event_message`.`MESSAGE` AS `MESSAGE`, + `main_mail_internal_event_message`.`MESSAGE_PHP` AS `MESSAGE_PHP`, + `main_mail_internal_event_message`.`BODY_TYPE` AS `BODY_TYPE`, + `main_mail_internal_event_message`.`BCC` AS `BCC`, + `main_mail_internal_event_message`.`REPLY_TO` AS `REPLY_TO`, + `main_mail_internal_event_message`.`CC` AS `CC`, + `main_mail_internal_event_message`.`IN_REPLY_TO` AS `IN_REPLY_TO`, + `main_mail_internal_event_message`.`PRIORITY` AS `PRIORITY`, + `main_mail_internal_event_message`.`FIELD1_NAME` AS `FIELD1_NAME`, + `main_mail_internal_event_message`.`FIELD1_VALUE` AS `FIELD1_VALUE`, + `main_mail_internal_event_message`.`FIELD2_NAME` AS `FIELD2_NAME`, + `main_mail_internal_event_message`.`FIELD2_VALUE` AS `FIELD2_VALUE`, + `main_mail_internal_event_message`.`SITE_TEMPLATE_ID` AS `SITE_TEMPLATE_ID`, + `main_mail_internal_event_message`.`ADDITIONAL_FIELD` AS `ADDITIONAL_FIELD` +FROM `b_event_message` `main_mail_internal_event_message` + +WHERE `main_mail_internal_event_message`.`ID` = 14; +SELECT + `main_mail_internal_event_message_attachment`.`FILE_ID` AS `FILE_ID` +FROM `b_event_message_attachment` `main_mail_internal_event_message_attachment` + +WHERE `main_mail_internal_event_message_attachment`.`EVENT_MESSAGE_ID` = 14; +SELECT + `main_mail_internal_event_message_site`.`SITE_ID` AS `SITE_ID` +FROM `b_event_message_site` `main_mail_internal_event_message_site` + +WHERE `main_mail_internal_event_message_site`.`EVENT_MESSAGE_ID` = 14 +AND (UPPER(`main_mail_internal_event_message_site`.`SITE_ID`) like upper('s1')); +SELECT + `main_site`.`LID` AS `LID`, + `main_site`.`SORT` AS `SORT`, + `main_site`.`DEF` AS `DEF`, + `main_site`.`ACTIVE` AS `ACTIVE`, + `main_site`.`NAME` AS `NAME`, + `main_site`.`DIR` AS `DIR`, + `main_site`.`LANGUAGE_ID` AS `LANGUAGE_ID`, + `main_site`.`DOC_ROOT` AS `DOC_ROOT`, + `main_site`.`DOMAIN_LIMITED` AS `DOMAIN_LIMITED`, + `main_site`.`SERVER_NAME` AS `SERVER_NAME`, + `main_site`.`SITE_NAME` AS `SITE_NAME`, + `main_site`.`EMAIL` AS `EMAIL`, + `main_site`.`CULTURE_ID` AS `CULTURE_ID` +FROM `b_lang` `main_site` + +WHERE `main_site`.`LID` = 's1'; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW()) DATE_DIFF FROM b_agent WHERE ACTIVE='Y' ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT UNIX_TIMESTAMP(MIN(NEXT_EXEC))-UNIX_TIMESTAMP(NOW()) DATE_DIFF FROM b_agent WHERE ACTIVE='Y' ; +SELECT * FROM `b_event` LIMIT 0; +UPDATE b_event SET `DATE_EXEC` = '2016-07-24 12:33:27', `SUCCESS_EXEC` = 'Y' WHERE `ID` = '1'; +SELECT + `main_mail_internal_event_attachment`.`FILE_ID` AS `FILE_ID` +FROM `b_event_attachment` `main_mail_internal_event_attachment` + +WHERE `main_mail_internal_event_attachment`.`EVENT_ID` = 2; +SELECT + `main_site`.`SERVER_NAME` AS `SERVER_NAME`, + `main_site_culture`.`CHARSET` AS `CULTURE_CHARSET` +FROM `b_lang` `main_site` +LEFT JOIN `b_culture` `main_site_culture` ON `main_site`.`CULTURE_ID` = `main_site_culture`.`ID` +WHERE (UPPER(`main_site`.`LID`) like upper('s1')); +SELECT + `main_mail_internal_event_message`.`ID` AS `ID` +FROM `b_event_message` `main_mail_internal_event_message` +LEFT JOIN `b_event_message_site` `main_mail_internal_event_message_event_message_site` ON `main_mail_internal_event_message`.`ID` = `main_mail_internal_event_message_event_message_site`.`EVENT_MESSAGE_ID` +WHERE UPPER(`main_mail_internal_event_message`.`ACTIVE`) like upper('Y') +AND UPPER(`main_mail_internal_event_message`.`EVENT_NAME`) like upper('BLOG_USER_TO_YOUR_BLOG') +AND (UPPER(`main_mail_internal_event_message_event_message_site`.`SITE_ID`) like upper('s1')) +GROUP BY `main_mail_internal_event_message`.`ID`; +SELECT + `main_mail_internal_event_message`.`ID` AS `ID`, + `main_mail_internal_event_message`.`TIMESTAMP_X` AS `TIMESTAMP_X`, + `main_mail_internal_event_message`.`EVENT_NAME` AS `EVENT_NAME`, + `main_mail_internal_event_message`.`LID` AS `LID`, + `main_mail_internal_event_message`.`ACTIVE` AS `ACTIVE`, + `main_mail_internal_event_message`.`EMAIL_FROM` AS `EMAIL_FROM`, + `main_mail_internal_event_message`.`EMAIL_TO` AS `EMAIL_TO`, + `main_mail_internal_event_message`.`SUBJECT` AS `SUBJECT`, + `main_mail_internal_event_message`.`MESSAGE` AS `MESSAGE`, + `main_mail_internal_event_message`.`MESSAGE_PHP` AS `MESSAGE_PHP`, + `main_mail_internal_event_message`.`BODY_TYPE` AS `BODY_TYPE`, + `main_mail_internal_event_message`.`BCC` AS `BCC`, + `main_mail_internal_event_message`.`REPLY_TO` AS `REPLY_TO`, + `main_mail_internal_event_message`.`CC` AS `CC`, + `main_mail_internal_event_message`.`IN_REPLY_TO` AS `IN_REPLY_TO`, + `main_mail_internal_event_message`.`PRIORITY` AS `PRIORITY`, + `main_mail_internal_event_message`.`FIELD1_NAME` AS `FIELD1_NAME`, + `main_mail_internal_event_message`.`FIELD1_VALUE` AS `FIELD1_VALUE`, + `main_mail_internal_event_message`.`FIELD2_NAME` AS `FIELD2_NAME`, + `main_mail_internal_event_message`.`FIELD2_VALUE` AS `FIELD2_VALUE`, + `main_mail_internal_event_message`.`SITE_TEMPLATE_ID` AS `SITE_TEMPLATE_ID`, + `main_mail_internal_event_message`.`ADDITIONAL_FIELD` AS `ADDITIONAL_FIELD` +FROM `b_event_message` `main_mail_internal_event_message` + +WHERE `main_mail_internal_event_message`.`ID` = 16; +SELECT + `main_mail_internal_event_message_attachment`.`FILE_ID` AS `FILE_ID` +FROM `b_event_message_attachment` `main_mail_internal_event_message_attachment` + +WHERE `main_mail_internal_event_message_attachment`.`EVENT_MESSAGE_ID` = 16; +SELECT + `main_mail_internal_event_message_site`.`SITE_ID` AS `SITE_ID` +FROM `b_event_message_site` `main_mail_internal_event_message_site` + +WHERE `main_mail_internal_event_message_site`.`EVENT_MESSAGE_ID` = 16 +AND (UPPER(`main_mail_internal_event_message_site`.`SITE_ID`) like upper('s1')); +SELECT + `main_site`.`LID` AS `LID`, + `main_site`.`SORT` AS `SORT`, + `main_site`.`DEF` AS `DEF`, + `main_site`.`ACTIVE` AS `ACTIVE`, + `main_site`.`NAME` AS `NAME`, + `main_site`.`DIR` AS `DIR`, + `main_site`.`LANGUAGE_ID` AS `LANGUAGE_ID`, + `main_site`.`DOC_ROOT` AS `DOC_ROOT`, + `main_site`.`DOMAIN_LIMITED` AS `DOMAIN_LIMITED`, + `main_site`.`SERVER_NAME` AS `SERVER_NAME`, + `main_site`.`SITE_NAME` AS `SITE_NAME`, + `main_site`.`EMAIL` AS `EMAIL`, + `main_site`.`CULTURE_ID` AS `CULTURE_ID` +FROM `b_lang` `main_site` + +WHERE `main_site`.`LID` = 's1'; +UPDATE b_event SET `DATE_EXEC` = '2016-07-24 12:33:37', `SUCCESS_EXEC` = 'Y' WHERE `ID` = '2'; +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_event'); + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; +SELECT 'x' FROM b_event WHERE SUCCESS_EXEC='N' LIMIT 1; +SELECT B.ID, B.USER_ID, B.ALIAS, B.DESCRIPTION, B.AVATAR, B.INTERESTS, B.ALLOW_POST, DATE_FORMAT(B.LAST_VISIT, '%d.%m.%Y %H:%i:%s') as LAST_VISIT, DATE_FORMAT(B.DATE_REG, '%d.%m.%Y %H:%i:%s') as DATE_REG FROM b_blog_user B WHERE B.USER_ID = 1; +SELECT * FROM `b_blog_user` LIMIT 0; +UPDATE b_blog_user SET LAST_VISIT=now() WHERE ID = 1 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' AND B.GROUP_ID IN (1); +SELECT G.ID, G.NAME, G.SITE_ID FROM b_blog_group G WHERE G.ID = 1; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.OWNER_ID = 1 AND B.GROUP_ID IN (1); +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'K' )))) ; +SELECT COUNT(P.ID) as ID FROM b_blog_post P WHERE ((((P.BLOG_ID = 2 )))) AND ((((P.PUBLISH_STATUS = 'D' )))) AND ((((P.AUTHOR_ID = 1 )))) ; +SELECT COUNT( B.ID) as CNT FROM b_blog_user B INNER JOIN b_blog_user2user_group U2UG ON (B.USER_ID = U2UG.USER_ID) WHERE ((((B.USER_ID = 1 )))) AND ((((U2UG.BLOG_ID = 2 )))) ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG WHERE UG.USER_ID = 1 AND UG.BLOG_ID = 0 ; +SELECT B.ID, B.NAME, B.DESCRIPTION, B.ACTIVE, B.OWNER_ID, B.URL, B.GROUP_ID, B.ENABLE_COMMENTS, B.ENABLE_IMG_VERIF, B.EMAIL_NOTIFY, B.ENABLE_RSS, B.REAL_URL, B.LAST_POST_ID, B.AUTO_GROUPS, B.ALLOW_HTML, B.SEARCH_INDEX, B.SOCNET_GROUP_ID, B.USE_SOCNET, DATE_FORMAT(B.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE, DATE_FORMAT(B.DATE_UPDATE, '%d.%m.%Y %H:%i:%s') as DATE_UPDATE, DATE_FORMAT(B.LAST_POST_DATE, '%d.%m.%Y %H:%i:%s') as LAST_POST_DATE FROM b_blog B WHERE B.URL = 's1_blog_3' ; +SELECT UG.ID, UG.USER_ID, UG.BLOG_ID, UG.USER_GROUP_ID FROM b_blog_user2user_group UG INNER JOIN b_blog B ON (UG.BLOG_ID = B.ID AND B.URL='s1_blog_3') WHERE UG.USER_ID = 1 ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (6); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=6; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Analytics\\CounterDataTable::submitData();', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(now(), INTERVAL 60 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=6; + + SELECT Q.*, + DATE_FORMAT(Q.TIMESTAMP_X, '%d.%m.%Y') TIMESTAMP_X + FROM b_vote_question Q + WHERE (1=1 + AND + ( + (Q.ACTIVE = 'Y') + ) + + AND + ( + Q.VOTE_ID = 1 + ) + ) + ORDER BY Q.C_SORT ASC; + + SELECT V.CHANNEL_ID, VQ.VOTE_ID, VA.* + FROM b_vote_answer VA + INNER JOIN b_vote_question VQ ON (VA.QUESTION_ID = VQ.ID) + INNER JOIN b_vote V ON (VQ.VOTE_ID = V.ID) + WHERE 1=1 AND ((VQ.VOTE_ID = 1)) AND ((VA.ACTIVE = 'Y')) AND ((VA.QUESTION_ID IN (1))) ORDER BY VA.C_SORT ASC; +SELECT VEQ.QUESTION_ID, VEA.ANSWER_ID, COUNT(VEA.ID) as COUNTER, MIN(TIMESTAMPDIFF(SECOND, VE.DATE_VOTE, NOW())) AS LAST_VOTE FROM b_vote_event VE INNER JOIN b_vote_event_question VEQ ON (VEQ.EVENT_ID = VE.ID) INNER JOIN b_vote_event_answer VEA ON (VEA.EVENT_QUESTION_ID = VEQ.ID) LEFT JOIN b_vote_user VU ON (VU.ID = VE.VOTE_USER_ID) WHERE 1=1 AND ((VE.VOTE_ID = 1)) AND ((VE.VALID = 'Y' )) GROUP BY VEQ.QUESTION_ID, VEA.ANSWER_ID ORDER BY COUNTER DESC; +UPDATE b_vote_user SET `LAST_IP` = '10.0.70.52', `DATE_LAST` = now(), `STAT_GUEST_ID` = '0', `AUTH_USER_ID` = '1' WHERE (ID='1') AND (AUTH_USER_ID='1'); +INSERT INTO b_vote_event(`VOTE_ID`, `VOTE_USER_ID`, `DATE_VOTE`, `STAT_SESSION_ID`, `IP`, `VALID`) VALUES (1, 1, now(), 0, '10.0.70.52', 'Y'); +INSERT INTO b_vote_event_question(`EVENT_ID`, `QUESTION_ID`) VALUES (2, 1); +INSERT INTO b_vote_event_answer(`ANSWER_ID`, `EVENT_QUESTION_ID`) VALUES (1, 2); +UPDATE b_vote SET `COUNTER` = COUNTER+1 WHERE ID='1'; +UPDATE b_vote_question SET `COUNTER` = COUNTER+1 WHERE ID in (1); +UPDATE b_vote_answer SET `COUNTER` = COUNTER+1 WHERE ID in (1); +UPDATE b_vote_user SET `DATE_LAST` = now(), `COUNTER` = COUNTER+1 WHERE ID='1'; +SELECT * FROM b_cache_tag WHERE TAG = 'vote_form_vote_1'; +DELETE FROM b_cache_tag WHERE TAG = 'vote_form_vote_1'; + + DELETE FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/e25' + AND RELATIVE_PATH = '/s1/bitrix/voting.current/ANKETA_s1/' + ; +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/cache/s1/bitrix/voting.current/ANKETA_s1.~619977', '*'); +SELECT A.ID, A.MODULE_ID, A.USER_ID, B.LOGIN, B.NAME as USER_NAME, B.LAST_NAME, A.SORT, A.NAME, A.ACTIVE, DATE_FORMAT(A.LAST_EXEC, '%d.%m.%Y %H:%i:%s') as LAST_EXEC, DATE_FORMAT(A.NEXT_EXEC, '%d.%m.%Y %H:%i:%s') as NEXT_EXEC, A.AGENT_INTERVAL, A.IS_PERIOD FROM b_agent A LEFT JOIN b_user B ON(A.USER_ID = B.ID) WHERE A.NAME LIKE '\\\\Bitrix\\\\Main\\\\Data\\\\CacheEngineFiles::delayedDelete(%' ORDER BY A.ID DESC; + + SELECT ID + FROM b_agent + WHERE NAME = '\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete();' + AND USER_ID IS NULL; +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/managed_cache/MYSQL/agents.~947835', '*'); +SELECT * FROM `b_agent` LIMIT 0; +INSERT INTO b_agent(`MODULE_ID`, `SORT`, `NAME`, `ACTIVE`, `NEXT_EXEC`, `AGENT_INTERVAL`, `IS_PERIOD`, `USER_ID`) VALUES('main', '100', '\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete();', 'Y', CURRENT_DATE, '1', 'Y', NULL ); + + DELETE FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/e25' + AND RELATIVE_PATH = '/s1/bitrix/voting.result/1' + ; +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/cache/s1/bitrix/voting.result/1.~485621', '*'); + + DELETE FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/e25' + AND RELATIVE_PATH = '/s1/bitrix/voting.form' + ; +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/cache/s1/bitrix/voting.form.~227422', '*'); +INSERT INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) VALUES ('*', '*', '/bitrix/managed_cache/MYSQL/b_vote.~855528', '*'); + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; + + SELECT VV.*, C.TITLE as CHANNEL_TITLE, C.ACTIVE as CHANNEL_ACTIVE, + C.HIDDEN as CHANNEL_HIDDEN, V.*, + CASE WHEN (C.ACTIVE = 'Y' AND V.ACTIVE = 'Y' AND V.DATE_START <= NOW() AND NOW() <= V.DATE_END) + THEN IF (C.VOTE_SINGLE != 'Y', 'green', 'yellow') + ELSE 'red' + END AS LAMP, + DATE_FORMAT(V.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, + DATE_FORMAT(V.DATE_START, '%d.%m.%Y %H:%i:%s') DATE_START, + DATE_FORMAT(V.DATE_END, '%d.%m.%Y %H:%i:%s') DATE_END, + UNIX_TIMESTAMP(V.DATE_END) - UNIX_TIMESTAMP(V.DATE_START) PERIOD + FROM ( + SELECT V.ID, COUNT(Q.ID) QUESTIONS + FROM b_vote V + INNER JOIN b_vote_channel C ON (C.ID=V.CHANNEL_ID) + LEFT JOIN b_vote_question Q ON (Q.VOTE_ID=V.ID) + WHERE (1=1 + AND + ( + ( + (V.CHANNEL_ID='1' and V.CHANNEL_ID is not null) + ) + ) + + AND + ( + (V.ACTIVE='Y' and now()>=V.DATE_START and now()<=V.DATE_END) + ) + ) + GROUP BY V.ID + ) VV + INNER JOIN b_vote V ON (V.ID = VV.ID) + INNER JOIN b_vote_channel C ON (C.ID = V.CHANNEL_ID) ORDER BY V.ID desc ; +SELECT MAX(V.ID) AS ACTIVE_VOTE_ID FROM b_vote V WHERE V.CHANNEL_ID=1 AND V.ACTIVE = 'Y' AND NOW() >= V.DATE_START AND V.DATE_END >= NOW(); + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/e25' + AND RELATIVE_PATH = '/s1/bitrix/voting.current/ANKETA_s1/' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/e25', '/s1/bitrix/voting.current/ANKETA_s1/', 'vote_form_channel_1'), +('s1', '/e25', '/s1/bitrix/voting.current/ANKETA_s1/', 'vote_form_vote_1'); + + SELECT V.*, + C.TITLE as CHANNEL_TITLE, + C.SYMBOLIC_NAME as CHANNEL_SYMBOLIC_NAME, + C.C_SORT as CHANNEL_C_SORT, + C.FIRST_SITE_ID as CHANNEL_FIRST_SITE_ID, + C.ACTIVE as CHANNEL_ACTIVE, + C.HIDDEN as CHANNEL_HIDDEN, + C.TITLE as CHANNEL_TITLE, + C.VOTE_SINGLE as CHANNEL_VOTE_SINGLE, + C.USE_CAPTCHA as CHANNEL_USE_CAPTCHA, + DATE_FORMAT(V.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, + DATE_FORMAT(V.DATE_START, '%d.%m.%Y %H:%i:%s') DATE_START, + DATE_FORMAT(V.DATE_END, '%d.%m.%Y %H:%i:%s') DATE_END, + CASE WHEN (C.ACTIVE = 'Y' AND V.ACTIVE = 'Y' AND V.DATE_START <= NOW() AND NOW() <= V.DATE_END) + THEN IF (C.VOTE_SINGLE != 'Y', 'green', 'yellow') + ELSE 'red' + END AS LAMP + FROM b_vote V + INNER JOIN b_vote_channel C ON (V.CHANNEL_ID = C.ID) + WHERE 1=1 AND ((V.ID = 1)) ORDER BY V.ID ASC; + + SELECT Q.*, + DATE_FORMAT(Q.TIMESTAMP_X, '%d.%m.%Y') TIMESTAMP_X + FROM b_vote_question Q + WHERE (1=1 + AND + ( + (Q.ACTIVE = 'Y') + ) + + AND + ( + Q.VOTE_ID = 1 + ) + ) + ORDER BY Q.C_SORT ASC; + + SELECT V.CHANNEL_ID, VQ.VOTE_ID, VA.* + FROM b_vote_answer VA + INNER JOIN b_vote_question VQ ON (VA.QUESTION_ID = VQ.ID) + INNER JOIN b_vote V ON (VQ.VOTE_ID = V.ID) + WHERE 1=1 AND ((VQ.VOTE_ID = 1)) AND ((VA.ACTIVE = 'Y')) AND ((VA.QUESTION_ID IN (1))) ORDER BY VA.C_SORT ASC; +SELECT VEQ.QUESTION_ID, VEA.ANSWER_ID, COUNT(VEA.ID) as COUNTER, MIN(TIMESTAMPDIFF(SECOND, VE.DATE_VOTE, NOW())) AS LAST_VOTE FROM b_vote_event VE INNER JOIN b_vote_event_question VEQ ON (VEQ.EVENT_ID = VE.ID) INNER JOIN b_vote_event_answer VEA ON (VEA.EVENT_QUESTION_ID = VEQ.ID) LEFT JOIN b_vote_user VU ON (VU.ID = VE.VOTE_USER_ID) WHERE 1=1 AND ((VE.VOTE_ID = 1)) AND ((VE.VALID = 'Y' )) GROUP BY VEQ.QUESTION_ID, VEA.ANSWER_ID ORDER BY COUNTER DESC; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/e25' + AND RELATIVE_PATH = '/s1/bitrix/voting.result/1' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/e25', '/s1/bitrix/voting.result/1', 'vote_form_channel_1'), +('s1', '/e25', '/s1/bitrix/voting.result/1', 'vote_form_vote_1'), +('s1', '/e25', '/s1/bitrix/voting.result/1', 'vote_form_question_1'); +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (21); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=21; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +UPDATE b_cache_tag SET RELATIVE_PATH='5:1469352825' WHERE TAG='**'; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=21; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; + + SELECT Q.*, + DATE_FORMAT(Q.TIMESTAMP_X, '%d.%m.%Y') TIMESTAMP_X + FROM b_vote_question Q + WHERE (1=1 + AND + ( + (Q.ACTIVE = 'Y') + ) + + AND + ( + Q.VOTE_ID = 1 + ) + ) + ORDER BY Q.C_SORT ASC; + + SELECT V.CHANNEL_ID, VQ.VOTE_ID, VA.* + FROM b_vote_answer VA + INNER JOIN b_vote_question VQ ON (VA.QUESTION_ID = VQ.ID) + INNER JOIN b_vote V ON (VQ.VOTE_ID = V.ID) + WHERE 1=1 AND ((VQ.VOTE_ID = 1)) AND ((VA.ACTIVE = 'Y')) AND ((VA.QUESTION_ID IN (1))) ORDER BY VA.C_SORT ASC; +SELECT VEQ.QUESTION_ID, VEA.ANSWER_ID, COUNT(VEA.ID) as COUNTER, MIN(TIMESTAMPDIFF(SECOND, VE.DATE_VOTE, NOW())) AS LAST_VOTE FROM b_vote_event VE INNER JOIN b_vote_event_question VEQ ON (VEQ.EVENT_ID = VE.ID) INNER JOIN b_vote_event_answer VEA ON (VEA.EVENT_QUESTION_ID = VEQ.ID) LEFT JOIN b_vote_user VU ON (VU.ID = VE.VOTE_USER_ID) WHERE 1=1 AND ((VE.VOTE_ID = 1)) AND ((VE.VALID = 'Y' )) GROUP BY VEQ.QUESTION_ID, VEA.ANSWER_ID ORDER BY COUNTER DESC; + + SELECT TAG + FROM b_cache_tag + WHERE SITE_ID = 's1' + AND CACHE_SALT = '/e25' + AND RELATIVE_PATH = '/s1/bitrix/voting.form' + ; + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/e25', '/s1/bitrix/voting.form', 'vote_form_channel_1'); + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/e25', '/s1/bitrix/voting.form', 'vote_form_vote_1'); + + INSERT IGNORE INTO b_cache_tag (SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG) + VALUES + ('s1', '/e25', '/s1/bitrix/voting.form', 'vote_form_question_1'); +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (21); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=21; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +DELETE FROM b_cache_tag + WHERE SITE_ID = '*' + AND CACHE_SALT = '*' + AND RELATIVE_PATH = '/bitrix/cache/s1/bitrix/voting.current/ANKETA_s1.~619977'; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +UPDATE b_cache_tag SET RELATIVE_PATH='4:1469352827' WHERE TAG='**'; + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=21; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; + + SELECT DISTINCT + B.* + ,B.XML_ID as EXTERNAL_ID + ,DATE_FORMAT(B.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X + ,L.DIR as LANG_DIR + ,L.SERVER_NAME + FROM + b_iblock B + INNER JOIN b_lang L ON L.LID=B.LID + WHERE 1 = 1 + + AND ((((B.ACTIVE='Y')))) AND ((((B.ID = '2')))) + ; +SET NAMES 'utf8'; +SET collation_connection = "utf8_unicode_ci"; + + SELECT 'x' + FROM b_agent + WHERE + ACTIVE = 'Y' + AND NEXT_EXEC <= now() + AND (DATE_CHECK IS NULL OR DATE_CHECK <= now()) + + LIMIT 1 + ; +SELECT GET_LOCK('cff29ec0118154ee0dcf115d29478b29_agent', 0) as L; +SELECT ID, NAME, AGENT_INTERVAL, IS_PERIOD, MODULE_ID FROM b_agent WHERE ACTIVE='Y' AND NEXT_EXEC<=now() AND (DATE_CHECK IS NULL OR DATE_CHECK<=now()) ORDER BY RUNNING ASC, SORT desc; +UPDATE b_agent SET DATE_CHECK=DATE_ADD(IF(DATE_CHECK IS NULL, now(), DATE_CHECK), INTERVAL 600 SECOND) WHERE ID IN (21); +SELECT RELEASE_LOCK('cff29ec0118154ee0dcf115d29478b29_agent'); +UPDATE b_agent SET RUNNING='Y' WHERE ID=21; +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + +SELECT SITE_ID, CACHE_SALT, RELATIVE_PATH, TAG from b_cache_tag WHERE TAG='**'; +SELECT count(1) CNT from b_cache_tag WHERE TAG='*' +LIMIT 0, 1; + + + UPDATE b_agent SET + NAME='\\Bitrix\\Main\\Data\\CacheEngineFiles::delayedDelete(1);', + LAST_EXEC=now(), + NEXT_EXEC=DATE_ADD(NEXT_EXEC, INTERVAL 1 SECOND), + DATE_CHECK=NULL, + RUNNING='N' + WHERE ID=21; +DELETE FROM b_admin_notify_lang WHERE NOTIFY_ID IN (SELECT ID FROM b_admin_notify WHERE TAG like '%PHOTOGALLERY_UPLOADER%'); +DELETE FROM b_admin_notify WHERE TAG like '%PHOTOGALLERY_UPLOADER%'; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SELECT * FROM `b_admin_notify` LIMIT 0; +SELECT L.*, L.LID as ID, L.LID as LANGUAGE_ID, C.FORMAT_DATE, C.FORMAT_DATETIME, C.FORMAT_NAME, C.WEEK_START, C.CHARSET, C.DIRECTION FROM b_language L, b_culture C WHERE C.ID = L.CULTURE_ID ORDER BY L.LID ; +SELECT DISTINCT BS.ID AS ID, +BS.ACTIVE AS ACTIVE, +BS.CREATED_BY AS CREATED_BY, +BS.IBLOCK_SECTION_ID AS IBLOCK_SECTION_ID, +BS.NAME AS NAME, +BS.PICTURE AS PICTURE, +BS.DESCRIPTION AS DESCRIPTION, +BS.DESCRIPTION_TYPE AS DESCRIPTION_TYPE, +BS.CODE AS CODE, +BS.SOCNET_GROUP_ID AS SOCNET_GROUP_ID, +DATE_FORMAT(BS.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') AS TIMESTAMP_X + FROM b_iblock_section BS + INNER JOIN b_iblock B ON BS.IBLOCK_ID = B.ID + + + WHERE 1=1 + + + AND ((((BS.IBLOCK_ID = '9')))) + AND ((((BS.CREATED_BY = '1')))) + AND (((BS.SOCNET_GROUP_ID IS NULL))) + AND (((BS.IBLOCK_SECTION_ID IS NULL))) + AND ((((B.ID = '9')))) + AND ((((B.ACTIVE='Y')))) + + ORDER BY BS.TIMESTAMP_X desc , BS.ID desc ; + + SELECT BP.* + FROM b_iblock_property BP + + WHERE BP.ACTIVE = 'Y' + AND BP.VERSION = 2 + AND BP.IBLOCK_ID = 9 + + ORDER BY BP.SORT ASC + ; +SELECT COUNT('x') as C + FROM + b_iblock B + INNER JOIN b_lang L ON B.LID=L.LID + INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID + + + WHERE 1=1 + AND ( + + ((((BE.IBLOCK_ID = '9')))) + AND ( + + ((BE.IN_SECTIONS='N' OR EXISTS ( + SELECT BSE.IBLOCK_ELEMENT_ID + FROM b_iblock_section_element BSE + + INNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID + + WHERE BSE.IBLOCK_ELEMENT_ID = BE.ID + AND ((BS.ACTIVE = 'Y')) + ))) + ) + ) + AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) + + ; +SELECT BE.ID as ID,BE.CODE as CODE,BE.IBLOCK_ID as IBLOCK_ID,BE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID,BE.NAME as NAME,BE.ACTIVE as ACTIVE,BE.DETAIL_PICTURE as DETAIL_PICTURE,BE.PREVIEW_PICTURE as PREVIEW_PICTURE,BE.PREVIEW_TEXT as PREVIEW_TEXT,BE.DETAIL_TEXT as DETAIL_TEXT,DATE_FORMAT(BE.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE,BE.CREATED_BY as CREATED_BY,BE.SHOW_COUNTER as SHOW_COUNTER,BE.SORT as SORT,BE.TAGS as TAGS,DATE_FORMAT(BE.DATE_CREATE, '%Y.%m.%d') as CREATED_DATE,BE.DETAIL_TEXT_TYPE as DETAIL_TEXT_TYPE,BE.PREVIEW_TEXT_TYPE as PREVIEW_TEXT_TYPE + FROM + b_iblock B + INNER JOIN b_lang L ON B.LID=L.LID + INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID + + + WHERE 1=1 + AND ( + + ((((BE.IBLOCK_ID = '9')))) + AND ( + + ((BE.IN_SECTIONS='N' OR EXISTS ( + SELECT BSE.IBLOCK_ELEMENT_ID + FROM b_iblock_section_element BSE + + INNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID + + WHERE BSE.IBLOCK_ELEMENT_ID = BE.ID + AND ((BS.ACTIVE = 'Y')) + ))) + ) + ) + AND (((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL))) + + ORDER BY DATE_FORMAT(BE.DATE_CREATE, '%Y.%m.%d') desc ,BE.ID asc LIMIT 0, 45; + + SELECT BP.*, BEP.ID as PROPERTY_VALUE_ID, BEP.VALUE, BEP.DESCRIPTION, BEPE.VALUE VALUE_ENUM, BEPE.XML_ID VALUE_XML_ID, BEPE.SORT VALUE_SORT + FROM b_iblock B + INNER JOIN b_iblock_property BP ON B.ID=BP.IBLOCK_ID + LEFT JOIN b_iblock_element_property BEP ON (BP.ID = BEP.IBLOCK_PROPERTY_ID AND BEP.IBLOCK_ELEMENT_ID = 103) + LEFT JOIN b_iblock_property_enum BEPE ON (BP.PROPERTY_TYPE = 'L' AND BEPE.ID=BEP.VALUE_ENUM AND BEPE.PROPERTY_ID=BP.ID) + WHERE B.ID = 9 + AND BP.ACTIVE='Y' + + ORDER BY BP.SORT asc, BP.ID asc, BEPE.SORT asc, BEP.ID asc; +SELECT DISTINCT BS.ID AS ID, +BS.LEFT_MARGIN AS LEFT_MARGIN, +BS.RIGHT_MARGIN AS RIGHT_MARGIN, +BS.NAME AS NAME, +BS.ACTIVE AS ACTIVE + FROM b_iblock_section BS + INNER JOIN b_iblock B ON BS.IBLOCK_ID = B.ID + + + WHERE 1=1 + + + AND ((((BS.IBLOCK_ID = '9')))) + AND ((((BS.ID = '96')))) + AND ((((B.ID = '9')))) + ; +SELECT DISTINCT + BS.*, + B.LIST_PAGE_URL, + B.SECTION_PAGE_URL, + B.IBLOCK_TYPE_ID, + B.CODE as IBLOCK_CODE, + B.XML_ID as IBLOCK_EXTERNAL_ID, + BS.XML_ID as EXTERNAL_ID, + DATE_FORMAT(BS.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') as TIMESTAMP_X, + DATE_FORMAT(BS.DATE_CREATE, '%d.%m.%Y %H:%i:%s') as DATE_CREATE + + FROM b_iblock_section BS + INNER JOIN b_iblock B ON BS.IBLOCK_ID = B.ID + + + WHERE 1=1 + + + AND ((((BS.IBLOCK_ID = '9')))) + AND ((((BS.ID = '96')))) + AND ((((B.ACTIVE='Y')))) + AND ((((B.ID = '9')))) + ; + + SELECT STRAIGHT_JOIN COUNT(DISTINCT BE.ID) as CNT + FROM b_iblock_section BS + INNER JOIN b_iblock_section BSTEMP ON (BSTEMP.IBLOCK_ID=BS.IBLOCK_ID + AND BSTEMP.LEFT_MARGIN >= BS.LEFT_MARGIN + AND BSTEMP.RIGHT_MARGIN <= BS.RIGHT_MARGIN) + INNER JOIN b_iblock_section_element BSE ON BSE.IBLOCK_SECTION_ID=BSTEMP.ID + INNER JOIN b_iblock_element BE ON BE.ID=BSE.IBLOCK_ELEMENT_ID AND BE.IBLOCK_ID=BS.IBLOCK_ID + + WHERE BS.ID=96 + AND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL ) + OR BE.WF_NEW='Y' ) + + ; + + SELECT + + BS.*, + B.LIST_PAGE_URL, + B.SECTION_PAGE_URL, + B.IBLOCK_TYPE_ID, + B.CODE as IBLOCK_CODE, + B.XML_ID as IBLOCK_EXTERNAL_ID, + BS.XML_ID as EXTERNAL_ID + + FROM + b_iblock_section BS + INNER JOIN b_iblock B ON B.ID = BS.IBLOCK_ID + WHERE BS.ID=96 + AND BS.IBLOCK_ID=9 + ; + + SELECT + + BS.*, + B.LIST_PAGE_URL, + B.SECTION_PAGE_URL, + B.IBLOCK_TYPE_ID, + B.CODE as IBLOCK_CODE, + B.XML_ID as IBLOCK_EXTERNAL_ID, + BS.XML_ID as EXTERNAL_ID + + FROM + b_iblock_section BS + INNER JOIN b_iblock B ON B.ID = BS.IBLOCK_ID + WHERE BS.ID=95 + AND BS.IBLOCK_ID=9; +#end diff --git a/sql/mysql/Oracle/examples/case_sensitive_sql.sql b/sql/mysql/Oracle/examples/case_sensitive_sql.sql new file mode 100644 index 0000000000..2371690cc9 --- /dev/null +++ b/sql/mysql/Oracle/examples/case_sensitive_sql.sql @@ -0,0 +1,4 @@ +SeleCT * frOm someID whErE someexpr > coname orDer bY 1; +upDaTe tbl SeT col=11 wherE col2 > 1; +DeleTE t1.*, t2 from t1 join t3 on t1.col1 = t3.col1 jOin t2 oN t2.col2 = t3.col2 where t3.co4 is NoT nULl; +InsERT iNtO t(coL1, cOl2, CoL3, Col4) ValUes (1, 2, 3, 4), (sQRt(5), aBs(10-poWeR(3,4)), cEIL(rAnD()*100) , (sIn(0.5*3.413234) + coS(100 MoD 33)) +lOG(pI()*eXp(AcOS(10)*AtAn(10))) ); \ No newline at end of file diff --git a/sql/mysql/Oracle/examples/ddl_alter.sql b/sql/mysql/Oracle/examples/ddl_alter.sql new file mode 100644 index 0000000000..774c1ba052 --- /dev/null +++ b/sql/mysql/Oracle/examples/ddl_alter.sql @@ -0,0 +1,119 @@ +#begin +-- Alter Table +alter table ship_class add column ship_spec varchar(150) first, add somecol int after start_build; +alter table t3 add column (c2 decimal(10, 2) comment 'comment`' null, c3 enum('abc', 'cba', 'aaa')), add index t3_i1 using btree (c2) comment 'some index'; +alter table t3 add column (c2 decimal(10, 2), c3 int); +ALTER TABLE `deals` ADD INDEX `idx_custom_field_30c4f4a7c529ccf0825b2fac732bebfd843ed764` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."30c4f4a7c529ccf0825b2fac732bebfd843ed764".value')) as DOUBLE))); +ALTER TABLE `deals` ADD INDEX `idx_custom_field_30c4f4a7c529ccf0825b2fac732bebfd843ed764` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."30c4f4a7c529ccf0825b2fac732bebfd843ed764".value')) as FLOAT))); +alter table t3 alter index t3_i1 invisible; +alter table t3 alter index t3_i1 visible; +alter table t3 rename index t3_i1 to t3_i2; +alter table t2 add constraint t2_pk_constraint primary key (1c), alter column `_` set default 1; +alter table t2 drop constraint t2_pk_constraint; +alter table ship_class change column somecol col_for_del tinyint first; +alter table t5 rename column old to new; +alter table ship_class drop col_for_del; +alter table t3 drop index t3_i1; +alter table t3 drop index t3_i2; +alter table childtable drop index fk_idParent_parentTable; +alter table t2 drop primary key; +alter table t3 rename to table3column; +alter table db2.t3 rename to db2.table3column; +alter table childtable add constraint `fk1` foreign key (idParent) references parenttable(id) on delete restrict on update cascade; +alter table table3column default character set = cp1251; +alter table `test` change `id` `id` varchar(10) character set utf8mb4 collate utf8mb4_bin not null; +alter table `test` change `id` `id` varchar(10) character set utf8mb4 binary not null; +alter table `test` change `id` `id` varchar(10) character set utf8mb4 binary null default null; +alter table with_check add constraint check (c1 in (1, 2, 3, 4)); +alter table with_check add constraint c2 check (c1 in (1, 2, 3, 4)); +alter table with_check add check (c1 in (1, 2, 3, 4)); +alter table with_partition add partition (partition p201901 values less than (737425) engine = InnoDB); +alter table with_partition add partition (partition p1 values less than (837425) engine = InnoDB, partition p2 values less than (MAXVALUE) engine = InnoDB); +alter table t1 stats_auto_recalc=default stats_sample_pages=50; +alter table t1 stats_auto_recalc=default, stats_sample_pages=50; +alter table t1 stats_auto_recalc=default, stats_sample_pages=default; +alter table t1 modify column c1 enum('abc','cba','aaa') character set 'utf8' collate 'utf8_unicode_ci' not null default 'abc'; +alter table table1 add primary key (id); +alter table table1 add primary key table_pk (id); +alter table table1 add primary key `table_pk` (id); +alter table table1 add primary key `table_pk` (`id`); +alter table table1 drop foreign key fk_name; +alter table table1 drop constraint cons; +alter table table1 add column yes varchar(255) default '' null; +alter table add_test add column col1 int not null; +alter table `some_table` add (primary key `id` (`id`),`k_id` int unsigned not null,`another_field` smallint not null,index `k_id` (`k_id`)); +alter table `some_table` add column (unique key `another_field` (`another_field`)); +#NB: alter table default.task add column xxxx varchar(200) comment 'cdc test'; +ALTER TABLE `hcore`.comments COLLATE='utf8mb4_general_ci', CONVERT TO CHARSET UTF8MB4; +ALTER TABLE T1 ADD FOREIGN KEY ( I ) REFERENCES TT ( I ) ON DELETE SET DEFAULT; +ALTER TABLE T1 ADD FOREIGN KEY ( I ) REFERENCES TT ( I ) ON UPDATE SET DEFAULT; +ALTER TABLE T1 ADD CHECK (id + 6 > 10) ENFORCED; +ALTER TABLE T1 ADD CHECK (ID + 6 > 10) NOT ENFORCED; +ALTER TABLE T1 ALTER CHECK C_CONS ENFORCED; +ALTER TABLE T1 ALTER CHECK C_CONS NOT ENFORCED; +ALTER TABLE T1 ALTER I SET VISIBLE; +ALTER TABLE T1 ALTER I SET INVISIBLE; +ALTER TABLE `order` ADD cancelled TINYINT(1) DEFAULT 0 NOT NULL, ADD delivered TINYINT(1) DEFAULT 0 NOT NULL, ADD returning TINYINT(1) DEFAULT 0 NOT NULL; +#end +#begin +-- Alter database +alter database test default character set = utf8; +#NB: alter schema somedb_name upgrade data directory name; +alter database test_1 default encryption = 'Y' read only = 1; +#end +#begin +-- Alter event +alter definer = current_user event someevent on schedule at current_timestamp + interval 30 minute; +alter definer = 'ivan'@'%' event someevent on completion preserve; +alter definer = 'ivan'@'%' event someevent rename to newsomeevent; +alter event newsomeevent enable comment 'some comment'; +-- delimiter // +alter definer = current_user event newsomeevent on schedule at current_timestamp + interval 2 hour +rename to someevent disable +do begin update test.t2 set 1c = 1c + 1; end; -- // +-- delimiter ; +#end +#begin +-- Alter function/procedure +alter function f_name comment 'some funct' language sql sql security invoker; +alter function one_more_func contains sql sql security definer; +alter procedure p_name comment 'some funct' language sql sql security invoker; +alter procedure one_more_proc contains sql sql security definer; +#end +#begin +-- Alter logfile group +-- http://dev.mysql.com/doc/refman/5.6/en/alter-logfile-group.html +ALTER LOGFILE GROUP lg_3 ADD UNDOFILE 'undo_10.dat' INITIAL_SIZE=32M ENGINE=NDBCLUSTER; +ALTER LOGFILE GROUP lg_1 ADD UNDOFILE 'undo_10.dat' wait ENGINE=NDB; +#end +#begin +-- Alter server +-- http://dev.mysql.com/doc/refman/5.6/en/alter-server.html +ALTER SERVER s OPTIONS (USER 'sally'); +#end +#begin +-- Alter tablespace +alter tablespace tblsp_1 add datafile 'filename' engine = ndb; +alter tablespace tblsp_2 drop datafile 'deletedfilename' wait engine ndb; +#end +#begin +-- Alter view +alter view my_view1 as select 1 union select 2 limit 0,5; +alter algorithm = merge view my_view2(col1, col2) as select * from t2 with check option; +alter definer = 'ivan'@'%' view my_view3 as select count(*) from t3; +#NB: alter definer = current_user sql security invoker view my_view4(c1, 1c, _, c1_2) +# as select * from (t1 as tt1, t2 as tt2) inner join t1 on t1.col1 = tt1.col1; +-- Alter user +ALTER USER 'mattias.hultman' DEFAULT ROLE `prod-spain-mysql-read-only`@`%`; +rename user user1@100.200.1.1 to user2@100.200.1.2; +#NB: rename user user1@100.200.1.1 to user2@2001:0db8:85a3:0000:0000:8a2e:0370:7334; +#NB: rename user user1@100.200.1.1 to user2@::1; +alter user 'user'@'%' IDENTIFIED BY 'newpassword' RETAIN CURRENT PASSWORD; +ALTER USER 'test_dual_pass'@'%' IDENTIFIED BY RANDOM PASSWORD RETAIN CURRENT PASSWORD; +ALTER USER 'test_dual_pass'@'%' IDENTIFIED BY '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' RETAIN CURRENT PASSWORD; +ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password'; +ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'; +ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' AS 'REDACTED' RETAIN CURRENT PASSWORD; +ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' BY '2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' REPLACE 'current_auth_string' RETAIN CURRENT PASSWORD; +#NB: ALTER USER 'test_dual_pass'@'%' IDENTIFIED WITH 'mysql_native_password' BY RANDOM PASSWORD REPLACE 'current_auth_string' RETAIN CURRENT PASSWORD; +#end diff --git a/sql/mysql/Oracle/examples/ddl_create.sql b/sql/mysql/Oracle/examples/ddl_create.sql new file mode 100644 index 0000000000..4d2fd1d072 --- /dev/null +++ b/sql/mysql/Oracle/examples/ddl_create.sql @@ -0,0 +1,858 @@ +#begin +-- Create User +CREATE USER 'test_crm_debezium'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' PASSWORD EXPIRE NEVER COMMENT '-'; +CREATE USER 'jim'@'localhost' ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}'; +CREATE USER 'jim' @'localhost' ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}'; +-- Create Table +create table new_t (like t1); +#NB: create table log_table(row varchar(512)); +#NB: create table log_table(row character(512)); +create table ships(name varchar(255), class_id int, id int); +create table ships_guns(guns_id int, ship_id int); +create table guns(id int, power decimal(7,2), callibr decimal(10,3)); +create table ship_class(id int, class_name varchar(100), tonange decimal(10,2), max_length decimal(10,2), start_build year, end_build year(4), max_guns_size int); +create table `some table $$`(id int auto_increment key, class varchar(10), data binary) engine=MYISAM; +create table quengine(id int auto_increment key, class varchar(10), data binary) engine='InnoDB'; +create table quengine(id int auto_increment key, class varchar(10), data binary) engine="Memory"; +create table quengine(id int auto_increment key, class varchar(10), data binary) engine=`CSV`; +create table quengine(id int auto_increment key, class varchar(10), data binary COMMENT 'CSV') engine=MyISAM; +create table quengine(id int auto_increment key, class varchar(10), data binary) engine=Aria; +create table `parent_table`(id int primary key, column1 varchar(30), index parent_table_i1(column1(20)), check(char_length(column1)>10)) engine InnoDB; +create table child_table(id int unsigned auto_increment primary key, id_parent int references parent_table(id) match full on update cascade on delete set null) engine=InnoDB; +create table `another some table $$` like `some table $$`; +create table `actor` (`last_update` timestamp default CURRENT_TIMESTAMP, `birthday` datetime default CURRENT_TIMESTAMP ON UPDATE LOCALTIMESTAMP); +create table boolean_table(c1 bool, c2 boolean default true); +#NB: create table default_table(c1 int default 42, c2 int default -42, c3 varchar(256) DEFAULT _utf8mb3'xxx'); +create table ts_table( + ts1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + ts2 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIME, + ts3 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIMESTAMP, + ts4 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(), + ts5 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIME(), + ts6 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIMESTAMP(), + ts7 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE NOW(), + ts8 TIMESTAMP(6) NOT NULL, + ts9 TIMESTAMP(6) NOT NULL DEFAULT NOW(6) ON UPDATE NOW(6), + ts10 TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + ts11 TIMESTAMP NOT NULL DEFAULT '2038-01-01 00:00:00' ON UPDATE CURRENT_TIMESTAMP +); +create table dt_table( + dt1 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + dt2 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIME, + dt3 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIMESTAMP, + dt4 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(), + dt5 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIME(), + dt6 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE LOCALTIMESTAMP(), + dt7 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE NOW(), + dt10 DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + dt11 DATETIME DEFAULT '2038-01-01 00:00:00' ON UPDATE CURRENT_TIMESTAMP +); +create table with_check (c1 integer not null,c2 varchar(22),constraint c1 check (c2 in ('a', 'b', 'c'))); +CREATE TABLE genvalue1 (id binary(16) NOT NULL, val char(32) GENERATED ALWAYS AS (hex(id)) STORED, PRIMARY KEY (id)); +CREATE TABLE genvalue2 (id binary(16) NOT NULL, val char(32) AS (hex(id)) STORED, PRIMARY KEY (id)); +CREATE TABLE genvalue3 (id binary(16) NOT NULL, val char(32) GENERATED ALWAYS AS (hex(id)) VIRTUAL, PRIMARY KEY (id)); +CREATE TABLE cast_charset (col BINARY(16) GENERATED ALWAYS AS (CAST('xx' as CHAR(16) CHARACTER SET BINARY)) VIRTUAL); +CREATE TABLE cast_charset (col BINARY(16) GENERATED ALWAYS AS (CAST('xx' as CHAR(16) CHARSET BINARY)) VIRTUAL); +CREATE TABLE check_table_kw (id int primary key, upgrade varchar(256), quick varchar(256), fast varchar(256), medium varchar(256), extended varchar(256), changed varchar(256)); +CREATE TABLE sercol1 (id SERIAL, val INT); +CREATE TABLE sercol2 (id SERIAL PRIMARY KEY, val INT); +CREATE TABLE sercol3 (id SERIAL NULL, val INT); +CREATE TABLE sercol4 (id SERIAL NOT NULL, val INT); +CREATE TABLE serval1 (id SMALLINT SERIAL DEFAULT VALUE, val INT); +CREATE TABLE serval2 (id SMALLINT SERIAL DEFAULT VALUE PRIMARY KEY, val INT); +CREATE TABLE serval3 (id SMALLINT(3) NULL SERIAL DEFAULT VALUE, val INT); +CREATE TABLE serval4 (id SMALLINT(5) UNSIGNED SERIAL DEFAULT VALUE NOT NULL, val INT); +CREATE TABLE serial (serial INT); +CREATE TABLE float_table (f1 FLOAT, f2 FLOAT(10), f3 FLOAT(7,4)); +CREATE TABLE USER (INTERNAL BOOLEAN DEFAULT FALSE); +#NB: create table table_with_character_set_eq (id int, data varchar(50)) character set = default; +#NB: create table table_with_character_set (id int, data varchar(50)) character set default; +create table table_with_visible_index (id int, data varchar(50), UNIQUE INDEX `data_UNIQUE` (`data` ASC) INVISIBLE VISIBLE); +create table table_with_index (id int, data varchar(50), UNIQUE INDEX `data_UNIQUE` (`data` ASC)); +create table blob_test(id int, col1 blob(45)); +create table žluťoučký (kůň int); +create table column_names_as_aggr_funcs(min varchar(100), max varchar(100), sum varchar(100), count varchar(100)); +CREATE TABLE char_table (c1 CHAR VARYING(10), c2 CHARACTER VARYING(10), c3 NCHAR VARYING(10)); +create table rack_shelf_bin ( id int unsigned not null auto_increment unique primary key, bin_volume decimal(20, 4) default (bin_len * bin_width * bin_height)); +#NB: CREATE TABLE `tblSRCHjob_desc` (`description_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `description` mediumtext NOT NULL, PRIMARY KEY (`description_id`)) ENGINE=TokuDB AUTO_INCREMENT=4095997820 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=TOKUDB_QUICKLZ; +create table invisible_column_test(id int, col1 int INVISIBLE); +create table visible_column_test(id int, col1 int VISIBLE); +create table table_with_buckets(id int(11) auto_increment NOT NULL COMMENT 'ID', buckets int(11) NOT NULL COMMENT '分桶数'); +CREATE TABLE foo (c1 decimal(19), c2 decimal(19.5), c3 decimal(0.0), c4 decimal(0.2), c5 decimal(19,2)); +CREATE TABLE table_items (id INT, purchased DATE) + PARTITION BY RANGE( YEAR(purchased) ) + SUBPARTITION BY HASH( TO_DAYS(purchased) ) + SUBPARTITIONS 2 ( + PARTITION p0 VALUES LESS THAN (1990), + PARTITION p1 VALUES LESS THAN (2000), + PARTITION p2 VALUES LESS THAN MAXVALUE + ); + +CREATE TABLE T1 ( +ID INT NOT NULL, +NAME VARCHAR(255), +UNIQUE KEY(ID) +) PARTITION BY KEY() PARTITIONS 2; + +CREATE TABLE table_items_with_subpartitions (id INT, purchased DATE) + PARTITION BY RANGE( YEAR(purchased) ) + SUBPARTITION BY HASH( TO_DAYS(purchased) ) ( + PARTITION p0 VALUES LESS THAN (1990) ( + SUBPARTITION s0, + SUBPARTITION s1 + ), + PARTITION p1 VALUES LESS THAN (2000) ( + SUBPARTITION s2, + SUBPARTITION s3 + ), + PARTITION p2 VALUES LESS THAN MAXVALUE ( + SUBPARTITION s4, + SUBPARTITION s5 + ) + ); + +#NB: CREATE TABLE positions_rollover ( +# id bigint(20) NOT NULL AUTO_INCREMENT, +# time datetime NOT NULL, +# partition_index int(10) unsigned NOT NULL DEFAULT 0, +# PRIMARY KEY (id,partition_index), +# KEY time (time) +#) ENGINE=InnoDB DEFAULT CHARSET=utf8 +#PARTITION BY LIST (partition_index) ( +# PARTITION positions_rollover_partition VALUES IN (0) ENGINE = InnoDB, +# PARTITION default_positions_rollover_partition DEFAULT ENGINE = InnoDB +#); + +#NB: CREATE TABLE `tab_with_json_value` ( +# `col0` JSON NOT NULL, +# `col1` VARCHAR(36) COLLATE utf8mb4_bin GENERATED ALWAYS AS ( +# JSON_VALUE(`col0`, _utf8mb4'$._field1' RETURNING CHAR(36) CHARACTER SET latin1) +# ) STORED NOT NULL, +# `col2` VARCHAR(36) COLLATE utf8mb4_bin GENERATED ALWAYS AS ( +# JSON_VALUE(`col0`, _utf8mb4'$._field1' ERROR ON EMPTY) +# ) STORED NOT NULL, +# `col3` VARCHAR(36) COLLATE utf8mb4_bin GENERATED ALWAYS AS ( +# JSON_VALUE(`col0`, _utf8mb4'$._field1' DEFAULT 'xx' ON ERROR) +# ) STORED NOT NULL, +# `col4` JSON NOT NULL, +# PRIMARY KEY (`col1`) +#) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = COMPRESSED; + +#NB: CREATE TABLE CustomerTable ( +# CustomerID varchar(5), +# CompanyName varchar(40), +# ContactName varchar(30), +# Address varchar(60), +# Phone varchar(24) +# ) ENGINE = CONNECT TABLE_TYPE = ODBC; + +CREATE TABLE CustomerTable ( + table_type varchar(5) +); + +CREATE TABLE tbl ( + col1 LONGTEXT, + data JSON, + INDEX idx1 ((SUBSTRING(col1, 1, 10))), + INDEX idx2 ((CAST(JSON_EXTRACT(data, _utf8mb4'$') AS UNSIGNED ARRAY))), + INDEX ((CAST(data->>'$.name' AS CHAR(30)))) +); + +CREATE TABLE `orders_json_2` ( + `id` int NOT NULL AUTO_INCREMENT, + `reward` json DEFAULT NULL, + `additional_info` json DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_order_codes` ((cast(json_extract(`additional_info`,_utf8mb4'$.order_codes') as char(17) array))) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +CREATE TABLE keywords ( + eur VARCHAR(100), + iso VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + usa VARCHAR(100), + jis VARCHAR(100), + internal INT, + instant BIT +); + +CREATE TABLE T1 (C NATIONAL CHAR); +CREATE TABLE T1 (C GEOMETRY SRID 0); +CREATE TABLE T1 (C POINT SRID 0); +CREATE TABLE T1 (C LINESTRING SRID 0); +CREATE TABLE T1 (C POLYGON SRID 0); +CREATE TABLE T1 (C MULTIPOINT SRID 0); +CREATE TABLE T1 (C MULTILINESTRING SRID 0); +CREATE TABLE T1 (C MULTIPOLYGON SRID 0); +CREATE TABLE T1 (C GEOMETRYCOLLECTION SRID 0); +CREATE TABLE T1 (ID BIGINT, S VARCHAR(100), I INT, CONSTRAINT ABC CHECK (ID < 5) ENFORCED); +CREATE TABLE T1 (ID BIGINT REFERENCES TT (TT_ID) ON DELETE SET DEFAULT); +CREATE TABLE T1 (ID BIGINT REFERENCES TT (TT_ID) ON UPDATE SET DEFAULT); + +create table if not exists tbl_signed_unsigned( + `id` bigint(20) ZEROFILL signed UNSIGNED signed ZEROFILL unsigned ZEROFILL NOT NULL AUTO_INCREMENT COMMENT 'ID', + c1 int signed unsigned, + c2 decimal(10, 2) SIGNED UNSIGNED ZEROFILL, + c3 float SIGNED ZEROFILL, + c4 double precision(18, 4) UNSIGNED SIGNED ZEROFILL, + PRIMARY KEY (`id`) +); + +CREATE TABLE `daily_intelligences`( +`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '', +`partner_code` varchar(32) DEFAULT NULL COMMENT '', +`text` LONGTEXT DEFAULT NULL COMMENT '', +`monitor_time` TIMESTAMP DEFAULT NULL COMMENT '', +`gmt_modify` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '', +`gmt_create` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '', +PRIMARY KEY (`id`) +) ENGINE=innodb DEFAULT CHAR SET=utf8 COMMENT ''; + +CREATE TABLE `auth_realm_clients` ( +`pk_realm` int unsigned NOT NULL DEFAULT '0', +`fk_realm` int unsigned DEFAULT NULL, +`client_id` varchar(150) NOT NULL, +`client_secret` blob NOT NULL, +PRIMARY KEY (`pk_realm`), +KEY `auth_realms_auth_realm_clients` (`fk_realm`) +) START TRANSACTION ENGINE=InnoDB DEFAULT CHARSET=latin1; + +create table `site_checker_b_sonet_group_favorites` ( +USER_ID int(11) not null, +GROUP_ID int(11) not null, +DATE_ADD datetime DEFAULT NULL, +primary key (USER_ID, GROUP_ID) +); + +CREATE TABLE `table_default_fn`(`quote_id` varchar(32) NOT NULL,`created_at` bigint(20) NOT NULL); +CREATE TABLE `test_table\\`(id INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE = INNODB; +CREATE TABLE `\\test_table`(id INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE = INNODB; +CREATE TABLE `\\test\\_table\\`(id INT(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE = INNODB; + +#NB: CREATE TABLE TableWithVector (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, vec1 VECTOR, vec2 VECTOR); +#end +#begin +-- Rename table +-- http://dev.mysql.com/doc/refman/5.6/en/rename-table.html +RENAME TABLE old_table TO tmp_table, new_table TO old_table, tmp_table TO new_table; +RENAME TABLE table_b TO table_a; +RENAME TABLE current_db.tbl_name TO other_db.tbl_name; +rename table debezium_all_types_old to debezium_all_types, test_json_object_old to test_json_object; +#end +#begin +-- Truncate table +truncate table t1; +truncate parent_table; +truncate `#`; +truncate `#!^%$`; +truncate table tbl_without_pk; +#end +#begin +-- Create database +create database somedb; +create schema if not exists myschema; +create schema `select` default character set = utf8; +create database if not exists `current_date` character set cp1251; +create database super default character set utf8 collate = utf8_bin character set utf8 collate utf8_bin; +create database super_cs default charset utf8 collate = utf8_bin character set utf8 collate utf8_bin; +#NB: create database db_with_character_set_eq character set = default; +#NB: create database db_with_character_set character set default; +create database `ymsun_test1` charset gb18030 collate gb18030_bin; +create database `test` charset binary collate binary; +#end +#begin +-- Create event 1 +-- delimiter // +create definer = current_user event if not exists someevent on schedule at current_timestamp + interval 30 minute +on completion preserve do begin insert into test.t1 values (33), (111);select * from test.t1; end; -- // +#end +#begin +-- Create event 2 +create definer = 'ivan'@'%' event testevent1 on schedule every 1 hour ends '2016-11-05 23:59:00' +do begin select * from test.t2; end; -- // +#end +#begin +-- Create event 3 +create definer = current_user() event testevent2 on schedule at '2016-11-03 23:59:00' +do begin update test.t2 set 1c = 1c + 1; end; -- // +-- delimiter ; +#end +#begin +-- Create index +create index index1 on t1(col1) comment 'test index' comment 'some test' using btree; +create unique index index2 using btree on t2(1c desc, `_` asc); +create index index3 using hash on antlr_tokens(token(30) asc); +create index index4 on antlr_tokens(token(30) asc) lock default; +create index index5 on antlr_tokens(token(30) asc) algorithm default; +create index index6 on antlr_tokens(token(30) asc) algorithm default lock default; +create index index7 on antlr_tokens(token(30) asc) lock default algorithm default; +create index index8 on t1(col1) comment 'test index' using btree; +CREATE INDEX `idx_custom_field_30c4f4a7c529ccf0825b2fac732bebfd843ed764` ON `deals` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."30c4f4a7c529ccf0825b2fac732bebfd843ed764".value')) as double))); +CREATE INDEX `idx_custom_field_d3bb7ad91ba729aaa20df0af037cb7ed8ce3ffc8` ON `deals` ((cast(json_unquote(json_extract(`custom_fields`,_utf8mb4'$."d3bb7ad91ba729aaa20df0af037cb7ed8ce3ffc8".value')) as float))); +#end +#begin +-- Create logfile group +-- http://dev.mysql.com/doc/refman/5.6/en/create-logfile-group.html +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' INITIAL_SIZE = 10M ENGINE = InnoDB; +-- CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' INITIAL_SIZE = 10M; +CREATE LOGFILE GROUP lg1 ADD UNDOFILE 'undo.dat' INITIAL_SIZE = 10000000 ENGINE = NDB; +#end +#begin +-- Create server +-- http://dev.mysql.com/doc/refman/5.6/en/create-server.html +CREATE SERVER s +FOREIGN DATA WRAPPER mysql +OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test'); +#end +#begin +-- Create tablespace +create tablespace tblsp1 add datafile 'tblsp_work1' use logfile group lg_1 initial_size = 4G engine MYISAM; +create tablespace tblsp2 add datafile 'tblsp_proj1' use logfile group lg_6 autoextend_size = 4294 max_size = 2294967296 engine NDB; +#end +#begin +-- Create trigger 1 +-- delimiter // +create trigger trg_my1 before delete on test.t1 for each row begin insert into log_table values ("delete row from test.t1"); insert into t4 values (old.col1, old.col1 + 5, old.col1 + 7); end; -- //-- delimiter ; +#end +#begin +-- Create trigger 2 +create definer = current_user() trigger trg_my2 after insert on test.t2 for each row insert into log_table values (concat("inserted into table test.t2 values: (1c, _) = (", cast(NEW.col1 as char(100)), ", ", convert(new.`_`, char(100)), ")")); +#end +#begin +-- Create trigger 3 +-- delimiter // +CREATE TRIGGER mask_private_data BEFORE INSERT ON users FOR EACH ROW BEGIN SET NEW.phone = CONCAT('555', NEW.id); END; -- //-- delimiter ; +#end +#begin +-- Create trigger 4 +-- CAST to JSON +CREATE DEFINER=`ctlplane`@`%` TRIGGER `write_key_add` AFTER INSERT ON `sources` FOR EACH ROW +BEGIN +DECLARE i, n INT DEFAULT 0; +SET n = JSON_LENGTH(CAST(CONVERT(NEW.write_keys USING utf8mb4) AS JSON)); +SET campaign_id = NEW.write_keys->>'$.campaign_id'; +WHILE i < n DO +INSERT INTO source_id_write_key_mapping (source_id, write_key) +VALUES (NEW.id, JSON_UNQUOTE(JSON_EXTRACT(CAST(CONVERT(NEW.write_keys USING utf8mb4) AS JSON), CONCAT('$[', i, ']')))) +ON DUPLICATE KEY UPDATE + source_id = NEW.ID, + write_key = JSON_UNQUOTE(JSON_EXTRACT(CAST(CONVERT(NEW.write_keys USING utf8mb4) AS JSON), CONCAT('$[', i, ']'))); +SET i = i + 1; +END WHILE; +END +#NB: +; +#end +#begin +-- Create trigger 5 +#NB: CREATE TRIGGER `rtl_trigger_before_update` +#BEFORE UPDATE +#ON all_student_educator FOR EACH ROW +#BEGIN +# IF NEW.student_words_read_total is not null AND NEW.student_words_read_total >= 3 AND NEW.badge_3_words_read_flag = 0 THEN +# SET +# NEW.badge_flag = 1, +# NEW.badge_student_total = NEW.badge_student_total + 1, +# NEW.badge_datetime = now(); +# INSERT IGNORE INTO user_platform_badge (platform_badge_id, user_id) VALUES (3, NEW.student_id); +# END IF; +#END +#end +#begin +-- Create trigger 6 +-- delimiter // +#NB: create trigger trg_my1 before delete on test.t1 for each row begin insert into log_table values ("delete row from test.t1"); insert into t4 values (old.col1, old.col1 + 5, old.col1 + 7); end; -- //-- delimiter ; +#end +#begin +-- Create view +create or replace view my_view1 as select 1 union select 2 limit 0,5; +create algorithm = merge view my_view2(col1, col2) as select * from t2 with check option; +create or replace definer = 'ivan'@'%' view my_view3 as select count(*) from t3; +#NB: create or replace definer = current_user sql security invoker view my_view4(c1, 1c, _, c1_2) +# as select * from (t1 as tt1, t2 as tt2) inner join t1 on t1.col1 = tt1.col1; +create view v_some_table as (with a as (select * from some_table) select * from a); + +#end +#begin +-- Create function +-- delimiter // +CREATE FUNCTION `fivenumbers`() RETURNS varchar(5) CHARSET utf8 COLLATE utf8_unicode_ci DETERMINISTIC +BEGIN + RETURN '12345'; +END; -- //-- delimiter ; +#end +#begin +-- Create function +CREATE FUNCTION `uuidToBinary`(_uuid BINARY(36)) RETURNS binary(16) + DETERMINISTIC + SQL SECURITY INVOKER +RETURN + UNHEX(CONCAT( + SUBSTR(_uuid, 15, 4), + SUBSTR(_uuid, 10, 4), + SUBSTR(_uuid, 1, 8), + SUBSTR(_uuid, 20, 4), + SUBSTR(_uuid, 25) )) +#NB: +; +#end +#begin +-- From MariaDB 10.4.3, the JSON_VALID function is automatically used as a CHECK constraint for the JSON data type alias in order to ensure that a valid json document is inserted. +-- src: https://mariadb.com/kb/en/json_valid/ +#NB: CREATE TABLE `global_priv` ( +# `Host` CHAR(60) COLLATE utf8_bin NOT NULL DEFAULT '', +# `User` CHAR(80) COLLATE utf8_bin NOT NULL DEFAULT '', +# `Privilege` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '{}' CHECK (json_valid(`Privilege`)), +# PRIMARY KEY (`Host`,`User`) +#) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 COMMENT='Users and global privileges'; +#end +#begin +-- https://dev.mysql.com/doc/refman/8.0/en/json-validation-functions.html#json-validation-functions-constraints +CREATE TABLE geo ( + coordinate JSON, + CHECK( + JSON_SCHEMA_VALID( + '{ + "type":"object", + "properties":{ + "latitude":{"type":"number", "minimum":-90, "maximum":90}, + "longitude":{"type":"number", "minimum":-180, "maximum":180} + }, + "required": ["latitude", "longitude"] + }', + coordinate + ) + ) +); +#end +#begin +CREATE TABLE `tab1` ( + f4 FLOAT4, + f8 FLOAT8, + i1 INT1, + i2 INT2, + i3 INT3, + i4 INT4, + i8 INT8, + lvb LONG VARBINARY, + lvc LONG VARCHAR, + lvcfull LONG BINARY CHARSET utf8 COLLATE utf8_bin, + l LONG, + mi MIDDLEINT +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +#end +-- Comments +-- SELECT V_PAYABLE_AMT, DIS_ADJUST_TOTAL_PAYABLE; +-- SELECT V_PAYABLE_AMT, DIS_ADJUST_TOTAL_PAYABLE; +#begin +-- Create procedure +-- The default value for local variables in a DECLARE statement should be an expression +-- src: https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html +-- delimiter // +CREATE PROCEDURE procedure1() +BEGIN + DECLARE var1 INT unsigned default 1; + DECLARE var2 TIMESTAMP default CURRENT_TIMESTAMP; + DECLARE var3 INT unsigned default 2 + var1; +END -- //-- delimiter ; +#NB: +; +#end +#begin +-- delimiter // +CREATE PROCEDURE doiterate(p1 INT) +-- label which can be parsed as a beginning of IPv6 address +aaa:BEGIN + label1:LOOP + SET p1 = p1 + 1; + IF p1 < 10 THEN ITERATE label1; END IF; + LEAVE label1; + END LOOP label1; +END -- //-- delimiter ; +#NB: +; + +#end +#begin +CREATE DEFINER=`system_user`@`%` PROCEDURE `update_order`(IN orderID bigint(11)) +BEGIN insert into order_config(order_id, attribute, value, performer) + SELECT orderID, 'first_attr', 'true', 'AppConfig' + WHERE NOT EXISTS (select 1 from inventory.order_config t1 where t1.order_id = orderID and t1.attribute = 'first_attr') OR + EXISTS (select 1 from inventory.order_config p2 where p2.order_id = orderID and p2.attribute = 'first_attr' and p2.performer = 'AppConfig') + ON DUPLICATE KEY UPDATE value = 'true', + performer = 'AppConfig'; -- Enable second_attr for order +END +#NB: +; +#end +#begin +CREATE DEFINER=`bettingservice`@`stage-us-nj-app%` PROCEDURE `AggregatePlayerFactDaily`() +BEGIN + DECLARE CID_min BIGINT; + DECLARE CID_max BIGINT; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION +BEGIN + SHOW ERRORS; +ROLLBACK; +END; + +SELECT LastID+1 INTO CID_min FROM AggregateStatus +WHERE TableName = 'Combination_Transaction_Player_Fact'; +SELECT Id INTO CID_max FROM Combination_Transaction ORDER BY Id DESC LIMIT 1; + +START TRANSACTION; +UPDATE AggregateStatus SET LastId = CID_max, LastUpdated = CURRENT_TIMESTAMP +WHERE TableName = 'Combination_Transaction_Player_Fact'; + +INSERT INTO Combination_Transaction_Player_Fact +SELECT + NULL `Id`, + CT.Player_UID, + CT.Tx_Type `Type`, + DATE(BT.Timestamp) `Date`, + SUM(CT.Real_Amount) `Real_Amount`, + SUM(CT.Bonus_Amount) `Bonus_Amount`, + BT.Currency_UID, + COUNT(CT.Id) Tx_Count, + SUM(IF(CT.Real_Amount>0,1,0)) `Real_Count`, + SUM(IF(CT.Bonus_Amount>0,1,0)) `Bonus_Count` +FROM Combination_Transaction CT + LEFT JOIN Betting_Transaction BT ON CT.Betting_Tx_ID = BT.ID +WHERE CT.Id BETWEEN CID_min + AND CID_max +GROUP BY CT.Player_UID, CT.Tx_Type, DATE(BT.Timestamp) +ON DUPLICATE KEY UPDATE + Currency_UID = VALUES(Currency_UID), + Tx_Count = Tx_Count + VALUES(Tx_Count), + Real_Amount = Real_Amount + VALUES(Real_Amount), + Bonus_Amount = Bonus_Amount + VALUES(Bonus_Amount), + Real_Count = Real_Count + VALUES(Real_Count), + Bonus_Count = Bonus_Count + VALUES(Bonus_Count); +COMMIT; +END +#NB: +; +#end +-- Create procedure +-- delimiter // +CREATE PROCEDURE makesignal(p1 INT) +BEGIN + DECLARE error_text VARCHAR(255); + IF (error_text != 'OK') THEN + SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_text; + END IF; +END -- //-- delimiter ; +#NB: +; +#end +#begin +-- delimiter // +CREATE PROCEDURE set_unique_check() +BEGIN + SET unique_checks=on; +END; -- //-- delimiter ; +#end +#begin +#NB: CREATE DEFINER=`prod_migrations`@`%` PROCEDURE `upsert_virtual_item`(IN name VARCHAR(45), IN type TINYINT UNSIGNED) +#BEGIN +# SET @merchantId := (SELECT merchant_id FROM merchant LIMIT 1); +# IF @merchantId > 0 THEN +# SET @rows := (SELECT COUNT(*) FROM item WHERE item_type = type); +# IF @rows > 0 THEN +#UPDATE item SET +# merchant_id = @merchantId, +# cz_title = name, +# price = 0, +# orderer = 2, +# takeaway = 0, +# currency_id = ( +# SELECT currency_currency_id +# FROM merchant +# WHERE merchant_id = @merchantId +# ), +# tax_vat_id = ( +# SELECT tax_vat.tax_vat_id +# FROM tax_vat +# JOIN merchant +# ON merchant.place_country_id = tax_vat.country_id +# AND merchant.merchant_id = @merchantId +# WHERE tax_vat.default = 1 +# ), +# item_measure_id = 1, +# kitchen_print = 0, +# deleted = 0, +# virtual = 1 +#WHERE item_type = type; +#ELSE +# INSERT INTO item SET +# merchant_id = @merchantId, +# cz_title = name, +# price = 0, +# orderer = 2, +# takeaway = 0, +# currency_id = ( +# SELECT currency_currency_id +# FROM merchant +# WHERE merchant_id = @merchantId +# ), +# tax_vat_id = ( +# SELECT tax_vat.tax_vat_id +# FROM tax_vat +# JOIN merchant +# ON merchant.place_country_id = tax_vat.country_id +# AND merchant.merchant_id = @merchantId +# WHERE tax_vat.default = 1 +# ), +# item_measure_id = 1, +# kitchen_print = 0, +# deleted = 0, +# virtual = 1, +# item_type = type +# ; +#END IF; +#END IF; +#END +#end +#begin +-- delimiter // +CREATE DEFINER=`reportwriter`@`%` PROCEDURE `sp_ds_DAL_TX_Impoundment`(IN pDateFrom datetime, IN pDateTo datetime) +BEGIN + + SET @goliveDate = '2023-05-02 02:00:00'; + set @pRegion = 'DAL-TX'; +-- set @pDateFrom = '2023-02-01 00:00:00'; +-- set @pDateTo = '2023-03-10 00:00:00'; + set @pDateFrom = pDateFrom; + set @pDateTo = pDateTo; + + set @contractAmount = 21.03; + +with +Temp1 as +( + select l.code as lotCode + , fi.Id AS FeeItemID + , fi.unitBillingPrice as billingPrice + , eq.equipmentClass + , a.customerCode + , v.impoundStatus + , tc.companyCode AS impoundCompany + , b.companyCode AS towOperator + , v.id AS vehicleId + , re.reasoncode + , v.towReferenceNumber + + , fn_CalculateTimeZoneOffset(regionCode, v.clearedDate, 'DISPLAY') AS towDate + , fn_CalculateTimeZoneOffset(regionCode, v.releaseDate, 'DISPLAY') AS releaseDate + , fn_CalculateTimeZoneOffset(regionCode, fi.createdDate, 'DISPLAY') AS feeDate + + , f.code + , fi.totalBillingPricePretax + + from ims_vehicle v + join ref_region r + on v.regionId = r.regionId + + INNER JOIN ims_fee_event fe ON v.id = fe.vehicleId + INNER JOIN ims_fee_item fi ON fe.id = fi.feeEventId + INNER JOIN ims_fee f ON fi.feeId = f.id + INNER JOIN ims_fee_category fc ON f.feeCategoryEnumCode = fc.enumcode + + INNER JOIN ref_customer a ON v.accountId = a.customerId + INNER JOIN ref_reason re ON v.reasonId = re.reasonId + INNER JOIN ref_tow_company tc ON v.currentImpoundOperatorId = tc.towCompanyId + + JOIN ref_tow_company b ON v.towOperatorId = b.towCompanyId + left join ref_lot l on v.currentLotId = l.id + join ref_equipment eq + on v.equipmentId = eq.id + + where r.regionCode = @pRegion + and v.releaseDate >= @pDateFrom + and v.releaseDate < @pDateTo + and v.clearedDate >= @goliveDate + and b.companyCode != 'ART-DAL-TX' + and v.impoundStatus = 'RELEASED' +) + + select lotCode + , Temp1.vehicleId as "Vehicle ID" + , towReferenceNumber as "Tow Reference Number" + , equipmentClass as "Class" + , impoundStatus as "Status" + , customerCode as "Customer" + , impoundCompany as "Impound Company" + , towOperator as "Tow Operator" + , towDate as "Tow Date" + , releaseDate as "Release Date" + , billingPrice as "Auto Pound Authorized Fee" + + , billingPrice - @contractAmount as "rev threshold" + +-- ,DATEDIFF(s.timeTo, s.timeFrom) as "Storage Days" + , null as "Storage Days" + , null as timeFrom + , null as timeTo + , billingPrice as "Authorized Impoundment Fee" + + , (billingPrice - @contractAmount)/2 + @contractAmount as "rev share amount" + from Temp1 + + where code in ('ImpoundmentFee') + and lotCode like '%PEAKA%'; + +END; -- //-- delimiter ; +#end +#begin +-- Create Role +create role 'RL_COMPLIANCE_NSA'; +create role if not exists 'RL_COMPLIANCE_NSA'; +CREATE ROLE 'admin', 'developer'; +CREATE ROLE 'webapp'@'localhost'; +#end +#begin +CREATE VIEW view_with_cte1 AS +WITH cte1 AS +( + SELECT column_1 AS a, column_2 AS b + FROM table1 +) +SELECT a, b FROM cte1; +#end +#begin +CREATE VIEW view_with_cte2 AS +WITH cte1 (col1, col2) AS +( + SELECT 1, 2 + UNION ALL + SELECT 3, 4 +), +cte2 (col1, col2) AS +( + SELECT 5, 6 + UNION ALL + SELECT 7, 8 +) +SELECT col1, col2 FROM cte; +#end +#begin +CREATE VIEW view_with_cte3 AS +WITH cte (col1, col2) AS +( + SELECT 1, 2 + UNION ALL + SELECT 3, 4 +) +SELECT col1, col2 FROM cte; +#end +#begin +CREATE VIEW view_with_cte4 AS +WITH RECURSIVE cte (n) AS +( + SELECT 1 + UNION ALL + SELECT n + 1 FROM cte WHERE n < 5 +) +SELECT * FROM cte; +#end + +#begin +lock tables t1 read; +#NB: lock table t1 read local wait 100; +#end + +#begin +#NB: CREATE OR REPLACE VIEW view_name AS +#WITH my_values(val1, val2) AS ( +# VALUES (1, 'One'), +# (2, 'Two') +#) +#SELECT v.val1, v.val2 FROM my_values v; +#end + +#begin +CREATE DEFINER=`gpuser`@`%` PROCEDURE `test_parse_array` (IN val INT) +BEGIN +DECLARE array VARCHAR(50); + +SELECT 1; + +END +#NB: +; +#end + +#begin +CREATE DEFINER=`peuser`@`%` PROCEDURE `test_utf`() +BEGIN + SET @Ν_greece := 1, @N_latin := 'test'; +SELECT + @Ν_greece + ,@N_latin; +END +#NB: +; +#end + +#begin +CREATE PROCEDURE test_union() +BEGIN + (SELECT id FROM test_auto_inc) + UNION ALL + SELECT id FROM test_auto_inc; +END +#NB: +; +#end + +#begin +CREATE PROCEDURE test_union() +BEGIN + (SELECT id FROM test_auto_inc) + UNION ALL + SELECT id FROM test_auto_inc + UNION ALL + SELECT id FROM test_auto_inc ORDER BY id; +END +#NB: +; +#end + +#begin +CREATE PROCEDURE test_union() +BEGIN + (SELECT id FROM test_auto_inc) + UNION ALL + (SELECT id FROM test_auto_inc) + UNION ALL + SELECT id FROM test_auto_inc ORDER BY id; +END +#NB: +; +#end + +#begin +CREATE DEFINER=`PEUSER`@`%` PROCEDURE `SANDBOX`.`TEST_UNION`( ) +BEGIN +SELECT ID ,SUM(COL_1) AS SUM_COL_1 +FROM ( + (SELECT ID ,COL_1 FROM TEST_AUTO_INC + UNION ALL + SELECT ID ,COL_1 FROM TEST_AUTO_INC TAI) + UNION ALL + (SELECT ID ,COL_1 FROM TEST_AUTO_INC TAI) +)SS +GROUP BY 1 +ORDER BY 1 +; +END +#NB: +; +#end +#begin +-- Create trigger 7 +-- delimiter // +CREATE TRIGGER IF NOT EXISTS `my_trigger` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN SET NEW.my_col = CONCAT(NEW.mycol, NEW.id); END; -- //-- delimiter ; +#end diff --git a/sql/mysql/Oracle/examples/ddl_drop.sql b/sql/mysql/Oracle/examples/ddl_drop.sql new file mode 100644 index 0000000000..de54a85871 --- /dev/null +++ b/sql/mysql/Oracle/examples/ddl_drop.sql @@ -0,0 +1,76 @@ +#begin +-- Drop table +drop temporary table if exists temp_t1; +drop temporary table `some_temp_table`; +-- drop table if exists `one_more 1343 *&&^ table`; +drop table antlr_all_tokens, antlr_function_tokens, antlr_keyword_tokens, antlr_tokens, childtable, guns, log_table, new_t, parenttable, ship_class, ships, ships_guns, t1, t2, t3, t4, tab1; +#NB drop table if exists order; +drop index index1 on t1; +drop table tbl_name; +#end +#begin +-- Drop database +drop database somedb; +drop schema if exists myschema; +drop database if exists `select`; +drop schema `current_date`; +drop schema if exists `super`; +#end +#begin +-- Drop event +drop event if exists testevent1; +drop event if exists testevent2; +drop event someevent; +#end +#begin +-- Drop index +drop index index1 on t1 algorithm=default; +drop index index2 on t2 algorithm=default lock none; +drop index index3 on antlr_tokens algorithm default lock=none; +drop index index4 on antlr_tokens lock default; +drop index index5 on antlr_tokens algorithm default; +drop index index6 on antlr_tokens algorithm default lock default; +drop index index7 on antlr_tokens lock default algorithm default; +#end +#begin +-- Drop logfile group +-- http://dev.mysql.com/doc/refman/5.6/en/create-logfile-group.html +DROP LOGFILE GROUP lg1 ENGINE = NDB; +#end +#begin +-- Drop server +drop server if exists s; +drop server some_server_name_enough_character_length; +#end +#begin +-- Drop tablespace +drop tablespace tblsp1 engine = NDB; +drop tablespace tblsp2 engine = InnoDB; +#end +#begin +-- Drop trigger +drop trigger if exists test.trg_my1; +drop trigger trg_my2; +#end +#begin +-- Drop view +drop view if exists my_view1, my_view2, my_view3, my_view4; +drop view some_view restrict; +drop view if exists `view`, one_more_view, 1view cascade; +#end +#begin +-- Drop procedure +drop procedure if exists some_proc; +drop procedure some_proc; +#end +#begin +-- Drop function +drop function if exists foo; +drop function bar; + +#end +#begin +-- Drop Role +DROP ROLE 'admin', 'developer'; +DROP ROLE 'webapp'@'localhost'; +#end diff --git a/sql/mysql/Oracle/examples/ddl_flush.sql b/sql/mysql/Oracle/examples/ddl_flush.sql new file mode 100644 index 0000000000..15e72ba36a --- /dev/null +++ b/sql/mysql/Oracle/examples/ddl_flush.sql @@ -0,0 +1,18 @@ +#begin +flush hosts, status; +#end +#begin +-- Table flushing +flush tables; +flush local tables Foo; +flush tables Foo, Bar; +flush tables Foo, Bar for export; +flush tables Foo, Bar with read lock; +#end +#begin +-- 'FLUSH TABLE' is an alias for 'FLUSH TABLES' (https://dev.mysql.com/doc/refman/8.0/en/flush.html) +flush table; +flush local table Foo; +flush TABLE Foo, Bar; +flush table Foo, Bar for export; +#end diff --git a/sql/mysql/Oracle/examples/dml_delete.sql b/sql/mysql/Oracle/examples/dml_delete.sql new file mode 100644 index 0000000000..80d0a31a75 --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_delete.sql @@ -0,0 +1,22 @@ +#begin +-- delete one-table syntax +delete from t1 where col1 = true and (col2 - col3 <= (select count(*) from t2) or maincol/2 > 100.2); +delete low_priority from mytable where value_col > 0 order by sort_col desc limit 10; +delete quick ignore from test.parenttable where id*2 + somecol < 10; +#end +#begin +-- delete multiple-table syntax +delete ignore t1.*, alias_t2 from t1 inner join t3 on t1.col1 = t3.somecol and t1.col2 > t3.col_for_compare left join t2 as alias_t2 on t1.col1 <= alias_t2.col1 and alias_t2.col_onecol + t3.col_for_compare <> t1.sum_col +where alias_t2.not_null_col is not null and t1.primary_key_column >= 100; +-- http://dev.mysql.com/doc/refman/5.6/en/delete.html +DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id; +DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id; +DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL; +DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id; +DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2 WHERE a1.id=a2.id; +#end +#begin +-- delete with table alias +DELETE FROM t1 alias_t1 WHERE alias_t1.col1 > 0; +DELETE FROM t1 as alias_t1 WHERE alias_t1.col1 > 0; +#end diff --git a/sql/mysql/Oracle/examples/dml_insert.sql b/sql/mysql/Oracle/examples/dml_insert.sql new file mode 100644 index 0000000000..5cd9c77456 --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_insert.sql @@ -0,0 +1,57 @@ +#begin +-- insert on select +insert into t1 select * from t2; +insert into some_ship_info +select ship_power.gun_power, ship_info.* +FROM + ( + select s.name as ship_name, sum(g.power) as gun_power, max(callibr) as max_callibr + from + ships s inner join ships_guns sg on s.id = sg.ship_id inner join guns g on g.id = sg.guns_id + group by s.name + ) ship_power + inner join + ( + select s.name as ship_name, sc.class_name, sc.tonange, sc.max_length, sc.start_build, sc.max_guns_size + from + ships s inner join ship_class sc on s.class_id = sc.id + ) ship_info using (ship_name); + +INSERT INTO l4stal13prema00.`fusion` ( `partition en` , `classe` , `segment` , `F tot` , `F loc` , `indice specif` ) +SELECT * FROM f3p1 WHERE 1; +#end +#begin +-- insert base syntax +insert ignore into t1(col1, col2, col3) values ('abc', 0, .12), ('adfasdf',23432, -.12); +INSERT INTO test_auto_inc () VALUES (); +-- http://dev.mysql.com/doc/refman/5.6/en/insert.html +INSERT INTO tbl_name (col1,col2) VALUES(col2*2, 15); +INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2); +INSERT INTO logs (`site_id`, `time`,`hits`) VALUES (1,"2004-08-09", 15) ON DUPLICATE KEY UPDATE hits=hits+15; +INSERT INTO t2 (b, c) + VALUES ((SELECT a FROM t1 WHERE b='Chip'), 'shoulder'), + ((SELECT a FROM t1 WHERE b='Chip'), 'old block'), + ((SELECT a FROM t1 WHERE b='John'), 'toilet'), + ((SELECT a FROM t1 WHERE b='John'), 'long,silver'), + ((SELECT a FROM t1 WHERE b='John'), 'li''l'); +INSERT INTO tbl_test (FirstName) +SELECT 'Aleem' UNION ALL SELECT 'Latif' UNION ALL SELECT 'Mughal'; + +#end +#begin +-- not latin1 literals +insert into t values ('кириллица', 2, 3); +insert INTO `wptests_posts` (`post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_content_filtered`, `post_title`, `post_excerpt`, `post_status`, `post_type`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_parent`, `menu_order`, `post_mime_type`, `guid`) VALUES (7, '2016-09-06 16:49:51', '2016-09-06 16:49:51', '', '', 'صورة', '', 'inherit', 'attachment', 'open', 'closed', '', '%d8%b5%d9%88%d8%b1%d8%a9', '', '', '2016-09-06 16:49:51', '2016-09-06 16:49:51', 0, 0, 'image/jpeg', ''); +#end +insert into sql_log values(retGUID,log_type,log_text,0,0,current_user,now()); +insert into sql_log values(retGUID,log_type,log_text,0,0,current_user(),now()); +#begin +#NB CREATE TABLE tbl (tbl.a BIGINT); +#NB CREATE TABLE tbl (.a BIGINT); +INSERT INTO tbl (tbl.a) SELECT * FROM another_table; +#NB INSERT INTO tbl (.tbl.a) SELECT * FROM another_table; +#end + +#begin +INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b; +#end diff --git a/sql/mysql/Oracle/examples/dml_replace.sql b/sql/mysql/Oracle/examples/dml_replace.sql new file mode 100644 index 0000000000..55c39c5924 --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_replace.sql @@ -0,0 +1,13 @@ +#begin +replace into t1 values (default, 1, '2', abs(-10 * col1) + sqrt(col2/col3)); +replace table1(col1, col2, col3) value (1, 2, 3), (4, 5, 6), (7, 8, 9); +replace into t2(str1, str2) values (null, 'abc'), ('some' ' string' ' to replace', @someval); +replace into new_t select * from old_t; +#end +#begin +-- http://dev.mysql.com/doc/refman/5.6/en/replace.html +REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00'); +REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42'); +REPLACE INTO T SELECT * FROM T; +REPLACE LOW_PRIORITY INTO `online_users` SET `session_id`='3580cc4e61117c0785372c426eddd11c', `user_id` = 'XXX', `page` = '/', `lastview` = NOW(); +#end diff --git a/sql/mysql/Oracle/examples/dml_select.sql b/sql/mysql/Oracle/examples/dml_select.sql new file mode 100644 index 0000000000..8699a79e7c --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_select.sql @@ -0,0 +1,257 @@ +#begin +-- common conustructions tests +-- -- Literals +-- -- -- String literal +SELECT 'hello world'; +select N'testing conflict on N - spec symbol and N - as identifier' as n; +select n'abc' as tstConstrN; +#NB select N'abc' "bcd" 'asdfasdf' as tstConstNAndConcat; +#NB select 'afdf' "erwhg" "ads" 'dgs' "rter" as tstDiffQuoteConcat; +select 'some string' COLLATE latin1_danish_ci as tstCollate; +#NB select _latin1'some string' COLLATE latin1_danish_ci as tstCollate; +select '\'' as c1, '\"' as c2, '\b' as c3, '\n' as c4, '\r' as c5, '\t' as c6, '\Z' as c7, '\\' as c8, '\%' as c9, '\_' as c10; +select * from t1 for update; +select * from t1 lock in share mode; +#end +#begin +-- -- -- String literal spec symbols +-- bug: two symbols ' afer each other: '' +select '\'Quoted string\'' col1, 'backslash \\ ' ', two double quote "" ' ', two single quote ''' as col2; +select '\'Quoted string\' ' col1, 'backslash \\ ' ', two double quote "" ' ', two single quote ''' as col2; +select * from `select` where `varchar` = 'abc \' ' and `varchar2` = '\'bca'; +#end +#begin +-- -- -- Number literal +SELECT 1; +#NB select 1.e-3 as 123e; +select del1.e123 as c from del1; +select -1, 3e-2, 2.34E0; +SELECT -4.1234e-2, 0.2e-3 as c; +SELECT .1e10; +SELECT -.1e10; +select 15e3, .2e5 as col1; +select .2e3 c1, .2e-4 as c5; +#end +#begin +-- -- -- Number float collision test +select t1e2 as e1 from t; +#NB select 1e2t as col from t; +#end +#begin +-- -- -- Hexadecimal literal +select X'4D7953514C'; +select x'4D7953514C'; +select 0x636174; +select 0x636174 c1; +select x'4D7953514C' c1, 0x636174 c2; +select x'79' as `select`, 0x2930 cc, 0x313233 as c2; + +#end +#begin +-- -- -- Null literal +SELECT null; +SELECT not null; +select \N; +select ((\N)); +select not ((\N)); +#end +#begin +-- -- -- mixed literals +select \N as c1, null as c2, N'string'; +select 4e15 colum, 'hello, ' 'world', X'53514C'; +select 'abc' ' bcd' ' \' \' ' as col, \N c2, -.1e-3; +#end + +#begin +-- -- Variables +SELECT @myvar; +#NB select * from t1 limit @varcount; +#NB select * from t1 limit @varoffset, @varcount; +#NB select * from t1 limit @varcount offset @varoffset; +#end + +#begin +-- select_column tests +select * from `select`; +select *, `select`.*, `select`.* from `select`; +select *, 'abc' from `select`; +select *, 1, \N, N'string' 'string2' from `select`; +#end + +#begin +-- UNION tests +select 1 union select 2 limit 0,5; +select * from (select 1 union select 2 union select 0) as t order by 1 limit 0,10; +select col1 from t1 union select * from (select 1 as col2) as newt; +select col1 from t1 union (select * from (select 1 as col2) as newt); +select 1 as c1 union (((select 2))); +#end +#begin +-- -- -- subquery in UNION +select 1 union select * from (select 2 union select 3) as table1; +select 1 union (select * from (select 2 union select 3) as table1); +#end +#begin +-- subquery FROM +select * from (((((((select col1 from t1) as ttt)))))); +select ship_power.gun_power, ship_info.* +FROM + ( + select s.name as ship_name, sum(g.power) as gun_power, max(callibr) as max_callibr + from + ships s inner join ships_guns sg on s.id = sg.ship_id inner join guns g on g.id = sg.guns_id + group by s.name + ) ship_power + inner join + ( + select s.name as ship_name, sc.class_name, sc.tonange, sc.max_length, sc.start_build, sc.max_guns_size + from + ships s inner join ship_class sc on s.class_id = sc.id + ) ship_info using (ship_name) +order by ship_power.ship_name; +#end +#begin +-- JOIN +-- -- -- join condition +select * from t1 inner join (t1 as tt1, t2 as tt2) on t1.col1 = tt1.col1; +select * from (t1 as tt1, t2 as tt2) inner join t1 on t1.col1 = tt1.col1; +select * from t1 as tt1, t2 as tt2 inner join t1 on true; +SELECT * FROM test_table_1 t1 LEFT JOIN test_table_2 t2 JOIN test_table_3 t3 ON t3.id=t2.id ON t1.id=t2.id; +SELECT * FROM TABLE1 T1 STRAIGHT_JOIN TABLE2 T2 STRAIGHT_JOIN TABLE3 T3 ON T3.ID=T2.ID ON T1.ID=T2.ID; +#end +#begin +-- where_condition test +select col1 from t1 inner join t2 on (t1.col1 = t2.col2); +select table_name from information_schema.TABLES where table_schema = DATABASE(); +#end +#begin +-- identifiers tests +select 1 as 123e; +#end +#begin +-- not latin1 literals +select CONVERT( LEFT( CONVERT( '自動下書き' USING binary ), 100 ) USING utf8 ) AS x_0; +select CONVERT( LEFT( CONVERT( '自動' USING binary ), 6 ) USING utf8 ) AS x_0; +#NB select t.*, tt.* FROM wptests_terms AS t INNER JOIN wptests_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('category') AND t.name IN ('远征手记') ORDER BY t.name ASC; +#end +#begin +-- cast as integer +#NB SELECT CAST('1' AS INT); +#NB SELECT CAST('1' AS INTEGER); +SELECT CAST('1' AS SIGNED INTEGER); +SELECT CAST('1' AS UNSIGNED INTEGER); +SELECT CAST('1' AS SIGNED INT); +SELECT CAST('1' AS UNSIGNED INT); +-- cast as decimal +SELECT CAST('1' AS DECIMAL); +SELECT CAST('1' AS DEC); +#end +#begin +-- JSON functions +SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()); +SELECT JSON_OBJECT('id', 87, 'name', 'carrot'); +SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"'); +SELECT JSON_CONTAINS(@j, @j2, '$.a'); +SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e'); +SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]'); +SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}'); +SELECT JSON_OVERLAPS("[1,3,5,7]", "[2,5,7]"); +SELECT JSON_SEARCH(@j, 'one', 'abc'); +SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1); +SELECT JSON_ARRAY_INSERT(@j, '$[1]', 'x'); +SELECT JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]'); +SELECT JSON_MERGE('[1, 2]', '[true, false]'); +SELECT JSON_MERGE_PATCH('[1, 2]', '[true, false]'); +SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]'); +SELECT JSON_REMOVE(@j, '$[1]'); +SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]'); +SELECT JSON_SET(@j, '$.a', 10, '$.c', '[true, false]'); +SELECT @j, JSON_UNQUOTE(@j); +SELECT JSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true'); +SELECT JSON_LENGTH('[1, 2, {"a": 3}]'); +SELECT JSON_TYPE(@j); +SELECT JSON_VALID('{"a": 1}'); +SELECT JSON_SCHEMA_VALID(@schema, @document); +SELECT JSON_SCHEMA_VALIDATION_REPORT(@schema, @document); +SELECT JSON_PRETTY('123'); +SELECT JSON_STORAGE_FREE(jcol), JSON_STORAGE_FREE(jcol) FROM jtable; +SELECT o_id, JSON_ARRAYAGG(attribute) AS attributes FROM t3 GROUP BY o_id; +SELECT o_id, JSON_OBJECTAGG(attribute, value) FROM t3 GROUP BY o_id; +#end +#begin +-- VECTOR +SELECT DISTANCE(b1, b2, "COSINE"), STRING_TO_VECTOR('[]'), VECTOR_DIM(b1), VECTOR_TO_STRING(b1) FROM a; +#end +#NB SELECT trigger.num FROM test `trigger`; +-- Valid when SELECT is in stored procedure +SELECT * FROM test LIMIT LIMIT1,LIMIT2; +-- SCHEMA as a function name +SELECT SCHEMA(); +-- Functions +SELECT REPEAT('X',2); +SELECT mod(3,2);SELECT * FROM TEST WHERE TB_SCHEMA = SCHEMA(); +-- Group By with computed column +SELECT 1 AS col1, t1.Id FROM t1 GROUP BY col1; +-- Non Aggregate Functions +SELECT pk, LEAD(pk) OVER (ORDER BY pk) AS l; +SELECT COALESCE(LAG(last_eq.end_variation) OVER (PARTITION BY eq.account_id, eq.execution_name_id, eq.currency ORDER BY eq.start_date), 0) AS start_variation FROM t1; +-- Window Functions +SELECT + e.id, + SUM(e.bin_volume) AS bin_volume, + SUM(e.bin_volume) OVER(PARTITION BY id, e.bin_volume ORDER BY id) AS bin_volume_o, + COALESCE(bin_volume, 0) AS bin_volume2, + COALESCE(LAG(e.bin_volume) OVER(PARTITION BY id ORDER BY e.id), 0) AS bin_volume3, + FIRST_VALUE(id) OVER() AS fv, + DENSE_RANK() OVER(PARTITION BY bin_name ORDER BY id) AS drk, + RANK() OVER(PARTITION BY bin_name) AS rk, + ROW_NUMBER ( ) OVER(PARTITION BY bin_name) AS rn, + NTILE(2) OVER() AS nt +FROM table1 e; +SELECT + id, + SUM(bin_volume) OVER w AS bin_volume_o, + LAG(bin_volume) OVER w AS bin_volume_l, + LAG(bin_volume, 2) OVER w AS bin_volume_l2, + FIRST_VALUE(id) OVER w2 AS fv, + GROUP_CONCAT(bin_volume order by id) AS `rank` +FROM table2 + WINDOW w AS (PARTITION BY id, bin_volume ORDER BY id ROWS UNBOUNDED PRECEDING), + w2 AS (PARTITION BY id, bin_volume ORDER BY id DESC ROWS 10 PRECEDING); +-- Index hints: https://dev.mysql.com/doc/refman/5.7/en/index-hints.html +SELECT * FROM table1 USE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3; +SELECT * FROM table1 FORCE INDEX (col1_index,col2_index) WHERE col1=1 AND col2=2 AND col3=3; +SELECT * FROM t1 USE INDEX (PRIMARY) ORDER BY a; +SELECT * FROM t1 FORCE INDEX (PRIMARY) ORDER BY a; + +-- JSON_TABLE +-- https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html +#NB SELECT * +# FROM +# JSON_TABLE ( +# '[{"a":"3"},{"a":2},{"b":1},{"a":0},{"a":[1,2]}]', +# "$[*]" +# COLUMNS ( +# rowid FOR ORDINALITY, +# ac VARCHAR(100) PATH "$.a" DEFAULT '111' ON EMPTY DEFAULT '999' ON ERROR, +# aj JSON PATH "$.a" DEFAULT '{"x": 333}' ON EMPTY, +# bx INT EXISTS PATH "$.b", +# NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$') +# ) +# ) AS tt; +SELECT !(1 + @sum:=1) AS ss; +SELECT (@sum:=1 + 1) AS ss; +SELECT 1 + @sum:=1 AS ss; +SELECT 100 >> @sum:=1 AS ss; +SELECT @sum:=1 < 100 AS ss; +SELECT 100 and @sum:=1 AS ss; +SELECT + @sum := @sum + column_name AS running_sum +FROM + your_table, + (SELECT @sum := 0) AS init +ORDER BY + some_order_column; + +-- - statement is supported as the field name #NB space +SELECT REPLACE(statement, ' ','') as statement from your_table; diff --git a/sql/mysql/Oracle/examples/dml_table.sql b/sql/mysql/Oracle/examples/dml_table.sql new file mode 100644 index 0000000000..9e931dd23a --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_table.sql @@ -0,0 +1,15 @@ +###https://dev.mysql.com/doc/refman/8.0/en/table.html +#begin +TABLE t; +#end + +#begin +TABLE t LIMIT 3; +#end + +#begin +TABLE t ORDER BY b LIMIT 3; +#end + + + diff --git a/sql/mysql/Oracle/examples/dml_test_arithmetic_expression.sql b/sql/mysql/Oracle/examples/dml_test_arithmetic_expression.sql new file mode 100644 index 0000000000..e922cf6098 --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_test_arithmetic_expression.sql @@ -0,0 +1 @@ +select 5--1; \ No newline at end of file diff --git a/sql/mysql/Oracle/examples/dml_union.sql b/sql/mysql/Oracle/examples/dml_union.sql new file mode 100644 index 0000000000..1c876f7909 --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_union.sql @@ -0,0 +1,56 @@ +#begin +select 1 union select 2; +#end + +#begin +select 1 as a1, 10 as a2 union all select 2, 20 union distinct select 3, 30 union distinct select 2, 20 union all select 3, 30; + +#end + +#begin +(select 1 as a1, 10 as a2) union all (select 2, 20); +#end + +#begin +(select 1 as a1, 10 as a2) union all (select 2, 20) union distinct (select 3, 30); +#end + +#begin +select 1 as a1, 10 as a2 union all select 2, 20 union distinct (select 3, 30); +#end + +#begin +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct (select 3, 30); +#end + +#begin +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct select 3, 30; +#end + +#begin +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct (select 3, 30) union distinct select 2, 20 union all select 3, 30; +#end + +#begin +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct select 3, 30 union distinct select 2, 20 union all select 3, 30; +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct select 3, 30 union distinct (select 2, 20) union all select 3, 30; +#end + +#begin +((select 1 as a1, 10 as a2)) union all (((select 2, 20))) union distinct (select 3, 30); +#end + +#begin +((select 1 as a1, 10 as a2)) union all (((select 2, 20))) union distinct (select 3, 30 into outfile 'test.dump'); +#end + +#begin +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct (select 3, 30) union distinct select 2, 20 union all select 3, 30 into outfile 'test.dump'; +#end + +#begin +select 1 as a1, 10 as a2 union all (select 2, 20) union distinct select 3, 30 order by 1; +select 1 as a1, 10 as a2 union all (select 2, 20 order by 2) union distinct select 3, 30 order by 1; +select 1 as a1, 10 as a2 union all (select 2, 20 order by 2) union distinct (select 3, 30 order by 1); +select 1 as a1, 10 as a2 union all (select 2, 20 order by 2) union distinct (select 3, 30 order by 1) order by 2; +#end \ No newline at end of file diff --git a/sql/mysql/Oracle/examples/dml_update.sql b/sql/mysql/Oracle/examples/dml_update.sql new file mode 100644 index 0000000000..905aed74ea --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_update.sql @@ -0,0 +1,23 @@ +#begin +-- update one-table syntax +update t set col = 100 where id = 101; +update ignore t1 set `column_name` = default, `one-more-column` = (to_seconds(now()) mod 33); +#end +#begin +-- update multiple-table syntax +update t1, t2, t3 inner join t4 using (col_name1, col_name2) +set t1.value_col = t3.new_value_col, t4.`some-col*` = `t2`.`***` * 2 +where t1.pk = t2.fk_t1_pk and t2.id = t4.fk_id_entity; +#end +#begin +-- http://dev.mysql.com/doc/refman/5.6/en/update.html +UPDATE t1 SET col1 = col1 + 1; +UPDATE t1 SET col1 = col1 + 1, col2 = col1; +UPDATE t SET id = id + 1 ORDER BY id DESC; +UPDATE items,month SET items.price=month.price WHERE items.id=month.id; +UPDATE `Table A`,`Table B` SET `Table A`.`text`=concat_ws('',`Table A`.`text`,`Table B`.`B-num`," from ",`Table B`.`date`,'/') +WHERE `Table A`.`A-num` = `Table B`.`A-num`; +UPDATE TABLE_1 LEFT JOIN TABLE_2 ON TABLE_1.COLUMN_1= TABLE_2.COLUMN_2 SET TABLE_1.`COLUMN` = EXPR WHERE TABLE_2.COLUMN2 IS NULL; +#NB UPDATE Groups LEFT JOIN (SELECT GroupId, MIN(ValWithinGroup) AS baseVal FROM Groups GROUP BY GroupId) AS GrpSum USING (GroupId) SET ValWithinGroup=ValWithinGroup-baseVal; +update Table1 t1 join Table2 t2 on t1.ID=t2.t1ID join Table3 t3 on t2.ID=t3.t2ID set t1.Value=12345 where t3.ID=54321; +#end diff --git a/sql/mysql/Oracle/examples/dml_with.sql b/sql/mysql/Oracle/examples/dml_with.sql new file mode 100644 index 0000000000..2957d27423 --- /dev/null +++ b/sql/mysql/Oracle/examples/dml_with.sql @@ -0,0 +1,42 @@ +#begin +-- Recursive CTE +WITH RECURSIVE cte (n) AS ( + SELECT 1 + UNION ALL + SELECT n + 1 FROM cte WHERE n < 10 +) +SELECT n FROM cte; + +WITH RECURSIVE cte AS ( + SELECT id, name, manager_id + FROM employees + WHERE id = 1 + UNION ALL + SELECT e.id, e.name, e.manager_id + FROM employees e + JOIN cte ON e.manager_id = cte.id +) +SELECT * FROM cte; + +WITH RECURSIVE cte AS ( + SELECT id, name, parent_id + FROM departments + WHERE id = 1 + UNION ALL + SELECT d.id, d.name, d.parent_id + FROM departments d + JOIN cte ON d.parent_id = cte.id +) +SELECT * FROM cte; +#end +#begin +-- Non-recursive Ctes #NB space required for some reason. +WITH cte1 AS ( + SELECT * FROM table1 WHERE col1 = 'value' +), +cte2 AS ( + SELECT * FROM table2 WHERE col2 = 'value' +) +SELECT cte1.col1, cte2.col2 FROM cte1 JOIN cte2 ON cte1.id = cte2.id; +#end + diff --git a/sql/mysql/Oracle/examples/expressions.sql b/sql/mysql/Oracle/examples/expressions.sql new file mode 100644 index 0000000000..9fba83a9a6 --- /dev/null +++ b/sql/mysql/Oracle/examples/expressions.sql @@ -0,0 +1,5 @@ +#begin +select 1+2*3-4; +select 1+9/3-2; +#NB: select 2+9%2-1; +#end \ No newline at end of file diff --git a/sql/mysql/Oracle/examples/ext_tests.sql b/sql/mysql/Oracle/examples/ext_tests.sql new file mode 100644 index 0000000000..6dc59e120a --- /dev/null +++ b/sql/mysql/Oracle/examples/ext_tests.sql @@ -0,0 +1,65 @@ +#begin +-- Intersections +-- -- Binary: charset and datatype +#NB: select _binary 'hello' as c1; +create table t1(col1 binary(20)); +create table t2(col varchar(10) binary character set cp1251); +create table t2(col varchar(10) binary character set binary); +#end +#begin +-- -- Keywords, which can be ID. Intersect that keywords and ID +#end +#begin +-- Expression test +select +-!1 as c; +select 0 in (20 = any (select col1 from t1)) is not null is not unknown as t; +select 0 in (20 = any (select col1 from t1)) is not unknown as t; +select 20 = any (select col1 from t1) is not unknown as t; +select 20 = any (select col1 from t1) as t; +-- select sqrt(20.5) not in (sqrt(20.5) not in (select col1 from t1), 1 in (1, 2, 3, 4)) as c; +select 20 in (10 in (5 in (1, 2, 3, 4, 5), 1, 1, 8), 8, 8, 8); +select (1 in (2, 3, 4)) in (0, 1, 2) as c; +select 1 and (5 between 1 and 10) as c; + +select 1 = 16/4 between 3 and 5 as c; +select 1 = 16/4 between 5 and 6 as c; +select 17 member of('[23, "abc", 17, "ab", 10]'); +#end +#begin +-- Functions test +#NB: select *, sqrt(a), lower(substring(str, 'a', length(str)/2)) as col3 from tab1 where a is not \N; +#end +#begin +-- Spatial data type tests +INSERT INTO geom VALUES (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F)); +select y(point(1.25, 3.47)) as y, x(point(1.25, 3.47)) as x; +#end +#begin +-- Signal tests +SIGNAL SQLSTATE '06660' SET MESSAGE_TEXT = 'Database is in read-only mode!'; +SIGNAL specialty SET MESSAGE_TEXT = 'An error occurred'; +SIGNAL SQLSTATE '01000' SET MESSAGE_TEXT = 'A warning occurred', MYSQL_ERRNO = 1000; +SIGNAL SQLSTATE '77777'; +SIGNAL divide_by_zero; +-- Diagnostics tests +RESIGNAL SQLSTATE '06660' SET MESSAGE_TEXT = 'Database is in read-only mode!'; +RESIGNAL specialty SET MESSAGE_TEXT = 'An error occurred'; +RESIGNAL SQLSTATE '01000' SET MESSAGE_TEXT = 'A warning occurred', MYSQL_ERRNO = 1000; +RESIGNAL SQLSTATE '77777'; +RESIGNAL divide_by_zero; +RESIGNAL SET MESSAGE_TEXT = 'Database is in read-only mode!'; +RESIGNAL SET MESSAGE_TEXT = 'An error occurred'; +RESIGNAL SET MESSAGE_TEXT = 'A warning occurred', MYSQL_ERRNO = 1000; +RESIGNAL; +GET DIAGNOSTICS @p1 = NUMBER, @p2 = ROW_COUNT; +GET DIAGNOSTICS CONDITION 1 @p1 = MYSQL_ERRNO; +GET DIAGNOSTICS CONDITION 1 @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT; +GET DIAGNOSTICS CONDITION 1 @p3 = RETURNED_SQLSTATE, @p4 = MESSAGE_TEXT; +GET DIAGNOSTICS CONDITION 1 @p5 = SCHEMA_NAME, @p6 = TABLE_NAME; +GET DIAGNOSTICS CONDITION 1 @errno = MYSQL_ERRNO; +GET DIAGNOSTICS @cno = NUMBER; +GET DIAGNOSTICS CONDITION @cno @errno = MYSQL_ERRNO; +GET CURRENT DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT; +GET STACKED DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO, msg = MESSAGE_TEXT; +GET CURRENT DIAGNOSTICS errcount = NUMBER; +#end diff --git a/sql/mysql/Oracle/examples/grant.sql b/sql/mysql/Oracle/examples/grant.sql new file mode 100644 index 0000000000..6c4f6a3fd3 --- /dev/null +++ b/sql/mysql/Oracle/examples/grant.sql @@ -0,0 +1,115 @@ +GRANT ALL ON *.* TO `foo2` @`%`; +GRANT ALL ON *.* TO `foo2` @test; +GRANT ALL ON tbl TO admin@localhost; +GRANT ALL ON tbl TO admin; +GRANT ALL PRIVILEGES ON tbl TO admin; +GRANT ALL ON *.* TO admin; +GRANT ALL ON *.* TO `admin`; +GRANT ALL ON *.* TO 'admin'; +GRANT ALL ON *.* TO "admin"; +GRANT ALL ON db.* TO "admin"; +GRANT ALL on db.tbl to 'admin'; +GRANT ALL on `db`.`tbl` to 'admin'; +GRANT ALL on `db`.tbl to 'admin'; +GRANT ALL on db.`tbl` to 'admin'; +GRANT SESSION_VARIABLES_ADMIN on *.* to 'u2'; +GRANT 'SESSION_VARIABLES_ADMIN' on *.* to 'u2'; +GRANT `SESSION_VARIABLES_ADMIN` on *.* to 'u2'; +GRANT "SESSION_VARIABLES_ADMIN" on *.* to 'u2'; +GRANT BACKUP_ADMIN ON *.* TO `admin`@`%`; +GRANT CREATE ROLE, DROP ROLE ON *.* TO `admin`@`localhost`; +GRANT AUDIT_ADMIN, BACKUP_ADMIN, BINLOG_ADMIN, BINLOG_ENCRYPTION_ADMIN, CLONE_ADMIN, CONNECTION_ADMIN, +ENCRYPTION_KEY_ADMIN, FIREWALL_ADMIN, FIREWALL_USER, GROUP_REPLICATION_ADMIN, INNODB_REDO_LOG_ARCHIVE, +NDB_STORED_USER, PERSIST_RO_VARIABLES_ADMIN, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, RESOURCE_GROUP_ADMIN, +RESOURCE_GROUP_USER, ROLE_ADMIN, SESSION_VARIABLES_ADMIN, SET_USER_ID, SHOW_ROUTINE, SYSTEM_VARIABLES_ADMIN, AUTHENTICATION_POLICY_ADMIN, +TABLE_ENCRYPTION_ADMIN, VERSION_TOKEN_ADMIN, XA_RECOVER_ADMIN, AUDIT_ABORT_EXEMPT, FIREWALL_EXEMPT, SKIP_QUERY_REWRITE, TP_CONNECTION_ADMIN ON *.* TO `admin`@`localhost`; +#NB: GRANT SELECT, INSERT, UPDATE ON *.* TO u4 AS u1 WITH ROLE r1; +#NB: GRANT SELECT, RELOAD, REPLICATION SLAVE, REPLICATION CLIENT, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'xuser1'@'%', 'xuser2'@'%' +# AS 'root'@'%' WITH ROLE 'cloudsqlsuperuser'@'%'; +GRANT ALTER ON *.* TO 'admin'@'localhost' ; #NB +GRANT ALTER ROUTINE ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE TEMPORARY TABLES ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE ROUTINE ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE VIEW ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE USER ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE TABLESPACE ON *.* TO 'admin'@'localhost' ; #NB +GRANT CREATE ROLE ON *.* TO 'admin'@'localhost' ; #NB +GRANT DELETE ON *.* TO 'admin'@'localhost' ; #NB +GRANT DROP ON *.* TO 'admin'@'localhost' ; #NB +GRANT DROP ROLE ON *.* TO 'admin'@'localhost' ; #NB +GRANT EVENT ON *.* TO 'admin'@'localhost' ; #NB +GRANT EXECUTE ON *.* TO 'admin'@'localhost' ; #NB +GRANT FILE ON *.* TO 'admin'@'localhost' ; #NB +GRANT GRANT OPTION ON *.* TO 'admin'@'localhost' ; #NB +GRANT INDEX ON *.* TO 'admin'@'localhost' ; #NB +GRANT INSERT ON *.* TO 'admin'@'localhost' ; #NB +GRANT LOCK TABLES ON *.* TO 'admin'@'localhost' ; #NB +GRANT PROCESS ON *.* TO 'admin'@'localhost' ; #NB +GRANT PROXY ON *.* TO 'admin'@'localhost' ; #NB +GRANT REFERENCES ON *.* TO 'admin'@'localhost' ; #NB +GRANT RELOAD ON *.* TO 'admin'@'localhost' ; #NB +GRANT REPLICATION CLIENT ON *.* TO 'admin'@'localhost' ; #NB +GRANT REPLICATION SLAVE ON *.* TO 'admin'@'localhost' ; #NB +GRANT SELECT ON *.* TO 'admin'@'localhost' ; #NB +GRANT SHOW VIEW ON *.* TO 'admin'@'localhost' ; #NB +GRANT SHOW DATABASES ON *.* TO 'admin'@'localhost' ; #NB +GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' ; #NB +GRANT SUPER ON *.* TO 'admin'@'localhost' ; #NB +GRANT TRIGGER ON *.* TO 'admin'@'localhost' ; #NB +GRANT UPDATE ON *.* TO 'admin'@'localhost' ; #NB +GRANT USAGE ON *.* TO 'admin'@'localhost' ; #NB +GRANT APPLICATION_PASSWORD_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT AUDIT_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT BACKUP_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT BINLOG_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT BINLOG_ENCRYPTION_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT CLONE_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT CONNECTION_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT ENCRYPTION_KEY_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT FIREWALL_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT FIREWALL_USER ON *.* TO 'admin'@'localhost' ; #NB +GRANT FLUSH_OPTIMIZER_COSTS ON *.* TO 'admin'@'localhost' ; #NB +GRANT FLUSH_STATUS ON *.* TO 'admin'@'localhost' ; #NB +GRANT FLUSH_TABLES ON *.* TO 'admin'@'localhost' ; #NB +GRANT FLUSH_USER_RESOURCES ON *.* TO 'admin'@'localhost' ; #NB +GRANT GROUP_REPLICATION_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT INNODB_REDO_LOG_ARCHIVE ON *.* TO 'admin'@'localhost' ; #NB +GRANT INNODB_REDO_LOG_ENABLE ON *.* TO 'admin'@'localhost' ; #NB +GRANT NDB_STORED_USER ON *.* TO 'admin'@'localhost' ; #NB +GRANT PERSIST_RO_VARIABLES_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT REPLICATION_APPLIER ON *.* TO 'admin'@'localhost' ; #NB +GRANT REPLICATION_SLAVE_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT RESOURCE_GROUP_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT RESOURCE_GROUP_USER ON *.* TO 'admin'@'localhost' ; #NB +GRANT ROLE_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT SERVICE_CONNECTION_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT SESSION_VARIABLES_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT SET_USER_ID ON *.* TO 'admin'@'localhost' ; #NB +GRANT SHOW_ROUTINE ON *.* TO 'admin'@'localhost' ; #NB +GRANT SYSTEM_USER ON *.* TO 'admin'@'localhost' ; #NB +GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT TABLE_ENCRYPTION_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT VERSION_TOKEN_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT XA_RECOVER_ADMIN ON *.* TO 'admin'@'localhost' ; #NB +GRANT reader TO 'mysqluser'@'localhost' ; #NB +GRANT reader TO topreader ; #NB +GRANT reader TO topreader WITH ADMIN OPTION; +GRANT 'db_old_ro'@'%' TO 'oghalawinji'@'%' ; #NB +GRANT FLUSH_OPTIMIZER_COSTS, FLUSH_STATUS, FLUSH_TABLES, FLUSH_USER_RESOURCES, PASSWORDLESS_USER_ADMIN ON *.* TO "@" ; #NB +REVOKE reader FROM 'mysqluser'@'localhost' ; #NB +REVOKE reader FROM topreader ; #NB +REVOKE `cloudsqlsuperuser`@`%` FROM `sarmonitoring`@`10.90.29.%` ; #NB +REVOKE IF EXISTS SELECT ON test.t1 FROM jerry@localhost; +REVOKE IF EXISTS Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER; + +-- Set Role +SET ROLE DEFAULT; +SET ROLE 'role1', 'role2'; +SET ROLE ALL; +SET ROLE ALL EXCEPT 'role1', 'role2'; +-- Set Default Role +SET DEFAULT ROLE 'admin', 'developer' TO 'joe'@'10.0.0.1'; +SET DEFAULT ROLE `admin`@'%' to `dt_user`@`%`; +-- MySQL on Amazon RDS +#NB: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, LOAD FROM S3, SELECT INTO S3, INVOKE LAMBDA ON *.* TO 'debezium_user'@'127.0.0.1'; diff --git a/sql/mysql/Oracle/examples/kill.sql b/sql/mysql/Oracle/examples/kill.sql new file mode 100644 index 0000000000..0c4ede4c22 --- /dev/null +++ b/sql/mysql/Oracle/examples/kill.sql @@ -0,0 +1,14 @@ +#begin +KILL CONNECTION 12345; +KILL QUERY 12345; +KILL CONNECTION @conn_variable; +KILL QUERY @query_variable; +KILL CONNECTION @@global_variable; +KILL QUERY @@global_variable; +#end +#begin +create procedure f (a1 int) +begin + kill query a1; +end; +#end diff --git a/sql/mysql/Oracle/examples/mysql_spec_comment.sql b/sql/mysql/Oracle/examples/mysql_spec_comment.sql new file mode 100644 index 0000000000..0cf330da92 --- /dev/null +++ b/sql/mysql/Oracle/examples/mysql_spec_comment.sql @@ -0,0 +1,20 @@ +#begin +-- Mysql spec comment +select 1 /*!, ' hello' */, 2 /*! union select 5, ' world', 10 */; +select * from t /*! where col = somefunc(col2) order by sortcol */; insert into mytable /*!(col2, col3, col1) */ values (load_file('sompath'), 'str1', 2); +insert into tbl values ('a', 1, 'b'), ('c', 2, 'd'), ('e', 3, 'f') /*! on duplicate key update notsecret_col = secret_col */; +select clientname, email from users where clientname='Petrov'/*! UNION SELECT 1,load_file('/etc/passwd')*/;# +#end +#begin +-- Duplicate query with ordinal comment +select 1 /*, ' hello' */, 2 /*! union select 5, ' world', 10 */; +select * from t /* where col = somefunc(col2) order by sortcol */; insert into mytable /*(col2, col3, col1) */ values (load_file('sompath'), 'str1', 2); +insert into tbl values ('a', 1, 'b'), ('c', 2, 'd'), ('e', 3, 'f') /* on duplicate key update notsecret_col = secret_col */; +select clientname, email from users where clientname='Petrov'/* UNION SELECT 1,load_file('/etc/passwd')*/;# +#end + +#begin +-- Empty line comment +-- +-- +#end \ No newline at end of file diff --git a/sql/mysql/Oracle/examples/optimize.sql b/sql/mysql/Oracle/examples/optimize.sql new file mode 100644 index 0000000000..ba1cebf566 --- /dev/null +++ b/sql/mysql/Oracle/examples/optimize.sql @@ -0,0 +1,7 @@ +#begin +OPTIMIZE TABLE t1; +OPTIMIZE TABLE t1, t2; +#NB: OPTIMIZE TABLES t1; +#NB: OPTIMIZE TABLES t1, t2; +optimize local table t1; +#end diff --git a/sql/mysql/Oracle/examples/smoke_tests.sql b/sql/mysql/Oracle/examples/smoke_tests.sql new file mode 100644 index 0000000000..07fe637ae0 --- /dev/null +++ b/sql/mysql/Oracle/examples/smoke_tests.sql @@ -0,0 +1,35 @@ +#begin +-- Intersections +-- -- Binary: charset and datatype +#NB: select _binary 'hello' as c1; +create table t1(col1 binary(20)); +create table t2(col varchar(10) binary character set cp1251); +create table t2(col varchar(10) binary character set binary); +#end +#begin +-- -- Keywords, which can be ID. Intersect that keywords and ID +#end +#begin +-- Expression test +select +-!1 as c; +select 0 in (20 = any (select col1 from t1)) is not null is not unknown as t; +select 0 in (20 = any (select col1 from t1)) is not unknown as t; +select 20 = any (select col1 from t1) is not unknown as t; +select 20 = any (select col1 from t1) as t; +-- select sqrt(20.5) not in (sqrt(20.5) not in (select col1 from t1), 1 in (1, 2, 3, 4)) as c; +select 20 in (10 in (5 in (1, 2, 3, 4, 5), 1, 1, 8), 8, 8, 8); +select (1 in (2, 3, 4)) in (0, 1, 2) as c; +select 1 and (5 between 1 and 10) as c; + +select 1 = 16/4 between 3 and 5 as c; +select 1 = 16/4 between 5 and 6 as c; +#end +#begin +-- Functions test +#NB: select *, sqrt(a), lower(substring(str, 'a', length(str)/2)) as col3 from tab1 where a is not \N; +#end +#begin +-- Spatial data type tests +INSERT INTO geom VALUES (GeomFromWKB(0x0101000000000000000000F03F000000000000F03F)); +select y(point(1.25, 3.47)) as y, x(point(1.25, 3.47)) as x; +#end diff --git a/sql/mysql/Oracle/original/MySQLLexer.g4 b/sql/mysql/Oracle/original/MySQLLexer.g4 new file mode 100644 index 0000000000..a34db8de6b --- /dev/null +++ b/sql/mysql/Oracle/original/MySQLLexer.g4 @@ -0,0 +1,3725 @@ +lexer grammar MySQLLexer; + +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +/* + * Merged in all changes up to mysql-trunk git revision [d2c9971] (24. January 2024). + * + * MySQL grammar for ANTLR 4.5+ with language features from MySQL 8.0 and up. + * The server version in the generated parser can be switched at runtime, making it so possible + * to switch the supported feature set dynamically. + * + * The coverage of the MySQL language should be 100%, but there might still be bugs or omissions. + * + * To use this grammar you will need a few support classes (which should be close to where you found this grammar). + * These classes implement the target specific action code, so we don't clutter the grammar with that + * and make it simpler to adjust it for other targets. See the demo/test project for further details. + * + * Written by Mike Lischke. Direct all bug reports, omissions etc. to mike.lischke@oracle.com. + */ + +//------------------------------------------------------------------------------------------------- + +// $antlr-format alignTrailingComments on, columnLimit 130, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments off +// $antlr-format useTab off, allowShortRulesOnASingleLine off, allowShortBlocksOnASingleLine on, alignSemicolons hanging +// $antlr-format alignColons hanging + +options { + superClass = MySQLBaseLexer; +} + +tokens { + NOT2_SYMBOL, + CONCAT_PIPES_SYMBOL, + + // Tokens assigned in NUMBER rule. + INT_NUMBER, // NUM in sql_yacc.yy + LONG_NUMBER, + ULONGLONG_NUMBER +} + +//------------------------------------------------------------------------------------------------- + +@header { +/* eslint-disable @typescript-eslint/no-unused-vars, no-useless-escape */ + +import { MySQLBaseLexer, SqlMode } from "../MySQLBaseLexer.js"; +} + +//------------------------------------------------------------------------------------------------- + +// Operators +EQUAL_OPERATOR + : '=' + ; // Also assign. + +ASSIGN_OPERATOR + : ':=' + ; + +NULL_SAFE_EQUAL_OPERATOR + : '<=>' + ; + +GREATER_OR_EQUAL_OPERATOR + : '>=' + ; + +GREATER_THAN_OPERATOR + : '>' + ; + +LESS_OR_EQUAL_OPERATOR + : '<=' + ; + +LESS_THAN_OPERATOR + : '<' + ; + +NOT_EQUAL_OPERATOR + : '!=' + ; + +NOT_EQUAL2_OPERATOR + : '<>' -> type(NOT_EQUAL_OPERATOR) + ; + +PLUS_OPERATOR + : '+' + ; + +MINUS_OPERATOR + : '-' + ; + +MULT_OPERATOR + : '*' + ; + +DIV_OPERATOR + : '/' + ; + +MOD_OPERATOR + : '%' + ; + +LOGICAL_NOT_OPERATOR + : '!' + ; + +BITWISE_NOT_OPERATOR + : '~' + ; + +SHIFT_LEFT_OPERATOR + : '<<' + ; + +SHIFT_RIGHT_OPERATOR + : '>>' + ; + +LOGICAL_AND_OPERATOR + : '&&' + ; + +BITWISE_AND_OPERATOR + : '&' + ; + +BITWISE_XOR_OPERATOR + : '^' + ; + +LOGICAL_OR_OPERATOR + : '||' { this.type = this.isSqlModeActive(SqlMode.PipesAsConcat) ? MySQLLexer.CONCAT_PIPES_SYMBOL : MySQLLexer.LOGICAL_OR_OPERATOR; + } + ; + +BITWISE_OR_OPERATOR + : '|' + ; + +DOT_SYMBOL + : '.' + ; + +COMMA_SYMBOL + : ',' + ; + +SEMICOLON_SYMBOL + : ';' + ; + +COLON_SYMBOL + : ':' + ; + +OPEN_PAR_SYMBOL + : '(' + ; + +CLOSE_PAR_SYMBOL + : ')' + ; + +OPEN_CURLY_SYMBOL + : '{' + ; + +CLOSE_CURLY_SYMBOL + : '}' + ; + +UNDERLINE_SYMBOL + : '_' + ; + +JSON_SEPARATOR_SYMBOL + : '->' + ; // MYSQL + +JSON_UNQUOTED_SEPARATOR_SYMBOL + : '->>' + ; // MYSQL + +/* INSERT OTHER OPERATORS HERE */ + +// The MySQL server parser uses custom code in its lexer to allow base alphanum chars (and ._$) as variable name. +// For this it handles user variables in 2 different ways and we have to model this to match that behavior. +AT_SIGN_SYMBOL + : '@' + ; + +AT_TEXT_SUFFIX + : '@' SIMPLE_IDENTIFIER + ; + +AT_AT_SIGN_SYMBOL + : '@@' + ; + +NULL2_SYMBOL + : '\\N' + ; + +PARAM_MARKER + : '?' + ; + +fragment A + : [aA] + ; + +fragment B + : [bB] + ; + +fragment C + : [cC] + ; + +fragment D + : [dD] + ; + +fragment E + : [eE] + ; + +fragment F + : [fF] + ; + +fragment G + : [gG] + ; + +fragment H + : [hH] + ; + +fragment I + : [iI] + ; + +fragment J + : [jJ] + ; + +fragment K + : [kK] + ; + +fragment L + : [lL] + ; + +fragment M + : [mM] + ; + +fragment N + : [nN] + ; + +fragment O + : [oO] + ; + +fragment P + : [pP] + ; + +fragment Q + : [qQ] + ; + +fragment R + : [rR] + ; + +fragment S + : [sS] + ; + +fragment T + : [tT] + ; + +fragment U + : [uU] + ; + +fragment V + : [vV] + ; + +fragment W + : [wW] + ; + +fragment X + : [xX] + ; + +fragment Y + : [yY] + ; + +fragment Z + : [zZ] + ; + +fragment DIGIT + : [0-9] + ; + +fragment DIGITS + : DIGIT+ + ; + +fragment HEXDIGIT + : [0-9a-fA-F] + ; + +// Only lower case 'x' and 'b' count for hex + bin numbers. Otherwise it's an identifier. +HEX_NUMBER + : ('0x' HEXDIGIT+) + | ('x\'' HEXDIGIT+ '\'') + ; + +BIN_NUMBER + : ('0b' [01]+) + | ('b\'' [01]+ '\'') + ; + +INT_NUMBER + : DIGITS { this.type = this.determineNumericType(this.text); } + ; + +// Float types must be handled first or the DOT_IDENTIIFER rule will make them to identifiers +// (if there is no leading digit before the dot). +DECIMAL_NUMBER + : DIGITS? DOT_SYMBOL DIGITS + ; + +FLOAT_NUMBER + : (DIGITS? DOT_SYMBOL)? DIGITS [eE] (MINUS_OPERATOR | PLUS_OPERATOR)? DIGITS + ; + +// Special rule that should also match all keywords if they are directly preceded by a dot. +// Hence it's defined before all keywords. +// Here we make use of the ability in our base lexer to emit multiple tokens with a single rule. +DOT_IDENTIFIER + : DOT_SYMBOL LETTER_WHEN_UNQUOTED_NO_DIGIT LETTER_WHEN_UNQUOTED* { this.emitDot(); } -> type(IDENTIFIER) + ; + +// $antlr-format groupedAlignments off, alignTrailers on + +ACCESSIBLE_SYMBOL + : A C C E S S I B L E + ; + +ACCOUNT_SYMBOL + : A C C O U N T + ; + +ACTION_SYMBOL + : A C T I O N + ; // SQL-2003-N + +ADD_SYMBOL + : A D D + ; // SQL-2003-R + +ADDDATE_SYMBOL + : A D D D A T E { this.type = this.determineFunction(MySQLLexer.ADDDATE_SYMBOL); } + ; // MYSQL-FUNC + +AFTER_SYMBOL + : A F T E R + ; // SQL-2003-N + +AGAINST_SYMBOL + : A G A I N S T + ; + +AGGREGATE_SYMBOL + : A G G R E G A T E + ; + +ALGORITHM_SYMBOL + : A L G O R I T H M + ; + +ALL_SYMBOL + : A L L + ; // SQL-2003-R + +ALTER_SYMBOL + : A L T E R + ; // SQL-2003-R + +ALWAYS_SYMBOL + : A L W A Y S + ; + +ANALYZE_SYMBOL + : A N A L Y Z E + ; + +AND_SYMBOL + : A N D + ; // SQL-2003-R + +ANY_SYMBOL + : A N Y + ; // SQL-2003-R + +AS_SYMBOL + : A S + ; // SQL-2003-R + +ASC_SYMBOL + : A S C + ; // SQL-2003-N + +ASCII_SYMBOL + : A S C I I + ; // MYSQL-FUNC + +ASENSITIVE_SYMBOL + : A S E N S I T I V E + ; // FUTURE-USE + +AT_SYMBOL + : A T + ; + +AUTOEXTEND_SIZE_SYMBOL + : A U T O E X T E N D '_' S I Z E + ; + +AUTO_INCREMENT_SYMBOL + : A U T O '_' I N C R E M E N T + ; + +AVG_ROW_LENGTH_SYMBOL + : A V G '_' R O W '_' L E N G T H + ; + +AVG_SYMBOL + : A V G + ; // SQL-2003-N + +BACKUP_SYMBOL + : B A C K U P + ; + +BEFORE_SYMBOL + : B E F O R E + ; // SQL-2003-N + +BEGIN_SYMBOL + : B E G I N + ; // SQL-2003-R + +BETWEEN_SYMBOL + : B E T W E E N + ; // SQL-2003-R + +BIGINT_SYMBOL + : B I G I N T + ; // SQL-2003-R + +BINARY_SYMBOL + : B I N A R Y + ; // SQL-2003-R + +BINLOG_SYMBOL + : B I N L O G + ; + +BIT_AND_SYMBOL + : B I T '_' A N D { this.type = this.determineFunction(MySQLLexer.BIT_AND_SYMBOL); } + ; // MYSQL-FUNC + +BIT_OR_SYMBOL + : B I T '_' O R { this.type = this.determineFunction(MySQLLexer.BIT_OR_SYMBOL); } + ; // MYSQL-FUNC + +BIT_SYMBOL + : B I T + ; // MYSQL-FUNC + +BIT_XOR_SYMBOL + : B I T '_' X O R { this.type = this.determineFunction(MySQLLexer.BIT_XOR_SYMBOL); } + ; // MYSQL-FUNC + +BLOB_SYMBOL + : B L O B + ; // SQL-2003-R + +BLOCK_SYMBOL + : B L O C K + ; + +BOOLEAN_SYMBOL + : B O O L E A N + ; // SQL-2003-R + +BOOL_SYMBOL + : B O O L + ; + +BOTH_SYMBOL + : B O T H + ; // SQL-2003-R + +BTREE_SYMBOL + : B T R E E + ; + +BY_SYMBOL + : B Y + ; // SQL-2003-R + +BYTE_SYMBOL + : B Y T E + ; + +CACHE_SYMBOL + : C A C H E + ; + +CALL_SYMBOL + : C A L L + ; // SQL-2003-R + +CASCADE_SYMBOL + : C A S C A D E + ; // SQL-2003-N + +CASCADED_SYMBOL + : C A S C A D E D + ; // SQL-2003-R + +CASE_SYMBOL + : C A S E + ; // SQL-2003-R + +CAST_SYMBOL + : C A S T { this.type = this.determineFunction(MySQLLexer.CAST_SYMBOL); } + ; // SQL-2003-R + +CATALOG_NAME_SYMBOL + : C A T A L O G '_' N A M E + ; // SQL-2003-N + +CHAIN_SYMBOL + : C H A I N + ; // SQL-2003-N + +CHANGE_SYMBOL + : C H A N G E + ; + +CHANGED_SYMBOL + : C H A N G E D + ; + +CHANNEL_SYMBOL + : C H A N N E L + ; + +CHARSET_SYMBOL + : C H A R S E T + ; + +CHARACTER_SYMBOL + : C H A R A C T E R -> type(CHAR_SYMBOL) + ; // Synonym + +CHAR_SYMBOL + : C H A R + ; // SQL-2003-R + +CHECKSUM_SYMBOL + : C H E C K S U M + ; + +CHECK_SYMBOL + : C H E C K + ; // SQL-2003-R + +CIPHER_SYMBOL + : C I P H E R + ; + +CLASS_ORIGIN_SYMBOL + : C L A S S '_' O R I G I N + ; // SQL-2003-N + +CLIENT_SYMBOL + : C L I E N T + ; + +CLOSE_SYMBOL + : C L O S E + ; // SQL-2003-R + +COALESCE_SYMBOL + : C O A L E S C E + ; // SQL-2003-N + +CODE_SYMBOL + : C O D E + ; + +COLLATE_SYMBOL + : C O L L A T E + ; // SQL-2003-R + +COLLATION_SYMBOL + : C O L L A T I O N + ; // SQL-2003-N + +COLUMNS_SYMBOL + : C O L U M N S + ; + +COLUMN_SYMBOL + : C O L U M N + ; // SQL-2003-R + +COLUMN_NAME_SYMBOL + : C O L U M N '_' N A M E + ; // SQL-2003-N + +COLUMN_FORMAT_SYMBOL + : C O L U M N '_' F O R M A T + ; + +COMMENT_SYMBOL + : C O M M E N T + ; + +COMMITTED_SYMBOL + : C O M M I T T E D + ; // SQL-2003-N + +COMMIT_SYMBOL + : C O M M I T + ; // SQL-2003-R + +COMPACT_SYMBOL + : C O M P A C T + ; + +COMPLETION_SYMBOL + : C O M P L E T I O N + ; + +COMPRESSED_SYMBOL + : C O M P R E S S E D + ; + +COMPRESSION_SYMBOL + : C O M P R E S S I O N + ; + +CONCURRENT_SYMBOL + : C O N C U R R E N T + ; + +CONDITION_SYMBOL + : C O N D I T I O N + ; // SQL-2003-R, SQL-2008-R + +CONNECTION_SYMBOL + : C O N N E C T I O N + ; + +CONSISTENT_SYMBOL + : C O N S I S T E N T + ; + +CONSTRAINT_SYMBOL + : C O N S T R A I N T + ; // SQL-2003-R + +CONSTRAINT_CATALOG_SYMBOL + : C O N S T R A I N T '_' C A T A L O G + ; // SQL-2003-N + +CONSTRAINT_NAME_SYMBOL + : C O N S T R A I N T '_' N A M E + ; // SQL-2003-N + +CONSTRAINT_SCHEMA_SYMBOL + : C O N S T R A I N T '_' S C H E M A + ; // SQL-2003-N + +CONTAINS_SYMBOL + : C O N T A I N S + ; // SQL-2003-N + +CONTEXT_SYMBOL + : C O N T E X T + ; + +CONTINUE_SYMBOL + : C O N T I N U E + ; // SQL-2003-R + +CONVERT_SYMBOL + : C O N V E R T + ; // SQL-2003-N + +COUNT_SYMBOL + : C O U N T { this.type = this.determineFunction(MySQLLexer.COUNT_SYMBOL); } + ; // SQL-2003-N + +CPU_SYMBOL + : C P U + ; + +CREATE_SYMBOL + : C R E A T E + ; // SQL-2003-R + +CROSS_SYMBOL + : C R O S S + ; // SQL-2003-R + +CUBE_SYMBOL + : C U B E + ; // SQL-2003-R + +CURDATE_SYMBOL + : C U R D A T E { this.type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); } + ; // MYSQL-FUNC + +CURRENT_SYMBOL + : C U R R E N T + ; + +CURRENT_DATE_SYMBOL + : C U R R E N T '_' D A T E { this.type = this.determineFunction(MySQLLexer.CURDATE_SYMBOL); } + ; // Synonym, MYSQL-FUNC + +CURRENT_TIME_SYMBOL + : C U R R E N T '_' T I M E { this.type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); } + ; // Synonym, MYSQL-FUNC + +CURRENT_TIMESTAMP_SYMBOL + : C U R R E N T '_' T I M E S T A M P -> type(NOW_SYMBOL) + ; // Synonym + +CURRENT_USER_SYMBOL + : C U R R E N T '_' U S E R + ; // SQL-2003-R + +CURSOR_SYMBOL + : C U R S O R + ; // SQL-2003-R + +CURSOR_NAME_SYMBOL + : C U R S O R '_' N A M E + ; // SQL-2003-N + +CURTIME_SYMBOL + : C U R T I M E { this.type = this.determineFunction(MySQLLexer.CURTIME_SYMBOL); } + ; // MYSQL-FUNC + +DATABASE_SYMBOL + : D A T A B A S E + ; + +DATABASES_SYMBOL + : D A T A B A S E S + ; + +DATAFILE_SYMBOL + : D A T A F I L E + ; + +DATA_SYMBOL + : D A T A + ; // SQL-2003-N + +DATETIME_SYMBOL + : D A T E T I M E + ; // MYSQL + +DATE_ADD_SYMBOL + : D A T E '_' A D D { this.type = this.determineFunction(MySQLLexer.DATE_ADD_SYMBOL); } + ; + +DATE_SUB_SYMBOL + : D A T E '_' S U B { this.type = this.determineFunction(MySQLLexer.DATE_SUB_SYMBOL); } + ; + +DATE_SYMBOL + : D A T E + ; // SQL-2003-R + +DAYOFMONTH_SYMBOL + : D A Y O F M O N T H -> type(DAY_SYMBOL) + ; // Synonym + +DAY_HOUR_SYMBOL + : D A Y '_' H O U R + ; + +DAY_MICROSECOND_SYMBOL + : D A Y '_' M I C R O S E C O N D + ; + +DAY_MINUTE_SYMBOL + : D A Y '_' M I N U T E + ; + +DAY_SECOND_SYMBOL + : D A Y '_' S E C O N D + ; + +DAY_SYMBOL + : D A Y + ; // SQL-2003-R + +DEALLOCATE_SYMBOL + : D E A L L O C A T E + ; // SQL-2003-R + +DEC_SYMBOL + : D E C -> type(DECIMAL_SYMBOL) + ; // Synonym + +DECIMAL_SYMBOL + : D E C I M A L + ; // SQL-2003-R + +DECLARE_SYMBOL + : D E C L A R E + ; // SQL-2003-R + +DEFAULT_SYMBOL + : D E F A U L T + ; // SQL-2003-R + +DEFAULT_AUTH_SYMBOL + : D E F A U L T '_' A U T H + ; // Internal + +DEFINER_SYMBOL + : D E F I N E R + ; + +DELAYED_SYMBOL + : D E L A Y E D + ; + +DELAY_KEY_WRITE_SYMBOL + : D E L A Y '_' K E Y '_' W R I T E + ; + +DELETE_SYMBOL + : D E L E T E + ; // SQL-2003-R + +DESC_SYMBOL + : D E S C + ; // SQL-2003-N + +DESCRIBE_SYMBOL + : D E S C R I B E + ; // SQL-2003-R + +DETERMINISTIC_SYMBOL + : D E T E R M I N I S T I C + ; // SQL-2003-R + +DIAGNOSTICS_SYMBOL + : D I A G N O S T I C S + ; + +DIRECTORY_SYMBOL + : D I R E C T O R Y + ; + +DISABLE_SYMBOL + : D I S A B L E + ; + +DISCARD_SYMBOL + : D I S C A R D + ; + +DISK_SYMBOL + : D I S K + ; + +DISTINCT_SYMBOL + : D I S T I N C T + ; // SQL-2003-R + +DISTINCTROW_SYMBOL + : D I S T I N C T R O W -> type(DISTINCT_SYMBOL) + ; // Synonym + +DIV_SYMBOL + : D I V + ; + +DOUBLE_SYMBOL + : D O U B L E + ; // SQL-2003-R + +DO_SYMBOL + : D O + ; + +DROP_SYMBOL + : D R O P + ; // SQL-2003-R + +DUAL_SYMBOL + : D U A L + ; + +DUMPFILE_SYMBOL + : D U M P F I L E + ; + +DUPLICATE_SYMBOL + : D U P L I C A T E + ; + +DYNAMIC_SYMBOL + : D Y N A M I C + ; // SQL-2003-R + +EACH_SYMBOL + : E A C H + ; // SQL-2003-R + +ELSE_SYMBOL + : E L S E + ; // SQL-2003-R + +ELSEIF_SYMBOL + : E L S E I F + ; + +ENABLE_SYMBOL + : E N A B L E + ; + +ENCLOSED_SYMBOL + : E N C L O S E D + ; + +ENCRYPTION_SYMBOL + : E N C R Y P T I O N + ; + +END_SYMBOL + : E N D + ; // SQL-2003-R + +ENDS_SYMBOL + : E N D S + ; + +ENGINES_SYMBOL + : E N G I N E S + ; + +ENGINE_SYMBOL + : E N G I N E + ; + +ENUM_SYMBOL + : E N U M + ; // MYSQL + +ERROR_SYMBOL + : E R R O R + ; + +ERRORS_SYMBOL + : E R R O R S + ; + +ESCAPED_SYMBOL + : E S C A P E D + ; + +ESCAPE_SYMBOL + : E S C A P E + ; // SQL-2003-R + +EVENTS_SYMBOL + : E V E N T S + ; + +EVENT_SYMBOL + : E V E N T + ; + +EVERY_SYMBOL + : E V E R Y + ; // SQL-2003-N + +EXCHANGE_SYMBOL + : E X C H A N G E + ; + +EXECUTE_SYMBOL + : E X E C U T E + ; // SQL-2003-R + +EXISTS_SYMBOL + : E X I S T S + ; // SQL-2003-R + +EXIT_SYMBOL + : E X I T + ; + +EXPANSION_SYMBOL + : E X P A N S I O N + ; + +EXPIRE_SYMBOL + : E X P I R E + ; + +EXPLAIN_SYMBOL + : E X P L A I N + ; // SQL-2003-R + +EXPORT_SYMBOL + : E X P O R T + ; + +EXTENDED_SYMBOL + : E X T E N D E D + ; + +EXTENT_SIZE_SYMBOL + : E X T E N T '_' S I Z E + ; + +EXTRACT_SYMBOL + : E X T R A C T { this.type = this.determineFunction(MySQLLexer.EXTRACT_SYMBOL); } + ; // SQL-2003-N + +FALSE_SYMBOL + : F A L S E + ; // SQL-2003-R + +FAST_SYMBOL + : F A S T + ; + +FAULTS_SYMBOL + : F A U L T S + ; + +FETCH_SYMBOL + : F E T C H + ; // SQL-2003-R + +FIELDS_SYMBOL + : F I E L D S -> type(COLUMNS_SYMBOL) + ; // Synonym + +FILE_SYMBOL + : F I L E + ; + +FILE_BLOCK_SIZE_SYMBOL + : F I L E '_' B L O C K '_' S I Z E + ; + +FILTER_SYMBOL + : F I L T E R + ; + +FIRST_SYMBOL + : F I R S T + ; // SQL-2003-N + +FIXED_SYMBOL + : F I X E D + ; + +FLOAT4_SYMBOL + : F L O A T '4' -> type(FLOAT_SYMBOL) + ; // Synonym + +FLOAT8_SYMBOL + : F L O A T '8' -> type(DOUBLE_SYMBOL) + ; // Synonym + +FLOAT_SYMBOL + : F L O A T + ; // SQL-2003-R + +FLUSH_SYMBOL + : F L U S H + ; + +FOLLOWS_SYMBOL + : F O L L O W S + ; + +FORCE_SYMBOL + : F O R C E + ; + +FOREIGN_SYMBOL + : F O R E I G N + ; // SQL-2003-R + +FOR_SYMBOL + : F O R + ; // SQL-2003-R + +FORMAT_SYMBOL + : F O R M A T + ; + +FOUND_SYMBOL + : F O U N D + ; // SQL-2003-R + +FROM_SYMBOL + : F R O M + ; + +FULL_SYMBOL + : F U L L + ; // SQL-2003-R + +FULLTEXT_SYMBOL + : F U L L T E X T + ; + +FUNCTION_SYMBOL + : F U N C T I O N + ; // SQL-2003-R + +GET_SYMBOL + : G E T + ; + +GENERAL_SYMBOL + : G E N E R A L + ; + +GENERATED_SYMBOL + : G E N E R A T E D + ; + +GROUP_REPLICATION_SYMBOL + : G R O U P '_' R E P L I C A T I O N + ; + +GEOMETRYCOLLECTION_SYMBOL + : G E O M E T R Y C O L L E C T I O N + ; // MYSQL + +GEOMETRY_SYMBOL + : G E O M E T R Y + ; + +GET_FORMAT_SYMBOL + : G E T '_' F O R M A T + ; // MYSQL-FUNC + +GLOBAL_SYMBOL + : G L O B A L + ; // SQL-2003-R + +GRANT_SYMBOL + : G R A N T + ; // SQL-2003-R + +GRANTS_SYMBOL + : G R A N T S + ; + +GROUP_SYMBOL + : G R O U P + ; // SQL-2003-R + +GROUP_CONCAT_SYMBOL + : G R O U P '_' C O N C A T { this.type = this.determineFunction(MySQLLexer.GROUP_CONCAT_SYMBOL); } + ; + +HANDLER_SYMBOL + : H A N D L E R + ; + +HASH_SYMBOL + : H A S H + ; + +HAVING_SYMBOL + : H A V I N G + ; // SQL-2003-R + +HELP_SYMBOL + : H E L P + ; + +HIGH_PRIORITY_SYMBOL + : H I G H '_' P R I O R I T Y + ; + +HOST_SYMBOL + : H O S T + ; + +HOSTS_SYMBOL + : H O S T S + ; + +HOUR_MICROSECOND_SYMBOL + : H O U R '_' M I C R O S E C O N D + ; + +HOUR_MINUTE_SYMBOL + : H O U R '_' M I N U T E + ; + +HOUR_SECOND_SYMBOL + : H O U R '_' S E C O N D + ; + +HOUR_SYMBOL + : H O U R + ; // SQL-2003-R + +IDENTIFIED_SYMBOL + : I D E N T I F I E D + ; + +IF_SYMBOL + : I F + ; + +IGNORE_SYMBOL + : I G N O R E + ; + +IGNORE_SERVER_IDS_SYMBOL + : I G N O R E '_' S E R V E R '_' I D S + ; + +IMPORT_SYMBOL + : I M P O R T + ; + +INDEXES_SYMBOL + : I N D E X E S + ; + +INDEX_SYMBOL + : I N D E X + ; + +INFILE_SYMBOL + : I N F I L E + ; + +INITIAL_SIZE_SYMBOL + : I N I T I A L '_' S I Z E + ; + +INNER_SYMBOL + : I N N E R + ; // SQL-2003-R + +INOUT_SYMBOL + : I N O U T + ; // SQL-2003-R + +INSENSITIVE_SYMBOL + : I N S E N S I T I V E + ; // SQL-2003-R + +INSERT_SYMBOL + : I N S E R T + ; // SQL-2003-R + +INSERT_METHOD_SYMBOL + : I N S E R T '_' M E T H O D + ; + +INSTANCE_SYMBOL + : I N S T A N C E + ; + +INSTALL_SYMBOL + : I N S T A L L + ; + +INTEGER_SYMBOL + : I N T E G E R -> type(INT_SYMBOL) + ; // Synonym + +INTERVAL_SYMBOL + : I N T E R V A L + ; // SQL-2003-R + +INTO_SYMBOL + : I N T O + ; // SQL-2003-R + +INT_SYMBOL + : I N T + ; // SQL-2003-R + +INVOKER_SYMBOL + : I N V O K E R + ; + +IN_SYMBOL + : I N + ; // SQL-2003-R + +IO_AFTER_GTIDS_SYMBOL + : I O '_' A F T E R '_' G T I D S + ; // MYSQL, FUTURE-USE + +IO_BEFORE_GTIDS_SYMBOL + : I O '_' B E F O R E '_' G T I D S + ; // MYSQL, FUTURE-USE + +IO_THREAD_SYMBOL + : I O '_' T H R E A D -> type(RELAY_THREAD_SYMBOL) + ; // Synonym + +IO_SYMBOL + : I O + ; + +IPC_SYMBOL + : I P C + ; + +IS_SYMBOL + : I S + ; // SQL-2003-R + +ISOLATION_SYMBOL + : I S O L A T I O N + ; // SQL-2003-R + +ISSUER_SYMBOL + : I S S U E R + ; + +ITERATE_SYMBOL + : I T E R A T E + ; + +JOIN_SYMBOL + : J O I N + ; // SQL-2003-R + +JSON_SYMBOL + : J S O N + ; // MYSQL + +KEYS_SYMBOL + : K E Y S + ; + +KEY_BLOCK_SIZE_SYMBOL + : K E Y '_' B L O C K '_' S I Z E + ; + +KEY_SYMBOL + : K E Y + ; // SQL-2003-N + +KILL_SYMBOL + : K I L L + ; + +LANGUAGE_SYMBOL + : L A N G U A G E + ; // SQL-2003-R + +LAST_SYMBOL + : L A S T + ; // SQL-2003-N + +LEADING_SYMBOL + : L E A D I N G + ; // SQL-2003-R + +LEAVES_SYMBOL + : L E A V E S + ; + +LEAVE_SYMBOL + : L E A V E + ; + +LEFT_SYMBOL + : L E F T + ; // SQL-2003-R + +LESS_SYMBOL + : L E S S + ; + +LEVEL_SYMBOL + : L E V E L + ; + +LIKE_SYMBOL + : L I K E + ; // SQL-2003-R + +LIMIT_SYMBOL + : L I M I T + ; + +LINEAR_SYMBOL + : L I N E A R + ; + +LINES_SYMBOL + : L I N E S + ; + +LINESTRING_SYMBOL + : L I N E S T R I N G + ; // MYSQL + +LIST_SYMBOL + : L I S T + ; + +LOAD_SYMBOL + : L O A D + ; + +LOCALTIME_SYMBOL + : L O C A L T I M E -> type(NOW_SYMBOL) + ; // Synonym + +LOCALTIMESTAMP_SYMBOL + : L O C A L T I M E S T A M P -> type(NOW_SYMBOL) + ; // Synonym + +LOCAL_SYMBOL + : L O C A L + ; // SQL-2003-R + +LOCKS_SYMBOL + : L O C K S + ; + +LOCK_SYMBOL + : L O C K + ; + +LOGFILE_SYMBOL + : L O G F I L E + ; + +LOGS_SYMBOL + : L O G S + ; + +LONGBLOB_SYMBOL + : L O N G B L O B + ; // MYSQL + +LONGTEXT_SYMBOL + : L O N G T E X T + ; // MYSQL + +LONG_SYMBOL + : L O N G + ; + +LOOP_SYMBOL + : L O O P + ; + +LOW_PRIORITY_SYMBOL + : L O W '_' P R I O R I T Y + ; + +MASTER_AUTO_POSITION_SYMBOL + : M A S T E R '_' A U T O '_' P O S I T I O N {this.serverVersion < 80024}? + ; + +MASTER_BIND_SYMBOL + : M A S T E R '_' B I N D {this.serverVersion < 80024}? + ; + +MASTER_CONNECT_RETRY_SYMBOL + : M A S T E R '_' C O N N E C T '_' R E T R Y {this.serverVersion < 80024}? + ; + +MASTER_DELAY_SYMBOL + : M A S T E R '_' D E L A Y {this.serverVersion < 80024}? + ; + +MASTER_HOST_SYMBOL + : M A S T E R '_' H O S T {this.serverVersion < 80024}? + ; + +MASTER_LOG_FILE_SYMBOL + : M A S T E R '_' L O G '_' F I L E {this.serverVersion < 80024}? + ; + +MASTER_LOG_POS_SYMBOL + : M A S T E R '_' L O G '_' P O S {this.serverVersion < 80024}? + ; + +MASTER_PASSWORD_SYMBOL + : M A S T E R '_' P A S S W O R D {this.serverVersion < 80024}? + ; + +MASTER_PORT_SYMBOL + : M A S T E R '_' P O R T {this.serverVersion < 80024}? + ; + +MASTER_RETRY_COUNT_SYMBOL + : M A S T E R '_' R E T R Y '_' C O U N T {this.serverVersion < 80024}? + ; + +MASTER_SSL_CAPATH_SYMBOL + : M A S T E R '_' S S L '_' C A P A T H {this.serverVersion < 80024}? + ; + +MASTER_SSL_CA_SYMBOL + : M A S T E R '_' S S L '_' C A {this.serverVersion < 80024}? + ; + +MASTER_SSL_CERT_SYMBOL + : M A S T E R '_' S S L '_' C E R T {this.serverVersion < 80024}? + ; + +MASTER_SSL_CIPHER_SYMBOL + : M A S T E R '_' S S L '_' C I P H E R {this.serverVersion < 80024}? + ; + +MASTER_SSL_CRL_SYMBOL + : M A S T E R '_' S S L '_' C R L {this.serverVersion < 80024}? + ; + +MASTER_SSL_CRLPATH_SYMBOL + : M A S T E R '_' S S L '_' C R L P A T H {this.serverVersion < 80024}? + ; + +MASTER_SSL_KEY_SYMBOL + : M A S T E R '_' S S L '_' K E Y {this.serverVersion < 80024}? + ; + +MASTER_SSL_SYMBOL + : M A S T E R '_' S S L {this.serverVersion < 80024}? + ; + +MASTER_SSL_VERIFY_SERVER_CERT_SYMBOL + : M A S T E R '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T {this.serverVersion < 80024}? + ; + +MASTER_SYMBOL + : M A S T E R {this.serverVersion < 80024}? + ; + +MASTER_TLS_VERSION_SYMBOL + : M A S T E R '_' T L S '_' V E R S I O N {this.serverVersion < 80024}? + ; + +MASTER_USER_SYMBOL + : M A S T E R '_' U S E R {this.serverVersion < 80024}? + ; + +MASTER_HEARTBEAT_PERIOD_SYMBOL + : M A S T E R '_' H E A R T B E A T '_' P E R I O D {this.serverVersion < 80024}? + ; + +MATCH_SYMBOL + : M A T C H + ; // SQL-2003-R + +MAX_CONNECTIONS_PER_HOUR_SYMBOL + : M A X '_' C O N N E C T I O N S '_' P E R '_' H O U R + ; + +MAX_QUERIES_PER_HOUR_SYMBOL + : M A X '_' Q U E R I E S '_' P E R '_' H O U R + ; + +MAX_ROWS_SYMBOL + : M A X '_' R O W S + ; + +MAX_SIZE_SYMBOL + : M A X '_' S I Z E + ; + +MAX_SYMBOL + : M A X { this.type = this.determineFunction(MySQLLexer.MAX_SYMBOL); } + ; // SQL-2003-N + +MAX_UPDATES_PER_HOUR_SYMBOL + : M A X '_' U P D A T E S '_' P E R '_' H O U R + ; + +MAX_USER_CONNECTIONS_SYMBOL + : M A X '_' U S E R '_' C O N N E C T I O N S + ; + +MAXVALUE_SYMBOL + : M A X V A L U E + ; // SQL-2003-N + +MEDIUMBLOB_SYMBOL + : M E D I U M B L O B + ; // MYSQL + +MEDIUMINT_SYMBOL + : M E D I U M I N T + ; // MYSQL + +MEDIUMTEXT_SYMBOL + : M E D I U M T E X T + ; // MYSQL + +MEDIUM_SYMBOL + : M E D I U M + ; + +MEMORY_SYMBOL + : M E M O R Y + ; + +MERGE_SYMBOL + : M E R G E + ; // SQL-2003-R + +MESSAGE_TEXT_SYMBOL + : M E S S A G E '_' T E X T + ; // SQL-2003-N + +MICROSECOND_SYMBOL + : M I C R O S E C O N D + ; // MYSQL-FUNC + +MID_SYMBOL + : M I D { this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + ; // Synonym + +MIDDLEINT_SYMBOL + : M I D D L E I N T -> type(MEDIUMINT_SYMBOL) + ; // Synonym (for Powerbuilder) + +MIGRATE_SYMBOL + : M I G R A T E + ; + +MINUTE_MICROSECOND_SYMBOL + : M I N U T E '_' M I C R O S E C O N D + ; + +MINUTE_SECOND_SYMBOL + : M I N U T E '_' S E C O N D + ; + +MINUTE_SYMBOL + : M I N U T E + ; // SQL-2003-R + +MIN_ROWS_SYMBOL + : M I N '_' R O W S + ; + +MIN_SYMBOL + : M I N { this.type = this.determineFunction(MySQLLexer.MIN_SYMBOL); } + ; // SQL-2003-N + +MODE_SYMBOL + : M O D E + ; + +MODIFIES_SYMBOL + : M O D I F I E S + ; // SQL-2003-R + +MODIFY_SYMBOL + : M O D I F Y + ; + +MOD_SYMBOL + : M O D + ; // SQL-2003-N + +MONTH_SYMBOL + : M O N T H + ; // SQL-2003-R + +MULTILINESTRING_SYMBOL + : M U L T I L I N E S T R I N G + ; // MYSQL + +MULTIPOINT_SYMBOL + : M U L T I P O I N T + ; // MYSQL + +MULTIPOLYGON_SYMBOL + : M U L T I P O L Y G O N + ; // MYSQL + +MUTEX_SYMBOL + : M U T E X + ; + +MYSQL_ERRNO_SYMBOL + : M Y S Q L '_' E R R N O + ; + +NAMES_SYMBOL + : N A M E S + ; // SQL-2003-N + +NAME_SYMBOL + : N A M E + ; // SQL-2003-N + +NATIONAL_SYMBOL + : N A T I O N A L + ; // SQL-2003-R + +NATURAL_SYMBOL + : N A T U R A L + ; // SQL-2003-R + +NCHAR_SYMBOL + : N C H A R + ; // SQL-2003-R + +NDB_SYMBOL + : N D B -> type(NDBCLUSTER_SYMBOL) + ; //Synonym + +NDBCLUSTER_SYMBOL + : N D B C L U S T E R + ; + +NEVER_SYMBOL + : N E V E R + ; + +NEW_SYMBOL + : N E W + ; // SQL-2003-R + +NEXT_SYMBOL + : N E X T + ; // SQL-2003-N + +NODEGROUP_SYMBOL + : N O D E G R O U P + ; + +NONE_SYMBOL + : N O N E + ; // SQL-2003-R + +NOT_SYMBOL + : N O T { this.type = this.isSqlModeActive(SqlMode.HighNotPrecedence) ? MySQLLexer.NOT2_SYMBOL: MySQLLexer.NOT_SYMBOL; } + ; // SQL-2003-R + +NOW_SYMBOL + : N O W { this.type = this.determineFunction(MySQLLexer.NOW_SYMBOL); } + ; + +NO_SYMBOL + : N O + ; // SQL-2003-R + +NO_WAIT_SYMBOL + : N O '_' W A I T + ; + +NO_WRITE_TO_BINLOG_SYMBOL + : N O '_' W R I T E '_' T O '_' B I N L O G + ; + +NULL_SYMBOL + : N U L L + ; // SQL-2003-R + +NUMBER_SYMBOL + : N U M B E R + ; + +NUMERIC_SYMBOL + : N U M E R I C + ; // SQL-2003-R + +NVARCHAR_SYMBOL + : N V A R C H A R + ; + +OFFLINE_SYMBOL + : O F F L I N E + ; + +OFFSET_SYMBOL + : O F F S E T + ; + +ON_SYMBOL + : O N + ; // SQL-2003-R + +ONE_SYMBOL + : O N E + ; + +ONLINE_SYMBOL + : O N L I N E + ; + +ONLY_SYMBOL + : O N L Y + ; + +OPEN_SYMBOL + : O P E N + ; // SQL-2003-R + +OPTIMIZE_SYMBOL + : O P T I M I Z E + ; + +OPTIMIZER_COSTS_SYMBOL + : O P T I M I Z E R '_' C O S T S + ; + +OPTIONS_SYMBOL + : O P T I O N S + ; + +OPTION_SYMBOL + : O P T I O N + ; // SQL-2003-N + +OPTIONALLY_SYMBOL + : O P T I O N A L L Y + ; + +ORDER_SYMBOL + : O R D E R + ; // SQL-2003-R + +OR_SYMBOL + : O R + ; // SQL-2003-R + +OUTER_SYMBOL + : O U T E R + ; + +OUTFILE_SYMBOL + : O U T F I L E + ; + +OUT_SYMBOL + : O U T + ; // SQL-2003-R + +OWNER_SYMBOL + : O W N E R + ; + +PACK_KEYS_SYMBOL + : P A C K '_' K E Y S + ; + +PAGE_SYMBOL + : P A G E + ; + +PARSER_SYMBOL + : P A R S E R + ; + +PARTIAL_SYMBOL + : P A R T I A L + ; // SQL-2003-N + +PARTITIONING_SYMBOL + : P A R T I T I O N I N G + ; + +PARTITIONS_SYMBOL + : P A R T I T I O N S + ; + +PARTITION_SYMBOL + : P A R T I T I O N + ; // SQL-2003-R + +PASSWORD_SYMBOL + : P A S S W O R D + ; + +PHASE_SYMBOL + : P H A S E + ; + +PLUGINS_SYMBOL + : P L U G I N S + ; + +PLUGIN_DIR_SYMBOL + : P L U G I N '_' D I R + ; // Internal + +PLUGIN_SYMBOL + : P L U G I N + ; + +POINT_SYMBOL + : P O I N T + ; + +POLYGON_SYMBOL + : P O L Y G O N + ; // MYSQL + +PORT_SYMBOL + : P O R T + ; + +POSITION_SYMBOL + : P O S I T I O N { this.type = this.determineFunction(MySQLLexer.POSITION_SYMBOL); } + ; // SQL-2003-N + +PRECEDES_SYMBOL + : P R E C E D E S + ; + +PRECISION_SYMBOL + : P R E C I S I O N + ; // SQL-2003-R + +PREPARE_SYMBOL + : P R E P A R E + ; // SQL-2003-R + +PRESERVE_SYMBOL + : P R E S E R V E + ; + +PREV_SYMBOL + : P R E V + ; + +PRIMARY_SYMBOL + : P R I M A R Y + ; // SQL-2003-R + +PRIVILEGES_SYMBOL + : P R I V I L E G E S + ; // SQL-2003-N + +PROCEDURE_SYMBOL + : P R O C E D U R E + ; // SQL-2003-R + +PROCESS_SYMBOL + : P R O C E S S + ; + +PROCESSLIST_SYMBOL + : P R O C E S S L I S T + ; + +PROFILE_SYMBOL + : P R O F I L E + ; + +PROFILES_SYMBOL + : P R O F I L E S + ; + +PROXY_SYMBOL + : P R O X Y + ; + +PURGE_SYMBOL + : P U R G E + ; + +QUARTER_SYMBOL + : Q U A R T E R + ; + +QUERY_SYMBOL + : Q U E R Y + ; + +QUICK_SYMBOL + : Q U I C K + ; + +RANGE_SYMBOL + : R A N G E + ; // SQL-2003-R + +READS_SYMBOL + : R E A D S + ; // SQL-2003-R + +READ_ONLY_SYMBOL + : R E A D '_' O N L Y + ; + +READ_SYMBOL + : R E A D + ; // SQL-2003-N + +READ_WRITE_SYMBOL + : R E A D '_' W R I T E + ; + +REAL_SYMBOL + : R E A L + ; // SQL-2003-R + +REBUILD_SYMBOL + : R E B U I L D + ; + +RECOVER_SYMBOL + : R E C O V E R + ; + +REDO_BUFFER_SIZE_SYMBOL + : R E D O '_' B U F F E R '_' S I Z E + ; + +REDUNDANT_SYMBOL + : R E D U N D A N T + ; + +REFERENCES_SYMBOL + : R E F E R E N C E S + ; // SQL-2003-R + +REGEXP_SYMBOL + : R E G E X P + ; + +RELAY_SYMBOL + : R E L A Y + ; + +RELAYLOG_SYMBOL + : R E L A Y L O G + ; + +RELAY_LOG_FILE_SYMBOL + : R E L A Y '_' L O G '_' F I L E + ; + +RELAY_LOG_POS_SYMBOL + : R E L A Y '_' L O G '_' P O S + ; + +RELAY_THREAD_SYMBOL + : R E L A Y '_' T H R E A D + ; + +RELEASE_SYMBOL + : R E L E A S E + ; // SQL-2003-R + +RELOAD_SYMBOL + : R E L O A D + ; + +REMOVE_SYMBOL + : R E M O V E + ; + +RENAME_SYMBOL + : R E N A M E + ; + +REORGANIZE_SYMBOL + : R E O R G A N I Z E + ; + +REPAIR_SYMBOL + : R E P A I R + ; + +REPEATABLE_SYMBOL + : R E P E A T A B L E + ; // SQL-2003-N + +REPEAT_SYMBOL + : R E P E A T + ; // MYSQL-FUNC + +REPLACE_SYMBOL + : R E P L A C E + ; // MYSQL-FUNC + +REPLICATION_SYMBOL + : R E P L I C A T I O N + ; + +REPLICATE_DO_DB_SYMBOL + : R E P L I C A T E '_' D O '_' D B + ; + +REPLICATE_IGNORE_DB_SYMBOL + : R E P L I C A T E '_' I G N O R E '_' D B + ; + +REPLICATE_DO_TABLE_SYMBOL + : R E P L I C A T E '_' D O '_' T A B L E + ; + +REPLICATE_IGNORE_TABLE_SYMBOL + : R E P L I C A T E '_' I G N O R E '_' T A B L E? + ; + +REPLICATE_WILD_DO_TABLE_SYMBOL + : R E P L I C A T E '_' W I L D '_' D O '_' T A B L E? + ; + +REPLICATE_WILD_IGNORE_TABLE_SYMBOL + : R E P L I C A T E '_' W I L D '_' I G N O R E '_' T A B L E? + ; + +REPLICATE_REWRITE_DB_SYMBOL + : R E P L I C A T E '_' R E W R I T E '_' D B? + ; + +REQUIRE_SYMBOL + : R E Q U I R E + ; + +RESET_SYMBOL + : R E S E T + ; + +RESIGNAL_SYMBOL + : R E S I G N A L + ; // SQL-2003-R + +RESTORE_SYMBOL + : R E S T O R E + ; + +RESTRICT_SYMBOL + : R E S T R I C T + ; + +RESUME_SYMBOL + : R E S U M E + ; + +RETURNED_SQLSTATE_SYMBOL + : R E T U R N E D '_' S Q L S T A T E + ; + +RETURNS_SYMBOL + : R E T U R N S + ; // SQL-2003-R + +RETURN_SYMBOL + : R E T U R N? + ; // SQL-2003-R + +REVERSE_SYMBOL + : R E V E R S E + ; + +REVOKE_SYMBOL + : R E V O K E + ; // SQL-2003-R + +RIGHT_SYMBOL + : R I G H T + ; // SQL-2003-R + +RLIKE_SYMBOL + : R L I K E -> type(REGEXP_SYMBOL) + ; // Synonym (like in mSQL2) + +ROLLBACK_SYMBOL + : R O L L B A C K + ; // SQL-2003-R + +ROLLUP_SYMBOL + : R O L L U P + ; // SQL-2003-R + +ROTATE_SYMBOL + : R O T A T E + ; + +ROUTINE_SYMBOL + : R O U T I N E + ; // SQL-2003-N + +ROWS_SYMBOL + : R O W S + ; // SQL-2003-R + +ROW_COUNT_SYMBOL + : R O W '_' C O U N T + ; + +ROW_FORMAT_SYMBOL + : R O W '_' F O R M A T + ; + +ROW_SYMBOL + : R O W + ; // SQL-2003-R + +RTREE_SYMBOL + : R T R E E + ; + +SAVEPOINT_SYMBOL + : S A V E P O I N T + ; // SQL-2003-R + +SCHEDULE_SYMBOL + : S C H E D U L E + ; + +SCHEMA_SYMBOL + : S C H E M A -> type(DATABASE_SYMBOL) + ; // Synonym + +SCHEMA_NAME_SYMBOL + : S C H E M A '_' N A M E + ; // SQL-2003-N + +SCHEMAS_SYMBOL + : S C H E M A S -> type(DATABASES_SYMBOL) + ; // Synonym + +SECOND_MICROSECOND_SYMBOL + : S E C O N D '_' M I C R O S E C O N D + ; + +SECOND_SYMBOL + : S E C O N D + ; // SQL-2003-R + +SECURITY_SYMBOL + : S E C U R I T Y + ; // SQL-2003-N + +SELECT_SYMBOL + : S E L E C T + ; // SQL-2003-R + +SENSITIVE_SYMBOL + : S E N S I T I V E + ; // FUTURE-USE + +SEPARATOR_SYMBOL + : S E P A R A T O R + ; + +SERIALIZABLE_SYMBOL + : S E R I A L I Z A B L E + ; // SQL-2003-N + +SERIAL_SYMBOL + : S E R I A L + ; + +SESSION_SYMBOL + : S E S S I O N + ; // SQL-2003-N + +SERVER_SYMBOL + : S E R V E R + ; + +SESSION_USER_SYMBOL + : S E S S I O N '_' U S E R { this.type = this.determineFunction(MySQLLexer.USER_SYMBOL); } + ; // Synonym + +SET_SYMBOL + : S E T + ; // SQL-2003-R + +SHARE_SYMBOL + : S H A R E + ; + +SHOW_SYMBOL + : S H O W + ; + +SHUTDOWN_SYMBOL + : S H U T D O W N + ; + +SIGNAL_SYMBOL + : S I G N A L + ; // SQL-2003-R + +SIGNED_SYMBOL + : S I G N E D + ; + +SIMPLE_SYMBOL + : S I M P L E + ; // SQL-2003-N + +SLAVE_SYMBOL + : S L A V E + ; + +SLOW_SYMBOL + : S L O W + ; + +SMALLINT_SYMBOL + : S M A L L I N T + ; // SQL-2003-R + +SNAPSHOT_SYMBOL + : S N A P S H O T + ; + +SOME_SYMBOL + : S O M E -> type(ANY_SYMBOL) + ; // Synonym + +SOCKET_SYMBOL + : S O C K E T + ; + +SONAME_SYMBOL + : S O N A M E + ; + +SOUNDS_SYMBOL + : S O U N D S + ; + +SOURCE_SYMBOL + : S O U R C E + ; + +SPATIAL_SYMBOL + : S P A T I A L + ; + +SPECIFIC_SYMBOL + : S P E C I F I C + ; // SQL-2003-R + +SQLEXCEPTION_SYMBOL + : S Q L E X C E P T I O N + ; // SQL-2003-R + +SQLSTATE_SYMBOL + : S Q L S T A T E + ; // SQL-2003-R + +SQLWARNING_SYMBOL + : S Q L W A R N I N G + ; // SQL-2003-R + +SQL_AFTER_GTIDS_SYMBOL + : S Q L '_' A F T E R '_' G T I D S + ; // MYSQL + +SQL_AFTER_MTS_GAPS_SYMBOL + : S Q L '_' A F T E R '_' M T S '_' G A P S + ; // MYSQL + +SQL_BEFORE_GTIDS_SYMBOL + : S Q L '_' B E F O R E '_' G T I D S + ; // MYSQL + +SQL_BIG_RESULT_SYMBOL + : S Q L '_' B I G '_' R E S U L T + ; + +SQL_BUFFER_RESULT_SYMBOL + : S Q L '_' B U F F E R '_' R E S U L T + ; + +SQL_CALC_FOUND_ROWS_SYMBOL + : S Q L '_' C A L C '_' F O U N D '_' R O W S + ; + +SQL_NO_CACHE_SYMBOL + : S Q L '_' N O '_' C A C H E + ; + +SQL_SMALL_RESULT_SYMBOL + : S Q L '_' S M A L L '_' R E S U L T + ; + +SQL_SYMBOL + : S Q L + ; // SQL-2003-R + +SQL_THREAD_SYMBOL + : S Q L '_' T H R E A D + ; + +SSL_SYMBOL + : S S L + ; + +STACKED_SYMBOL + : S T A C K E D + ; + +STARTING_SYMBOL + : S T A R T I N G + ; + +STARTS_SYMBOL + : S T A R T S + ; + +START_SYMBOL + : S T A R T + ; // SQL-2003-R + +STATS_AUTO_RECALC_SYMBOL + : S T A T S '_' A U T O '_' R E C A L C + ; + +STATS_PERSISTENT_SYMBOL + : S T A T S '_' P E R S I S T E N T + ; + +STATS_SAMPLE_PAGES_SYMBOL + : S T A T S '_' S A M P L E '_' P A G E S + ; + +STATUS_SYMBOL + : S T A T U S + ; + +STDDEV_SAMP_SYMBOL + : S T D D E V '_' S A M P { this.type = this.determineFunction(MySQLLexer.STDDEV_SAMP_SYMBOL); } + ; // SQL-2003-N + +STDDEV_SYMBOL + : S T D D E V { this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); } + ; // Synonym + +STDDEV_POP_SYMBOL + : S T D D E V '_' P O P { this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); } + ; // Synonym + +STD_SYMBOL + : S T D { this.type = this.determineFunction(MySQLLexer.STD_SYMBOL); } + ; + +STOP_SYMBOL + : S T O P + ; + +STORAGE_SYMBOL + : S T O R A G E + ; + +STORED_SYMBOL + : S T O R E D + ; + +STRAIGHT_JOIN_SYMBOL + : S T R A I G H T '_' J O I N + ; + +STRING_SYMBOL + : S T R I N G + ; + +SUBCLASS_ORIGIN_SYMBOL + : S U B C L A S S '_' O R I G I N + ; // SQL-2003-N + +SUBDATE_SYMBOL + : S U B D A T E { this.type = this.determineFunction(MySQLLexer.SUBDATE_SYMBOL); } + ; + +SUBJECT_SYMBOL + : S U B J E C T + ; + +SUBPARTITIONS_SYMBOL + : S U B P A R T I T I O N S + ; + +SUBPARTITION_SYMBOL + : S U B P A R T I T I O N + ; + +SUBSTR_SYMBOL + : S U B S T R { this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + ; // Synonym + +SUBSTRING_SYMBOL + : S U B S T R I N G { this.type = this.determineFunction(MySQLLexer.SUBSTRING_SYMBOL); } + ; // SQL-2003-N + +SUM_SYMBOL + : S U M { this.type = this.determineFunction(MySQLLexer.SUM_SYMBOL); } + ; // SQL-2003-N + +SUPER_SYMBOL + : S U P E R + ; + +SUSPEND_SYMBOL + : S U S P E N D + ; + +SWAPS_SYMBOL + : S W A P S + ; + +SWITCHES_SYMBOL + : S W I T C H E S + ; + +SYSDATE_SYMBOL + : S Y S D A T E { this.type = this.determineFunction(MySQLLexer.SYSDATE_SYMBOL); } + ; + +SYSTEM_USER_SYMBOL + : S Y S T E M '_' U S E R { this.type = this.determineFunction(MySQLLexer.USER_SYMBOL); } + ; + +TABLES_SYMBOL + : T A B L E S + ; + +TABLESPACE_SYMBOL + : T A B L E S P A C E + ; + +TABLE_SYMBOL + : T A B L E + ; // SQL-2003-R + +TABLE_CHECKSUM_SYMBOL + : T A B L E '_' C H E C K S U M + ; + +TABLE_NAME_SYMBOL + : T A B L E '_' N A M E + ; // SQL-2003-N + +TEMPORARY_SYMBOL + : T E M P O R A R Y + ; // SQL-2003-N + +TEMPTABLE_SYMBOL + : T E M P T A B L E + ; + +TERMINATED_SYMBOL + : T E R M I N A T E D + ; + +TEXT_SYMBOL + : T E X T + ; + +THAN_SYMBOL + : T H A N + ; + +THEN_SYMBOL + : T H E N + ; // SQL-2003-R + +TIMESTAMP_SYMBOL + : T I M E S T A M P + ; // SQL-2003-R + +TIMESTAMPADD_SYMBOL + : T I M E S T A M P A D D + ; + +TIMESTAMPDIFF_SYMBOL + : T I M E S T A M P D I F F + ; + +TIME_SYMBOL + : T I M E + ; // SQL-2003-R + +TINYBLOB_SYMBOL + : T I N Y B L O B + ; // MYSQL + +TINYINT_SYMBOL + : T I N Y I N T + ; // MYSQL + +TINYTEXT_SYMBOL + : T I N Y T E X T + ; // MYSQL + +TO_SYMBOL + : T O + ; // SQL-2003-R + +TRAILING_SYMBOL + : T R A I L I N G + ; // SQL-2003-R + +TRANSACTION_SYMBOL + : T R A N S A C T I O N + ; + +TRIGGERS_SYMBOL + : T R I G G E R S + ; + +TRIGGER_SYMBOL + : T R I G G E R + ; // SQL-2003-R + +TRIM_SYMBOL + : T R I M { this.type = this.determineFunction(MySQLLexer.TRIM_SYMBOL); } + ; // SQL-2003-N + +TRUE_SYMBOL + : T R U E + ; // SQL-2003-R + +TRUNCATE_SYMBOL + : T R U N C A T E + ; + +TYPES_SYMBOL + : T Y P E S + ; + +TYPE_SYMBOL + : T Y P E + ; // SQL-2003-N + +UDF_RETURNS_SYMBOL + : U D F '_' R E T U R N S {this.serverVersion < 80031}? + ; + +UNCOMMITTED_SYMBOL + : U N C O M M I T T E D + ; // SQL-2003-N + +UNDEFINED_SYMBOL + : U N D E F I N E D + ; + +UNDOFILE_SYMBOL + : U N D O F I L E + ; + +UNDO_BUFFER_SIZE_SYMBOL + : U N D O '_' B U F F E R '_' S I Z E + ; + +UNDO_SYMBOL + : U N D O + ; // FUTURE-USE + +UNICODE_SYMBOL + : U N I C O D E + ; + +UNINSTALL_SYMBOL + : U N I N S T A L L + ; + +UNION_SYMBOL + : U N I O N + ; // SQL-2003-R + +UNIQUE_SYMBOL + : U N I Q U E + ; + +UNKNOWN_SYMBOL + : U N K N O W N + ; // SQL-2003-R + +UNLOCK_SYMBOL + : U N L O C K + ; + +UNSIGNED_SYMBOL + : U N S I G N E D + ; // MYSQL + +UNTIL_SYMBOL + : U N T I L + ; + +UPDATE_SYMBOL + : U P D A T E + ; // SQL-2003-R + +UPGRADE_SYMBOL + : U P G R A D E + ; + +USAGE_SYMBOL + : U S A G E + ; // SQL-2003-N + +USER_RESOURCES_SYMBOL + : U S E R '_' R E S O U R C E S + ; // Represented only as RESOURCES in server grammar. + +USER_SYMBOL + : U S E R + ; // SQL-2003-R + +USE_FRM_SYMBOL + : U S E '_' F R M + ; + +USE_SYMBOL + : U S E + ; + +USING_SYMBOL + : U S I N G + ; // SQL-2003-R + +UTC_DATE_SYMBOL + : U T C '_' D A T E + ; + +UTC_TIMESTAMP_SYMBOL + : U T C '_' T I M E S T A M P + ; + +UTC_TIME_SYMBOL + : U T C '_' T I M E + ; + +VALIDATION_SYMBOL + : V A L I D A T I O N + ; + +VALUES_SYMBOL + : V A L U E S + ; // SQL-2003-R + +VALUE_SYMBOL + : V A L U E + ; // SQL-2003-R + +VARBINARY_SYMBOL + : V A R B I N A R Y + ; // SQL-2008-R + +VARCHAR_SYMBOL + : V A R C H A R + ; // SQL-2003-R + +VARCHARACTER_SYMBOL + : V A R C H A R A C T E R -> type(VARCHAR_SYMBOL) + ; // Synonym + +VARIABLES_SYMBOL + : V A R I A B L E S + ; + +VARIANCE_SYMBOL + : V A R I A N C E { this.type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); } + ; + +VARYING_SYMBOL + : V A R Y I N G + ; // SQL-2003-R + +VAR_POP_SYMBOL + : V A R '_' P O P { this.type = this.determineFunction(MySQLLexer.VARIANCE_SYMBOL); } + ; // Synonym + +VAR_SAMP_SYMBOL + : V A R '_' S A M P { this.type = this.determineFunction(MySQLLexer.VAR_SAMP_SYMBOL); } + ; + +VIEW_SYMBOL + : V I E W + ; // SQL-2003-N + +VIRTUAL_SYMBOL + : V I R T U A L + ; + +WAIT_SYMBOL + : W A I T + ; + +WARNINGS_SYMBOL + : W A R N I N G S + ; + +WEEK_SYMBOL + : W E E K + ; + +WEIGHT_STRING_SYMBOL + : W E I G H T '_' S T R I N G + ; + +WHEN_SYMBOL + : W H E N + ; // SQL-2003-R + +WHERE_SYMBOL + : W H E R E + ; // SQL-2003-R + +WHILE_SYMBOL + : W H I L E + ; + +WITH_SYMBOL + : W I T H + ; // SQL-2003-R + +WITHOUT_SYMBOL + : W I T H O U T + ; // SQL-2003-R + +WORK_SYMBOL + : W O R K + ; // SQL-2003-N + +WRAPPER_SYMBOL + : W R A P P E R + ; + +WRITE_SYMBOL + : W R I T E + ; // SQL-2003-N + +X509_SYMBOL + : X '509' + ; + +XA_SYMBOL + : X A + ; + +XID_SYMBOL + : X I D + ; + +XML_SYMBOL + : X M L + ; + +XOR_SYMBOL + : X O R + ; + +YEAR_MONTH_SYMBOL + : Y E A R '_' M O N T H + ; + +YEAR_SYMBOL + : Y E A R + ; // SQL-2003-R + +ZEROFILL_SYMBOL + : Z E R O F I L L + ; // MYSQL + +/* + Tokens from MySQL 8.0 +*/ +PERSIST_SYMBOL + : P E R S I S T + ; + +ROLE_SYMBOL + : R O L E + ; // SQL-1999-R + +ADMIN_SYMBOL + : A D M I N + ; // SQL-1999-R + +INVISIBLE_SYMBOL + : I N V I S I B L E + ; + +VISIBLE_SYMBOL + : V I S I B L E + ; + +EXCEPT_SYMBOL + : E X C E P T + ; // SQL-1999-R + +COMPONENT_SYMBOL + : C O M P O N E N T + ; // MYSQL + +RECURSIVE_SYMBOL + : R E C U R S I V E + ; // SQL-1999-R + +JSON_OBJECTAGG_SYMBOL + : J S O N '_' O B J E C T A G G + ; // SQL-2015-R + +JSON_ARRAYAGG_SYMBOL + : J S O N '_' A R R A Y A G G + ; // SQL-2015-R + +OF_SYMBOL + : O F + ; // SQL-1999-R + +SKIP_SYMBOL + : S K I P + ; // MYSQL + +LOCKED_SYMBOL + : L O C K E D + ; // MYSQL + +NOWAIT_SYMBOL + : N O W A I T + ; // MYSQL + +GROUPING_SYMBOL + : G R O U P I N G + ; // SQL-2011-R + +PERSIST_ONLY_SYMBOL + : P E R S I S T '_' O N L Y + ; // MYSQL + +HISTOGRAM_SYMBOL + : H I S T O G R A M + ; // MYSQL + +BUCKETS_SYMBOL + : B U C K E T S + ; // MYSQL + +REMOTE_SYMBOL + : R E M O T E {this.serverVersion < 80014}? + ; // MYSQL + +CLONE_SYMBOL + : C L O N E + ; // MYSQL + +CUME_DIST_SYMBOL + : C U M E '_' D I S T + ; // SQL-2003-R + +DENSE_RANK_SYMBOL + : D E N S E '_' R A N K + ; // SQL-2003-R + +EXCLUDE_SYMBOL + : E X C L U D E + ; // SQL-2003-N + +FIRST_VALUE_SYMBOL + : F I R S T '_' V A L U E + ; // SQL-2011-R + +FOLLOWING_SYMBOL + : F O L L O W I N G + ; // SQL-2003-N + +GROUPS_SYMBOL + : G R O U P S + ; // SQL-2011-R + +LAG_SYMBOL + : L A G + ; // SQL-2011-R + +LAST_VALUE_SYMBOL + : L A S T '_' V A L U E + ; // SQL-2011-R + +LEAD_SYMBOL + : L E A D + ; // SQL-2011-R + +NTH_VALUE_SYMBOL + : N T H '_' V A L U E + ; // SQL-2011-R + +NTILE_SYMBOL + : N T I L E + ; // SQL-2011-R + +NULLS_SYMBOL + : N U L L S + ; // SQL-2003-N + +OTHERS_SYMBOL + : O T H E R S + ; // SQL-2003-N + +OVER_SYMBOL + : O V E R + ; // SQL-2003-R + +PERCENT_RANK_SYMBOL + : P E R C E N T '_' R A N K + ; // SQL-2003-R + +PRECEDING_SYMBOL + : P R E C E D I N G + ; // SQL-2003-N + +RANK_SYMBOL + : R A N K + ; // SQL-2003-R + +RESPECT_SYMBOL + : R E S P E C T + ; // SQL_2011-N + +ROW_NUMBER_SYMBOL + : R O W '_' N U M B E R + ; // SQL-2003-R + +TIES_SYMBOL + : T I E S + ; // SQL-2003-N + +UNBOUNDED_SYMBOL + : U N B O U N D E D + ; // SQL-2003-N + +WINDOW_SYMBOL + : W I N D O W + ; // SQL-2003-R + +EMPTY_SYMBOL + : E M P T Y + ; // SQL-2016-R + +JSON_TABLE_SYMBOL + : J S O N '_' T A B L E + ; // SQL-2016-R + +NESTED_SYMBOL + : N E S T E D + ; // SQL-2016-N + +ORDINALITY_SYMBOL + : O R D I N A L I T Y + ; // SQL-2003-N + +PATH_SYMBOL + : P A T H + ; // SQL-2003-N + +HISTORY_SYMBOL + : H I S T O R Y + ; // MYSQL + +REUSE_SYMBOL + : R E U S E + ; // MYSQL + +SRID_SYMBOL + : S R I D + ; // MYSQL + +THREAD_PRIORITY_SYMBOL + : T H R E A D '_' P R I O R I T Y + ; // MYSQL + +RESOURCE_SYMBOL + : R E S O U R C E + ; // MYSQL + +SYSTEM_SYMBOL + : S Y S T E M + ; // SQL-2003-R + +VCPU_SYMBOL + : V C P U + ; // MYSQL + +MASTER_PUBLIC_KEY_PATH_SYMBOL + : M A S T E R '_' P U B L I C '_' K E Y '_' P A T H + ; // MYSQL + +GET_MASTER_PUBLIC_KEY_SYMBOL + : G E T '_' M A S T E R '_' P U B L I C '_' K E Y '_' S Y M {this.serverVersion < 80024}? + ; // MYSQL + +RESTART_SYMBOL + : R E S T A R T {this.serverVersion >= 80011}? + ; // SQL-2003-N + +DEFINITION_SYMBOL + : D E F I N I T I O N {this.serverVersion >= 80011}? + ; // MYSQL + +DESCRIPTION_SYMBOL + : D E S C R I P T I O N {this.serverVersion >= 80011}? + ; // MYSQL + +ORGANIZATION_SYMBOL + : O R G A N I Z A T I O N {this.serverVersion >= 80011}? + ; // MYSQL + +REFERENCE_SYMBOL + : R E F E R E N C E {this.serverVersion >= 80011}? + ; // MYSQL + +OPTIONAL_SYMBOL + : O P T I O N A L {this.serverVersion >= 80013}? + ; // MYSQL + +SECONDARY_SYMBOL + : S E C O N D A R Y {this.serverVersion >= 80013}? + ; // MYSQL + +SECONDARY_ENGINE_SYMBOL + : S E C O N D A R Y '_' E N G I N E {this.serverVersion >= 80013}? + ; // MYSQL + +SECONDARY_LOAD_SYMBOL + : S E C O N D A R Y '_' L O A D {this.serverVersion >= 80013}? + ; // MYSQL + +SECONDARY_UNLOAD_SYMBOL + : S E C O N D A R Y '_' U N L O A D {this.serverVersion >= 80013}? + ; // MYSQL + +ACTIVE_SYMBOL + : A C T I V E {this.serverVersion >= 80014}? + ; // MYSQL + +INACTIVE_SYMBOL + : I N A C T I V E {this.serverVersion >= 80014}? + ; // MYSQL + +LATERAL_SYMBOL + : L A T E R A L {this.serverVersion >= 80014}? + ; // SQL-2003-R + +RETAIN_SYMBOL + : R E T A I N {this.serverVersion >= 80014}? + ; // MYSQL + +OLD_SYMBOL + : O L D {this.serverVersion >= 80014}? + ; // SQL-2003-R + +NETWORK_NAMESPACE_SYMBOL + : N E T W O R K '_' N A M E S P A C E {this.serverVersion >= 80017}? + ; // MYSQL + +ENFORCED_SYMBOL + : E N F O R C E D {this.serverVersion >= 80017}? + ; // SQL-2003-N + +ARRAY_SYMBOL + : A R R A Y {this.serverVersion >= 80017}? + ; // SQL-2003-R + +OJ_SYMBOL + : O J {this.serverVersion >= 80017}? + ; // ODBC + +MEMBER_SYMBOL + : M E M B E R {this.serverVersion >= 80017}? + ; // SQL-2003-R + +RANDOM_SYMBOL + : R A N D O M {this.serverVersion >= 80018}? + ; // MYSQL + +MASTER_COMPRESSION_ALGORITHM_SYMBOL + : M A S T E R '_' C O M P R E S S I O N '_' A L G O R I T H M {this.serverVersion >= 80018 && this.serverVersion < 80024}? + ; // MYSQL + +MASTER_ZSTD_COMPRESSION_LEVEL_SYMBOL + : M A S T E R '_' Z S T D '_' C O M P R E S S I O N '_' L E V E L {this.serverVersion >= 80018}? + ; // MYSQL + +PRIVILEGE_CHECKS_USER_SYMBOL + : P R I V I L E G E '_' C H E C K S '_' U S E R {this.serverVersion >= 80018}? + ; // MYSQL + +MASTER_TLS_CIPHERSUITES_SYMBOL + : M A S T E R '_' T L S '_' C I P H E R S U I T E S {this.serverVersion >= 80018}? + ; // MYSQL + +REQUIRE_ROW_FORMAT_SYMBOL + : R E Q U I R E '_' R O W '_' F O R M A T {this.serverVersion >= 80019}? + ; // MYSQL + +PASSWORD_LOCK_TIME_SYMBOL + : P A S S W O R D '_' L O C K '_' T I M E {this.serverVersion >= 80019}? + ; // MYSQL + +FAILED_LOGIN_ATTEMPTS_SYMBOL + : F A I L E D '_' L O G I N '_' A T T E M P T S {this.serverVersion >= 80019}? + ; // MYSQL + +REQUIRE_TABLE_PRIMARY_KEY_CHECK_SYMBOL + : R E Q U I R E '_' T A B L E '_' P R I M A R Y '_' K E Y '_' C H E C K {this.serverVersion >= 80019}? + ; // MYSQL + +STREAM_SYMBOL + : S T R E A M {this.serverVersion >= 80019}? + ; // MYSQL + +OFF_SYMBOL + : O F F {this.serverVersion >= 80019}? + ; // SQL-1999-R + +RETURNING_SYMBOL + : R E T U R N I N G {this.serverVersion >= 80024}? + ; // SQL-2016-N + +JSON_VALUE_SYMBOL + : J S O N '_' V A L U E {this.serverVersion >= 80024}? + ; // SQL-2016-R + +TLS_SYMBOL + : T L S {this.serverVersion >= 80024}? + ; // MYSQL + +ATTRIBUTE_SYMBOL + : A T T R I B U T E {this.serverVersion >= 80024}? + ; // SQL-2003-N + +ENGINE_ATTRIBUTE_SYMBOL + : E N G I N E '_' A T T R I B U T E {this.serverVersion >= 80024}? + ; // MYSQL + +SECONDARY_ENGINE_ATTRIBUTE_SYMBOL + : S E C O N D A R Y '_' E N G I N E '_' A T T R I B U T E {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_CONNECTION_AUTO_FAILOVER_SYMBOL + : S O U R C E '_' C O N N E C T I O N '_' A U T O '_' F A I L O V E R {this.serverVersion >= 80024}? + ; // MYSQL + +ZONE_SYMBOL + : Z O N E {this.serverVersion >= 80024}? + ; // SQL-2003-N + +GRAMMAR_SELECTOR_DERIVED_EXPR + : G R A M M A R '_' S E L E C T O R '_' D E R I V E D {this.serverVersion >= 80024}? + ; // synthetic token: starts derived table expressions. + +REPLICA_SYMBOL + : R E P L I C A {this.serverVersion >= 80024}? + ; + +REPLICAS_SYMBOL + : R E P L I C A S {this.serverVersion >= 80024}? + ; + +ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_SYMBOL + : A S S I G N '_' G T I D S '_' T O '_' A N O N Y M O U S '_' T R A N S A C T I O N S {this.serverVersion >= 80024}? + ; // MYSQL + +GET_SOURCE_PUBLIC_KEY_SYMBOL + : G E T '_' S O U R C E '_' P U B L I C '_' K E Y {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_AUTO_POSITION_SYMBOL + : S O U R C E '_' A U T O '_' P O S I T I O N {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_BIND_SYMBOL + : S O U R C E '_' B I N D {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_COMPRESSION_ALGORITHM_SYMBOL + : S O U R C E '_' C O M P R E S S I O N '_' A L G O R I T H M {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_CONNECT_RETRY_SYMBOL + : S O U R C E '_' C O N N E C T '_' R E T R Y {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_DELAY_SYMBOL + : S O U R C E '_' D E L A Y {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_HEARTBEAT_PERIOD_SYMBOL + : S O U R C E '_' H E A R T B E A T '_' P E R I O D {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_HOST_SYMBOL + : S O U R C E '_' H O S T {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_LOG_FILE_SYMBOL + : S O U R C E '_' L O G '_' F I L E {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_LOG_POS_SYMBOL + : S O U R C E '_' L O G '_' P O S {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_PASSWORD_SYMBOL + : S O U R C E '_' P A S S W O R D {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_PORT_SYMBOL + : S O U R C E '_' P O R T {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_PUBLIC_KEY_PATH_SYMBOL + : S O U R C E '_' P U B L I C '_' K E Y '_' P A T H {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_RETRY_COUNT_SYMBOL + : S O U R C E '_' R E T R Y '_' C O U N T {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_SYMBOL + : S O U R C E '_' S S L {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_CA_SYMBOL + : S O U R C E '_' S S L '_' C A {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_CAPATH_SYMBOL + : S O U R C E '_' S S L '_' C A P A T H {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_CERT_SYMBOL + : S O U R C E '_' S S L '_' C E R T {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_CIPHER_SYMBOL + : S O U R C E '_' S S L '_' C I P H E R {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_CRL_SYMBOL + : S O U R C E '_' S S L '_' C R L {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_CRLPATH_SYMBOL + : S O U R C E '_' S S L '_' C R L P A T H {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_KEY_SYMBOL + : S O U R C E '_' S S L '_' C R L P A T H {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_SSL_VERIFY_SERVER_CERT_SYMBOL + : S O U R C E '_' S S L '_' V E R I F Y '_' S E R V E R '_' C E R T {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_TLS_CIPHERSUITES_SYMBOL + : S O U R C E '_' T L S '_' C I P H E R S U I T E S {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_TLS_VERSION_SYMBOL + : S O U R C E '_' T L S '_' V E R S I O N {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_USER_SYMBOL + : S O U R C E '_' U S E R {this.serverVersion >= 80024}? + ; // MYSQL + +SOURCE_ZSTD_COMPRESSION_LEVEL_SYMBOL + : S O U R C E '_' Z S T D '_' C O M P R E S S I O N '_' L E V E L {this.serverVersion >= 80024}? + ; // MYSQL + +ST_COLLECT_SYMBOL + : S T '_' C O L L E C T {this.serverVersion >= 80025}? + ; // MYSQL + +KEYRING_SYMBOL + : K E Y R I N G {this.serverVersion >= 80025}? + ; // MYSQL + +AUTHENTICATION_SYMBOL + : A U T H E N T I C A T I O N {this.serverVersion >= 80027}? + ; // MYSQL + +FACTOR_SYMBOL + : F A C T O R {this.serverVersion >= 80027}? + ; // MYSQL + +FINISH_SYMBOL + : F I N I S H {this.serverVersion >= 80027}? + ; // SQL-2016-N + +INITIATE_SYMBOL + : I N I T I A T E {this.serverVersion >= 80027}? + ; // MYSQL + +REGISTRATION_SYMBOL + : R E G I S T R A T I O N {this.serverVersion >= 80027}? + ; // MYSQL + +UNREGISTER_SYMBOL + : U N R E G I S T E R {this.serverVersion >= 80027}? + ; // MYSQL + +INITIAL_SYMBOL + : I N I T I A L {this.serverVersion >= 80027}? + ; // SQL-2016-R + +CHALLENGE_RESPONSE_SYMBOL + : C H A L L E N G E '_' R E S P O N S E {this.serverVersion >= 80027}? + ; // MYSQL + +GTID_ONLY_SYMBOL + : G T I D '_' O N L Y {this.serverVersion >= 80027}? + ; // MYSQL + +INTERSECT_SYMBOL + : I N T E R S E C T '_' S Y M B O L {this.serverVersion >= 80031}? + ; // SQL-1992-R + +BULK_SYMBOL + : B U L K {this.serverVersion >= 80200}? + ; // MYSQL + +URL_SYMBOL + : U R L {this.serverVersion >= 80200}? + ; // MYSQL + +GENERATE_SYMBOL + : G E N E R A T E {this.serverVersion >= 80032}? + ; // MYSQL + +PARSE_TREE_SYMBOL + : P A R S E '_' T R E E {this.serverVersion >= 80100}? + ; // MYSQL + +LOG_SYMBOL + : L O G {this.serverVersion >= 80032}? + ; // MYSQL + +GTIDS_SYMBOL + : G T I D S {this.serverVersion >= 80032}? + ; // MYSQL + +PARALLEL_SYMBOL + : P A R A L L E L {this.serverVersion >= 80200}? + ; // MYSQL + +S3_SYMBOL + : S '3' {this.serverVersion >= 80200}? + ; // MYSQL + +QUALIFY_SYMBOL + : Q U A L I F Y {this.serverVersion >= 80200}? + ; // MYSQL + +AUTO_SYMBOL + : A U T O {this.serverVersion >= 80200}? + ; // MYSQL + +MANUAL_SYMBOL + : M A N U A L {this.serverVersion >= 80200}? + ; // MYSQL + +BERNOULLI_SYMBOL + : B E R N O U L L I {this.serverVersion >= 80200}? + ; // MYSQL + +TABLESAMPLE_SYMBOL + : T A B L E S A M P L E {this.serverVersion >= 80200}? + ; // MYSQL + +// $antlr-format groupedAlignments on, alignTrailers off, alignLexerCommands on + +// Additional tokens which are mapped to existing tokens. +INT1_SYMBOL + : I N T '1' -> type(TINYINT_SYMBOL) + ; // Synonym + +INT2_SYMBOL + : I N T '2' -> type(SMALLINT_SYMBOL) + ; // Synonym + +INT3_SYMBOL + : I N T '3' -> type(MEDIUMINT_SYMBOL) + ; // Synonym + +INT4_SYMBOL + : I N T '4' -> type(INT_SYMBOL) + ; // Synonym + +INT8_SYMBOL + : I N T '8' -> type(BIGINT_SYMBOL) + ; // Synonym + +SQL_TSI_SECOND_SYMBOL + : S Q L '_' T S I '_' S E C O N D -> type(SECOND_SYMBOL) + ; // Synonym + +SQL_TSI_MINUTE_SYMBOL + : S Q L '_' T S I '_' M I N U T E -> type(MINUTE_SYMBOL) + ; // Synonym + +SQL_TSI_HOUR_SYMBOL + : S Q L '_' T S I '_' H O U R -> type(HOUR_SYMBOL) + ; // Synonym + +SQL_TSI_DAY_SYMBOL + : S Q L '_' T S I '_' D A Y -> type(DAY_SYMBOL) + ; // Synonym + +SQL_TSI_WEEK_SYMBOL + : S Q L '_' T S I '_' W E E K -> type(WEEK_SYMBOL) + ; // Synonym + +SQL_TSI_MONTH_SYMBOL + : S Q L '_' T S I '_' M O N T H -> type(MONTH_SYMBOL) + ; // Synonym + +SQL_TSI_QUARTER_SYMBOL + : S Q L '_' T S I '_' Q U A R T E R -> type(QUARTER_SYMBOL) + ; // Synonym + +SQL_TSI_YEAR_SYMBOL + : S Q L '_' T S I '_' Y E A R -> type(YEAR_SYMBOL) + ; // Synonym + +/* INSERT OTHER KEYWORDS HERE */ + +// White space handling +WHITESPACE + : [ \t\f\r\n]+ -> channel(HIDDEN) + ; // Ignore whitespaces. + +// Input not covered elsewhere (unless quoted). +INVALID_INPUT + : [\u0001-\u0008] // Control codes. + | '\u000B' // Line tabulation. + | '\u000C' // Form feed. + | [\u000E-\u001F] // More control codes. + | '[' + | ']' + ; + +// String and text types. + +// The underscore charset token is used to defined the repertoire of a string, though it conflicts +// with normal identifiers, which also can start with an underscore. +UNDERSCORE_CHARSET + : UNDERLINE_SYMBOL [a-z0-9]+ { this.type = this.checkCharset(this.text); } + ; + +// Identifiers might start with a digit, even though it is discouraged, and may not consist entirely of digits only. +// All keywords above are automatically excluded. +IDENTIFIER + : DIGITS+ [eE] (LETTER_WHEN_UNQUOTED_NO_DIGIT LETTER_WHEN_UNQUOTED*)? + // Have to exclude float pattern, as this rule matches more. + | DIGITS+ LETTER_WITHOUT_FLOAT_PART LETTER_WHEN_UNQUOTED* + | LETTER_WHEN_UNQUOTED_NO_DIGIT LETTER_WHEN_UNQUOTED* + ; // INT_NUMBER matches first if there are only digits. + +NCHAR_TEXT + : [nN] SINGLE_QUOTED_TEXT + ; + +// MySQL supports automatic concatenation of multiple single and double quoted strings if they follow each other as separate +// tokens. This is reflected in the `textLiteral` parser rule. +// Here we handle duplication of quotation chars only (which must be replaced by a single char in the target code). + +fragment BACK_TICK + : '`' + ; + +fragment SINGLE_QUOTE + : '\'' + ; + +fragment DOUBLE_QUOTE + : '"' + ; + +BACK_TICK_QUOTED_ID + : BACK_TICK (({!this.isSqlModeActive(SqlMode.NoBackslashEscapes)}? '\\')? .)*? BACK_TICK + ; + +DOUBLE_QUOTED_TEXT + : ( + DOUBLE_QUOTE (({!this.isSqlModeActive(SqlMode.NoBackslashEscapes)}? '\\')? .)*? DOUBLE_QUOTE + )+ + ; + +SINGLE_QUOTED_TEXT + : ( + SINGLE_QUOTE (({!this.isSqlModeActive(SqlMode.NoBackslashEscapes)}? '\\')? .)*? SINGLE_QUOTE + )+ + ; + +// TODO: check in the semantic phase that starting and ending tags are the same. +DOLLAR_QUOTED_STRING_TEXT + : '$' DOLLAR_QUOTE_TAG_CHAR* '$' .*? '$' DOLLAR_QUOTE_TAG_CHAR* '$' {this.supportMle}? + ; + +// There are 3 types of block comments: +// /* ... */ - The standard multi line comment. +// /*! ... */ - A comment used to mask code for other clients. In MySQL the content is handled as normal code. +// /*!12345 ... */ - Same as the previous one except code is only used when the given number is lower than or equal to +// the current server version (specifying so the minimum server version the code can run with). +VERSION_COMMENT_START + : ('/*!' DIGITS) ( + {this.checkMySQLVersion(this.text)}? // Will set this.inVersionComment if the number matches. + | .*? '*/' + ) -> channel(HIDDEN) + ; + +// this.inVersionComment is a variable in the base lexer. +// TODO: use a lexer mode instead of a member variable. +MYSQL_COMMENT_START + : '/*!' { this.inVersionComment = true; } -> channel(HIDDEN) + ; + +VERSION_COMMENT_END + : '*/' {this.inVersionComment}? { this.inVersionComment = false; } -> channel(HIDDEN) + ; + +BLOCK_COMMENT + : ('/**/' | '/*' ~[!] .*? '*/') -> channel(HIDDEN) + ; + +INVALID_BLOCK_COMMENT + : '/*' ~[*/]* EOF -> channel(HIDDEN) + ; // Not 100% perfect but good enough. + +POUND_COMMENT + : '#' ~([\n\r])* -> channel(HIDDEN) + ; + +DASHDASH_COMMENT + : DOUBLE_DASH ([ \t] (~[\n\r])* | LINEBREAK | EOF) -> channel(HIDDEN) + ; + +fragment DOUBLE_DASH + : '--' + ; + +fragment LINEBREAK + : [\n\r] + ; + +fragment SIMPLE_IDENTIFIER + : (DIGIT | [a-zA-Z_$] | DOT_SYMBOL)+ + ; + +fragment ML_COMMENT_HEAD + : '/*' + ; + +fragment ML_COMMENT_END + : '*/' + ; + +// As defined in https://dev.mysql.com/doc/refman/8.0/en/identifiers.html. +fragment LETTER_WHEN_UNQUOTED + : DIGIT + | LETTER_WHEN_UNQUOTED_NO_DIGIT + ; + +fragment LETTER_WHEN_UNQUOTED_NO_DIGIT + : [a-zA-Z_$\u0080-\uffff] + ; + +fragment DOLLAR_QUOTE_TAG_CHAR + : [0-9a-zA-Z_\u0080-\uffff] + ; + +// Any letter but without e/E and digits (which are used to match a decimal number). +fragment LETTER_WITHOUT_FLOAT_PART + : [a-df-zA-DF-Z_$\u0080-\uffff] + ; diff --git a/sql/mysql/Oracle/original/MySQLParser.g4 b/sql/mysql/Oracle/original/MySQLParser.g4 new file mode 100644 index 0000000000..ad6e2ac7bb --- /dev/null +++ b/sql/mysql/Oracle/original/MySQLParser.g4 @@ -0,0 +1,5661 @@ +parser grammar MySQLParser; + +/* + * Copyright © 2024, Oracle and/or its affiliates + */ + +/* + * Merged in all changes up to mysql-trunk git revision [d2c9971] (24. January 2024). + * + * MySQL grammar for ANTLR 4.5+ with language features from MySQL 8.0 and up. + * The server version in the generated parser can be switched at runtime, making it so possible + * to switch the supported feature set dynamically. + * + * The coverage of the MySQL language should be 100%, but there might still be bugs or omissions. + * + * To use this grammar you will need a few support classes (which should be close to where you found this grammar). + * These classes implement the target specific action code, so we don't clutter the grammar with that + * and make it simpler to adjust it for other targets. See the demo/test project for further details. + * + * Written by Mike Lischke. Direct all bug reports, omissions etc. to mike.lischke@oracle.com. + */ + +//---------------------------------------------------------------------------------------------------------------------- + +// $antlr-format alignTrailingComments on, columnLimit 130, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments off +// $antlr-format useTab off, allowShortRulesOnASingleLine off, allowShortBlocksOnASingleLine on, alignSemicolons hanging +// $antlr-format alignColons hanging + +options { + superClass = MySQLBaseRecognizer; + tokenVocab = MySQLLexer; +} + +@header { +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* eslint-disable no-useless-escape, no-lone-blocks */ + +import { MySQLBaseRecognizer } from "../MySQLBaseRecognizer.js"; +import { SqlMode } from "../MySQLBaseLexer.js"; +} + +//---------------------------------------------------------------------------------------------------------------------- + +query + : ((simpleStatement | beginWork) SEMICOLON_SYMBOL?)? EOF + ; + +simpleStatement + : + // DDL + alterStatement + | createStatement + | dropStatement + | renameTableStatement + | truncateTableStatement + | importStatement + + // DML + | callStatement + | deleteStatement + | doStatement + | handlerStatement + | insertStatement + | loadStatement + | replaceStatement + | selectStatement + | updateStatement + | transactionOrLockingStatement + | replicationStatement + | preparedStatement + + // Data Directory + | cloneStatement + + // Database administration + | accountManagementStatement + | tableAdministrationStatement + | uninstallStatement + | installStatement + | setStatement // SET PASSWORD is handled in accountManagementStatement. + | showDatabasesStatement + | showTablesStatement + | showTriggersStatement + | showEventsStatement + | showTableStatusStatement + | showOpenTablesStatement + | showParseTreeStatement + | showPluginsStatement + | showEngineLogsStatement + | showEngineMutexStatement + | showEngineStatusStatement + | showColumnsStatement + | showBinaryLogsStatement + | showBinaryLogStatusStatement + | showReplicasStatement + | showBinlogEventsStatement + | showRelaylogEventsStatement + | showKeysStatement + | showEnginesStatement + | showCountWarningsStatement + | showCountErrorsStatement + | showWarningsStatement + | showErrorsStatement + | showProfilesStatement + | showProfileStatement + | showStatusStatement + | showProcessListStatement + | showVariablesStatement + | showCharacterSetStatement + | showCollationStatement + | showPrivilegesStatement + | showGrantsStatement + | showCreateDatabaseStatement + | showCreateTableStatement + | showCreateViewStatement + | showMasterStatusStatement + | showReplicaStatusStatement + | showCreateProcedureStatement + | showCreateFunctionStatement + | showCreateTriggerStatement + | showCreateProcedureStatusStatement + | showCreateFunctionStatusStatement + | showCreateProcedureCodeStatement + | showCreateFunctionCodeStatement + | showCreateEventStatement + | showCreateUserStatement + | resourceGroupManagement + | otherAdministrativeStatement + + // MySQL utility statements + | utilityStatement + | getDiagnosticsStatement + | signalStatement + | resignalStatement + ; + +//----------------- DDL statements ------------------------------------------------------------------------------------- + +alterStatement + : ALTER_SYMBOL ( + alterTable + | alterDatabase + | PROCEDURE_SYMBOL procedureRef routineAlterOptions? + | FUNCTION_SYMBOL functionRef routineAlterOptions? + | alterView + | alterEvent + | alterTablespace + | {this.serverVersion >= 80014}? alterUndoTablespace + | alterLogfileGroup + | alterServer + // ALTER USER is part of the user management rule. + | alterInstanceStatement + ) + ; + +alterDatabase + : DATABASE_SYMBOL schemaRef alterDatabaseOption+ + ; + +alterDatabaseOption + : createDatabaseOption + | READ_SYMBOL ONLY_SYMBOL EQUAL_OPERATOR? ternaryOption + ; + +alterEvent + : definerClause? EVENT_SYMBOL eventRef (ON_SYMBOL SCHEDULE_SYMBOL schedule)? ( + ON_SYMBOL COMPLETION_SYMBOL NOT_SYMBOL? PRESERVE_SYMBOL + )? (RENAME_SYMBOL TO_SYMBOL identifier)? ( + ENABLE_SYMBOL + | DISABLE_SYMBOL (ON_SYMBOL replica)? + )? (COMMENT_SYMBOL textLiteral)? (DO_SYMBOL compoundStatement)? + ; + +alterLogfileGroup + : LOGFILE_SYMBOL GROUP_SYMBOL logfileGroupRef ADD_SYMBOL UNDOFILE_SYMBOL textLiteral alterLogfileGroupOptions? + ; + +alterLogfileGroupOptions + : alterLogfileGroupOption (COMMA_SYMBOL? alterLogfileGroupOption)* + ; + +alterLogfileGroupOption + : tsOptionInitialSize + | tsOptionEngine + | tsOptionWait + ; + +alterServer + : SERVER_SYMBOL serverRef serverOptions + ; + +alterTable + : onlineOption? TABLE_SYMBOL tableRef alterTableActions? + ; + +alterTableActions + : alterCommandList (partitionClause | removePartitioning)? + | partitionClause + | removePartitioning + | (alterCommandsModifierList COMMA_SYMBOL)? standaloneAlterCommands + ; + +alterCommandList + : alterCommandsModifierList + | (alterCommandsModifierList COMMA_SYMBOL)? alterList + ; + +alterCommandsModifierList + : alterCommandsModifier (COMMA_SYMBOL alterCommandsModifier)* + ; + +standaloneAlterCommands + : DISCARD_SYMBOL TABLESPACE_SYMBOL + | IMPORT_SYMBOL TABLESPACE_SYMBOL + | alterPartition + | {this.serverVersion >= 80014}? ( + SECONDARY_LOAD_SYMBOL + | SECONDARY_UNLOAD_SYMBOL + ) + ; + +alterPartition + : ADD_SYMBOL PARTITION_SYMBOL noWriteToBinLog? ( + partitionDefinitions + | PARTITIONS_SYMBOL real_ulong_number + ) + | DROP_SYMBOL PARTITION_SYMBOL identifierList + | REBUILD_SYMBOL PARTITION_SYMBOL noWriteToBinLog? allOrPartitionNameList + + // yes, twice "no write to bin log". + | OPTIMIZE_SYMBOL PARTITION_SYMBOL noWriteToBinLog? allOrPartitionNameList noWriteToBinLog? + | ANALYZE_SYMBOL PARTITION_SYMBOL noWriteToBinLog? allOrPartitionNameList + | CHECK_SYMBOL PARTITION_SYMBOL allOrPartitionNameList checkOption* + | REPAIR_SYMBOL PARTITION_SYMBOL noWriteToBinLog? allOrPartitionNameList repairType* + | COALESCE_SYMBOL PARTITION_SYMBOL noWriteToBinLog? real_ulong_number + | TRUNCATE_SYMBOL PARTITION_SYMBOL allOrPartitionNameList + | REORGANIZE_SYMBOL PARTITION_SYMBOL noWriteToBinLog? ( + identifierList INTO_SYMBOL partitionDefinitions + )? + | EXCHANGE_SYMBOL PARTITION_SYMBOL identifier WITH_SYMBOL TABLE_SYMBOL tableRef withValidation? + | DISCARD_SYMBOL PARTITION_SYMBOL allOrPartitionNameList TABLESPACE_SYMBOL + | IMPORT_SYMBOL PARTITION_SYMBOL allOrPartitionNameList TABLESPACE_SYMBOL + ; + +alterList + : (alterListItem | createTableOptionsSpaceSeparated) ( + COMMA_SYMBOL ( + alterListItem + | alterCommandsModifier + | createTableOptionsSpaceSeparated + ) + )* + ; + +alterCommandsModifier + : alterAlgorithmOption + | alterLockOption + | withValidation + ; + +alterListItem + : ADD_SYMBOL COLUMN_SYMBOL? ( + identifier fieldDefinition checkOrReferences? place? + | OPEN_PAR_SYMBOL tableElementList CLOSE_PAR_SYMBOL + ) + | ADD_SYMBOL tableConstraintDef + | CHANGE_SYMBOL COLUMN_SYMBOL? columnInternalRef identifier fieldDefinition place? + | MODIFY_SYMBOL COLUMN_SYMBOL? columnInternalRef fieldDefinition place? + | DROP_SYMBOL ( + COLUMN_SYMBOL? columnInternalRef restrict? + | FOREIGN_SYMBOL KEY_SYMBOL columnInternalRef + | PRIMARY_SYMBOL KEY_SYMBOL + | keyOrIndex indexRef + | {this.serverVersion >= 80017}? CHECK_SYMBOL identifier + | {this.serverVersion >= 80019}? CONSTRAINT_SYMBOL identifier + ) + | DISABLE_SYMBOL KEYS_SYMBOL + | ENABLE_SYMBOL KEYS_SYMBOL + | ALTER_SYMBOL COLUMN_SYMBOL? columnInternalRef ( + SET_SYMBOL DEFAULT_SYMBOL ( + {this.serverVersion >= 80014}? exprWithParentheses + | signedLiteralOrNull + ) + | DROP_SYMBOL DEFAULT_SYMBOL + | {this.serverVersion >= 80024}? SET_SYMBOL visibility + ) + | ALTER_SYMBOL INDEX_SYMBOL indexRef visibility + | {this.serverVersion >= 80017}? ALTER_SYMBOL CHECK_SYMBOL identifier constraintEnforcement + | {this.serverVersion >= 80019}? ALTER_SYMBOL CONSTRAINT_SYMBOL identifier constraintEnforcement + | RENAME_SYMBOL COLUMN_SYMBOL columnInternalRef TO_SYMBOL identifier + | RENAME_SYMBOL (TO_SYMBOL | AS_SYMBOL)? tableName + | RENAME_SYMBOL keyOrIndex indexRef TO_SYMBOL indexName + | CONVERT_SYMBOL TO_SYMBOL charset ( + {this.serverVersion >= 80014}? DEFAULT_SYMBOL + | charsetName + ) collate? + | FORCE_SYMBOL + | ORDER_SYMBOL BY_SYMBOL alterOrderList + ; + +place + : AFTER_SYMBOL identifier + | FIRST_SYMBOL + ; + +restrict + : RESTRICT_SYMBOL + | CASCADE_SYMBOL + ; + +alterOrderList + : identifier direction? (COMMA_SYMBOL identifier direction?)* + ; + +alterAlgorithmOption + : ALGORITHM_SYMBOL EQUAL_OPERATOR? (DEFAULT_SYMBOL | identifier) + ; + +alterLockOption + : LOCK_SYMBOL EQUAL_OPERATOR? (DEFAULT_SYMBOL | identifier) + ; + +indexLockAndAlgorithm + : alterAlgorithmOption alterLockOption? + | alterLockOption alterAlgorithmOption? + ; + +withValidation + : (WITH_SYMBOL | WITHOUT_SYMBOL) VALIDATION_SYMBOL + ; + +removePartitioning + : REMOVE_SYMBOL PARTITIONING_SYMBOL + ; + +allOrPartitionNameList + : ALL_SYMBOL + | identifierList + ; + +alterTablespace + : TABLESPACE_SYMBOL tablespaceRef ( + (ADD_SYMBOL | DROP_SYMBOL) DATAFILE_SYMBOL textLiteral alterTablespaceOptions? + | RENAME_SYMBOL TO_SYMBOL identifier + | {this.serverVersion >= 80014}? alterTablespaceOptions + ) + ; + +alterUndoTablespace + : UNDO_SYMBOL TABLESPACE_SYMBOL tablespaceRef SET_SYMBOL ( + ACTIVE_SYMBOL + | INACTIVE_SYMBOL + ) undoTableSpaceOptions? + ; + +undoTableSpaceOptions + : undoTableSpaceOption (COMMA_SYMBOL? undoTableSpaceOption)* + ; + +undoTableSpaceOption + : tsOptionEngine + ; + +alterTablespaceOptions + : alterTablespaceOption (COMMA_SYMBOL? alterTablespaceOption)* + ; + +alterTablespaceOption + : INITIAL_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + | tsOptionAutoextendSize + | tsOptionMaxSize + | tsOptionEngine + | tsOptionWait + | tsOptionEncryption + | {this.serverVersion >= 80024}? tsOptionEngineAttribute + ; + +changeTablespaceOption + : INITIAL_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + | tsOptionAutoextendSize + | tsOptionMaxSize + ; + +alterView + : viewAlgorithm? definerClause? viewSuid? VIEW_SYMBOL viewRef viewTail + ; + +// This is not the full view_tail from sql_yacc.yy as we have either a view name or a view reference, +// depending on whether we come from createView or alterView. Everything until this difference is duplicated in those rules. +viewTail + : columnInternalRefList? AS_SYMBOL viewQueryBlock + ; + +viewQueryBlock + : queryExpressionWithOptLockingClauses viewCheckOption? + ; + +viewCheckOption + : WITH_SYMBOL (CASCADED_SYMBOL | LOCAL_SYMBOL)? CHECK_SYMBOL OPTION_SYMBOL + ; + +alterInstanceStatement + : INSTANCE_SYMBOL ROTATE_SYMBOL textOrIdentifier MASTER_SYMBOL KEY_SYMBOL + | {this.serverVersion >= 80024}? ( + RELOAD_SYMBOL TLS_SYMBOL ( + NO_SYMBOL ROLLBACK_SYMBOL ON_SYMBOL ERROR_SYMBOL + | FOR_SYMBOL CHANNEL_SYMBOL identifier ( + NO_SYMBOL ROLLBACK_SYMBOL ON_SYMBOL ERROR_SYMBOL + )? + ) + | (ENABLE_SYMBOL | DISABLE_SYMBOL) identifier identifier + | RELOAD_SYMBOL KEYRING_SYMBOL + ) + ; + +//---------------------------------------------------------------------------------------------------------------------- + +createStatement + : CREATE_SYMBOL ( + createDatabase + | createTable + | createFunction + | createProcedure + | createUdf + | createLogfileGroup + | createView + | createTrigger + | createIndex + | createServer + | createTablespace + | createEvent + | createRole + | {this.serverVersion >= 80011}? createSpatialReference + | {this.serverVersion >= 80014}? createUndoTablespace + ) + ; + +createDatabase + : DATABASE_SYMBOL ifNotExists? schemaName createDatabaseOption* + ; + +createDatabaseOption + : defaultCharset + | defaultCollation + | {this.serverVersion >= 80016}? defaultEncryption + ; + +createTable + : TEMPORARY_SYMBOL? TABLE_SYMBOL ifNotExists? tableName ( + (OPEN_PAR_SYMBOL tableElementList CLOSE_PAR_SYMBOL)? createTableOptionsEtc? + | LIKE_SYMBOL tableRef + | OPEN_PAR_SYMBOL LIKE_SYMBOL tableRef CLOSE_PAR_SYMBOL + ) + ; + +tableElementList + : tableElement (COMMA_SYMBOL tableElement)* + ; + +tableElement + : columnDefinition + | tableConstraintDef + ; + +duplicateAsQe + : (REPLACE_SYMBOL | IGNORE_SYMBOL)? asCreateQueryExpression + ; + +asCreateQueryExpression + : AS_SYMBOL? queryExpressionWithOptLockingClauses + ; + +queryExpressionOrParens + : queryExpression lockingClauseList? + | queryExpressionParens + ; + +queryExpressionWithOptLockingClauses + : queryExpression lockingClauseList? + ; + +createRoutine + : // Rule for external use only. + CREATE_SYMBOL (createProcedure | createFunction | createUdf) SEMICOLON_SYMBOL? EOF + ; + +createProcedure + : definerClause? PROCEDURE_SYMBOL ifNotExists? procedureName OPEN_PAR_SYMBOL ( + procedureParameter (COMMA_SYMBOL procedureParameter)* + )? CLOSE_PAR_SYMBOL routineCreateOption* storedRoutineBody + ; + +routineString + : textStringLiteral + | DOLLAR_QUOTED_STRING_TEXT + ; + +storedRoutineBody + : compoundStatement + | {this.serverVersion >= 80032 && this.supportMle}? AS_SYMBOL routineString + ; + +createFunction + : definerClause? FUNCTION_SYMBOL ifNotExists? functionName OPEN_PAR_SYMBOL ( + functionParameter (COMMA_SYMBOL functionParameter)* + )? CLOSE_PAR_SYMBOL RETURNS_SYMBOL typeWithOptCollate routineCreateOption* storedRoutineBody + ; + +createUdf + : AGGREGATE_SYMBOL? FUNCTION_SYMBOL ifNotExists? udfName RETURNS_SYMBOL type = ( + STRING_SYMBOL + | INT_SYMBOL + | REAL_SYMBOL + | DECIMAL_SYMBOL + ) SONAME_SYMBOL textLiteral + ; + +// sp_c_chistic in the server grammar. +routineCreateOption + : routineOption + | NOT_SYMBOL? DETERMINISTIC_SYMBOL + ; + +// sp_a_chistics in the server grammar. +routineAlterOptions + : routineCreateOption+ + ; + +// sp_chistic in the server grammar. +routineOption + : option = COMMENT_SYMBOL textLiteral + | option = LANGUAGE_SYMBOL ( + SQL_SYMBOL + | {this.serverVersion >= 80032}? identifier + ) + | option = NO_SYMBOL SQL_SYMBOL + | option = CONTAINS_SYMBOL SQL_SYMBOL + | option = READS_SYMBOL SQL_SYMBOL DATA_SYMBOL + | option = MODIFIES_SYMBOL SQL_SYMBOL DATA_SYMBOL + | option = SQL_SYMBOL SECURITY_SYMBOL security = ( + DEFINER_SYMBOL + | INVOKER_SYMBOL + ) + ; + +createIndex + : onlineOption? ( + UNIQUE_SYMBOL? type = INDEX_SYMBOL indexName indexTypeClause? createIndexTarget indexOption* + | type = FULLTEXT_SYMBOL INDEX_SYMBOL indexName createIndexTarget fulltextIndexOption* + | type = SPATIAL_SYMBOL INDEX_SYMBOL indexName createIndexTarget spatialIndexOption* + ) indexLockAndAlgorithm? + ; + +indexNameAndType + : indexName + | indexName? USING_SYMBOL indexType + | indexName TYPE_SYMBOL indexType + ; + +createIndexTarget + : ON_SYMBOL tableRef keyListWithExpression + ; + +createLogfileGroup + : LOGFILE_SYMBOL GROUP_SYMBOL logfileGroupName ADD_SYMBOL UNDOFILE_SYMBOL textLiteral logfileGroupOptions? + ; + +logfileGroupOptions + : logfileGroupOption (COMMA_SYMBOL? logfileGroupOption)* + ; + +logfileGroupOption + : tsOptionInitialSize + | tsOptionUndoRedoBufferSize + | tsOptionNodegroup + | tsOptionEngine + | tsOptionWait + | tsOptionComment + ; + +createServer + : SERVER_SYMBOL serverName FOREIGN_SYMBOL DATA_SYMBOL WRAPPER_SYMBOL textOrIdentifier serverOptions + ; + +serverOptions + : OPTIONS_SYMBOL OPEN_PAR_SYMBOL serverOption (COMMA_SYMBOL serverOption)* CLOSE_PAR_SYMBOL + ; + +// Options for CREATE/ALTER SERVER, used for the federated storage engine. +serverOption + : option = HOST_SYMBOL textLiteral + | option = DATABASE_SYMBOL textLiteral + | option = USER_SYMBOL textLiteral + | option = PASSWORD_SYMBOL textLiteral + | option = SOCKET_SYMBOL textLiteral + | option = OWNER_SYMBOL textLiteral + | option = PORT_SYMBOL ulong_number + ; + +createTablespace + : TABLESPACE_SYMBOL tablespaceName tsDataFileName ( + USE_SYMBOL LOGFILE_SYMBOL GROUP_SYMBOL logfileGroupRef + )? tablespaceOptions? + ; + +createUndoTablespace + : UNDO_SYMBOL TABLESPACE_SYMBOL tablespaceName ADD_SYMBOL tsDataFile undoTableSpaceOptions? + ; + +tsDataFileName + : ADD_SYMBOL tsDataFile + | {this.serverVersion >= 80014}? (ADD_SYMBOL tsDataFile)? // now optional + ; + +tsDataFile + : DATAFILE_SYMBOL textLiteral + ; + +tablespaceOptions + : tablespaceOption (COMMA_SYMBOL? tablespaceOption)* + ; + +tablespaceOption + : tsOptionInitialSize + | tsOptionAutoextendSize + | tsOptionMaxSize + | tsOptionExtentSize + | tsOptionNodegroup + | tsOptionEngine + | tsOptionWait + | tsOptionComment + | tsOptionFileblockSize + | {this.serverVersion >= 80014}? tsOptionEncryption + ; + +tsOptionInitialSize + : INITIAL_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + ; + +tsOptionUndoRedoBufferSize + : (UNDO_BUFFER_SIZE_SYMBOL | REDO_BUFFER_SIZE_SYMBOL) EQUAL_OPERATOR? sizeNumber + ; + +tsOptionAutoextendSize + : AUTOEXTEND_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + ; + +tsOptionMaxSize + : MAX_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + ; + +tsOptionExtentSize + : EXTENT_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + ; + +tsOptionNodegroup + : NODEGROUP_SYMBOL EQUAL_OPERATOR? real_ulong_number + ; + +tsOptionEngine + : STORAGE_SYMBOL? ENGINE_SYMBOL EQUAL_OPERATOR? engineRef + ; + +tsOptionWait + : (WAIT_SYMBOL | NO_WAIT_SYMBOL) + ; + +tsOptionComment + : COMMENT_SYMBOL EQUAL_OPERATOR? textLiteral + ; + +tsOptionFileblockSize + : FILE_BLOCK_SIZE_SYMBOL EQUAL_OPERATOR? sizeNumber + ; + +tsOptionEncryption + : ENCRYPTION_SYMBOL EQUAL_OPERATOR? textStringLiteral + ; + +tsOptionEngineAttribute + : ENGINE_SYMBOL EQUAL_OPERATOR? jsonAttribute + ; + +createView + : viewReplaceOrAlgorithm? definerClause? viewSuid? VIEW_SYMBOL viewName viewTail + ; + +viewReplaceOrAlgorithm + : OR_SYMBOL REPLACE_SYMBOL viewAlgorithm? + | viewAlgorithm + ; + +viewAlgorithm + : ALGORITHM_SYMBOL EQUAL_OPERATOR algorithm = ( + UNDEFINED_SYMBOL + | MERGE_SYMBOL + | TEMPTABLE_SYMBOL + ) + ; + +viewSuid + : SQL_SYMBOL SECURITY_SYMBOL (DEFINER_SYMBOL | INVOKER_SYMBOL) + ; + +createTrigger + : definerClause? TRIGGER_SYMBOL ifNotExists? triggerName timing = ( + BEFORE_SYMBOL + | AFTER_SYMBOL + ) event = (INSERT_SYMBOL | UPDATE_SYMBOL | DELETE_SYMBOL) ON_SYMBOL tableRef FOR_SYMBOL EACH_SYMBOL ROW_SYMBOL + triggerFollowsPrecedesClause? compoundStatement + ; + +triggerFollowsPrecedesClause + : ordering = (FOLLOWS_SYMBOL | PRECEDES_SYMBOL) textOrIdentifier // not a trigger reference! + ; + +createEvent + : definerClause? EVENT_SYMBOL ifNotExists? eventName ON_SYMBOL SCHEDULE_SYMBOL schedule ( + ON_SYMBOL COMPLETION_SYMBOL NOT_SYMBOL? PRESERVE_SYMBOL + )? (ENABLE_SYMBOL | DISABLE_SYMBOL (ON_SYMBOL replica)?)? ( + COMMENT_SYMBOL textLiteral + )? DO_SYMBOL compoundStatement + ; + +createRole + : + // The server grammar has a clear_privileges rule here, which is only used to clear internal state. + ROLE_SYMBOL ifNotExists? roleList + ; + +createSpatialReference + : OR_SYMBOL REPLACE_SYMBOL SPATIAL_SYMBOL REFERENCE_SYMBOL SYSTEM_SYMBOL real_ulonglong_number srsAttribute* + | SPATIAL_SYMBOL REFERENCE_SYMBOL SYSTEM_SYMBOL ifNotExists? real_ulonglong_number srsAttribute* + ; + +srsAttribute + : NAME_SYMBOL TEXT_SYMBOL textStringNoLinebreak + | DEFINITION_SYMBOL TEXT_SYMBOL textStringNoLinebreak + | ORGANIZATION_SYMBOL textStringNoLinebreak IDENTIFIED_SYMBOL BY_SYMBOL real_ulonglong_number + | DESCRIPTION_SYMBOL TEXT_SYMBOL textStringNoLinebreak + ; + +//---------------------------------------------------------------------------------------------------------------------- + +dropStatement + : DROP_SYMBOL ( + dropDatabase + | dropEvent + | dropFunction + | dropProcedure + | dropIndex + | dropLogfileGroup + | dropServer + | dropTable + | dropTableSpace + | dropTrigger + | dropView + | dropRole + | {this.serverVersion >= 80011}? dropSpatialReference + | {this.serverVersion >= 80014}? dropUndoTablespace + ) + ; + +dropDatabase + : DATABASE_SYMBOL ifExists? schemaRef + ; + +dropEvent + : EVENT_SYMBOL ifExists? eventRef + ; + +dropFunction + : FUNCTION_SYMBOL ifExists? functionRef // Including UDFs. + ; + +dropProcedure + : PROCEDURE_SYMBOL ifExists? procedureRef + ; + +dropIndex + : onlineOption? type = INDEX_SYMBOL indexRef ON_SYMBOL tableRef indexLockAndAlgorithm? + ; + +dropLogfileGroup + : LOGFILE_SYMBOL GROUP_SYMBOL logfileGroupRef ( + dropLogfileGroupOption (COMMA_SYMBOL? dropLogfileGroupOption)* + )? + ; + +dropLogfileGroupOption + : tsOptionWait + | tsOptionEngine + ; + +dropServer + : SERVER_SYMBOL ifExists? serverRef + ; + +dropTable + : TEMPORARY_SYMBOL? type = (TABLE_SYMBOL | TABLES_SYMBOL) ifExists? tableRefList ( + RESTRICT_SYMBOL + | CASCADE_SYMBOL + )? + ; + +dropTableSpace + : TABLESPACE_SYMBOL tablespaceRef ( + dropLogfileGroupOption (COMMA_SYMBOL? dropLogfileGroupOption)* + )? + ; + +dropTrigger + : TRIGGER_SYMBOL ifExists? triggerRef + ; + +dropView + : VIEW_SYMBOL ifExists? viewRefList (RESTRICT_SYMBOL | CASCADE_SYMBOL)? + ; + +dropRole + : ROLE_SYMBOL ifExists? roleList + ; + +dropSpatialReference + : SPATIAL_SYMBOL REFERENCE_SYMBOL SYSTEM_SYMBOL ifExists? real_ulonglong_number + ; + +dropUndoTablespace + : UNDO_SYMBOL TABLESPACE_SYMBOL tablespaceRef undoTableSpaceOptions? + ; + +//---------------------------------------------------------------------------------------------------------------------- + +renameTableStatement + : RENAME_SYMBOL (TABLE_SYMBOL | TABLES_SYMBOL) renamePair ( + COMMA_SYMBOL renamePair + )* + ; + +renamePair + : tableRef TO_SYMBOL tableName + ; + +//---------------------------------------------------------------------------------------------------------------------- + +truncateTableStatement + : TRUNCATE_SYMBOL TABLE_SYMBOL? tableRef + ; + +//---------------------------------------------------------------------------------------------------------------------- + +importStatement + : IMPORT_SYMBOL TABLE_SYMBOL FROM_SYMBOL textStringLiteralList + ; + +//--------------- DML statements --------------------------------------------------------------------------------------- + +callStatement + : CALL_SYMBOL procedureRef (OPEN_PAR_SYMBOL exprList? CLOSE_PAR_SYMBOL)? + ; + +deleteStatement + : withClause? DELETE_SYMBOL deleteStatementOption* ( + FROM_SYMBOL ( + tableAliasRefList USING_SYMBOL tableReferenceList whereClause? // Multi table variant 1. + | tableRef ({this.serverVersion >= 80017}? tableAlias)? partitionDelete? whereClause? orderClause? simpleLimitClause? + // Single table delete. + ) + | tableAliasRefList FROM_SYMBOL tableReferenceList whereClause? // Multi table variant 2. + ) + ; + +partitionDelete + : PARTITION_SYMBOL OPEN_PAR_SYMBOL identifierList CLOSE_PAR_SYMBOL + ; + +deleteStatementOption + : // opt_delete_option in sql_yacc.yy, but the name collides with another rule (delete_options). + QUICK_SYMBOL + | LOW_PRIORITY_SYMBOL + | QUICK_SYMBOL + | IGNORE_SYMBOL + ; + +doStatement + : DO_SYMBOL selectItemList + ; + +handlerStatement + : HANDLER_SYMBOL ( + tableRef OPEN_SYMBOL tableAlias? + | identifier ( + CLOSE_SYMBOL + | READ_SYMBOL handlerReadOrScan whereClause? limitClause? + ) + ) + ; + +handlerReadOrScan + : (FIRST_SYMBOL | NEXT_SYMBOL) // Scan function. + | identifier ( + // The rkey part. + (FIRST_SYMBOL | NEXT_SYMBOL | PREV_SYMBOL | LAST_SYMBOL) + | ( + EQUAL_OPERATOR + | LESS_THAN_OPERATOR + | GREATER_THAN_OPERATOR + | LESS_OR_EQUAL_OPERATOR + | GREATER_OR_EQUAL_OPERATOR + ) OPEN_PAR_SYMBOL values CLOSE_PAR_SYMBOL + ) + ; + +//---------------------------------------------------------------------------------------------------------------------- + +insertStatement + : INSERT_SYMBOL insertLockOption? IGNORE_SYMBOL? INTO_SYMBOL? tableRef usePartition? ( + insertFromConstructor valuesReference? + | SET_SYMBOL updateList valuesReference? + | insertQueryExpression + ) insertUpdateList? + ; + +insertLockOption + : LOW_PRIORITY_SYMBOL + | DELAYED_SYMBOL // Only allowed if no select is used. Check in the semantic phase. + | HIGH_PRIORITY_SYMBOL + ; + +insertFromConstructor + : (OPEN_PAR_SYMBOL fields? CLOSE_PAR_SYMBOL)? insertValues + ; + +fields + : insertIdentifier (COMMA_SYMBOL insertIdentifier)* + ; + +insertValues + : (VALUES_SYMBOL | VALUE_SYMBOL) valueList + ; + +insertQueryExpression + : queryExpression + | queryExpressionParens + | (OPEN_PAR_SYMBOL fields? CLOSE_PAR_SYMBOL)? queryExpressionWithOptLockingClauses + ; + +valueList + : OPEN_PAR_SYMBOL values? CLOSE_PAR_SYMBOL ( + COMMA_SYMBOL OPEN_PAR_SYMBOL values? CLOSE_PAR_SYMBOL + )* + ; + +values + : (expr | DEFAULT_SYMBOL) (COMMA_SYMBOL (expr | DEFAULT_SYMBOL))* + ; + +valuesReference + : { this.serverVersion >= 80018}? AS_SYMBOL identifier columnInternalRefList? + ; + +insertUpdateList + : ON_SYMBOL DUPLICATE_SYMBOL KEY_SYMBOL UPDATE_SYMBOL updateList + ; + +//---------------------------------------------------------------------------------------------------------------------- + +loadStatement + : LOAD_SYMBOL dataOrXml loadDataLock? loadFrom? LOCAL_SYMBOL? loadSourceType? textStringLiteral sourceCount? sourceOrder? ( + REPLACE_SYMBOL + | IGNORE_SYMBOL + )? INTO_SYMBOL TABLE_SYMBOL tableRef usePartition? charsetClause? xmlRowsIdentifiedBy? fieldsClause? linesClause? + loadDataFileTail loadParallel? loadMemory? loadAlgorithm? + ; + +dataOrXml + : DATA_SYMBOL + | XML_SYMBOL + ; + +loadDataLock + : LOW_PRIORITY_SYMBOL + | CONCURRENT_SYMBOL + ; + +loadFrom + : {this.serverVersion >= 80200}? FROM_SYMBOL + ; + +loadSourceType + : INFILE_SYMBOL + | {this.serverVersion >= 80200}? (URL_SYMBOL | S3_SYMBOL) + ; + +sourceCount + : {this.serverVersion >= 80200}? ( + COUNT_SYMBOL INT_NUMBER + | pureIdentifier INT_NUMBER + ) + ; + +sourceOrder + : {this.serverVersion >= 80200}? IN_SYMBOL PRIMARY_SYMBOL KEY_SYMBOL ORDER_SYMBOL + ; + +xmlRowsIdentifiedBy + : ROWS_SYMBOL IDENTIFIED_SYMBOL BY_SYMBOL textString + ; + +loadDataFileTail + : (IGNORE_SYMBOL INT_NUMBER (LINES_SYMBOL | ROWS_SYMBOL))? loadDataFileTargetList? ( + SET_SYMBOL updateList + )? + ; + +loadDataFileTargetList + : OPEN_PAR_SYMBOL fieldOrVariableList? CLOSE_PAR_SYMBOL + ; + +fieldOrVariableList + : (columnRef | AT_SIGN_SYMBOL textOrIdentifier | AT_AT_SIGN_SYMBOL) ( + COMMA_SYMBOL ( + columnRef + | AT_SIGN_SYMBOL textOrIdentifier + | AT_TEXT_SUFFIX + | AT_AT_SIGN_SYMBOL + ) + )* + ; + +loadAlgorithm + : {this.serverVersion >= 80200}? ALGORITHM_SYMBOL EQUAL_OPERATOR BULK_SYMBOL + ; + +loadParallel + : {this.serverVersion >= 80200}? PARALLEL_SYMBOL EQUAL_OPERATOR INT_NUMBER + ; + +loadMemory + : {this.serverVersion >= 80200}? MEMORY_SYMBOL EQUAL_OPERATOR sizeNumber + ; + +//---------------------------------------------------------------------------------------------------------------------- + +replaceStatement + : REPLACE_SYMBOL (LOW_PRIORITY_SYMBOL | DELAYED_SYMBOL)? INTO_SYMBOL? tableRef usePartition? ( + insertFromConstructor + | SET_SYMBOL updateList + | insertQueryExpression + ) + ; + +//---------------------------------------------------------------------------------------------------------------------- + +selectStatement + : queryExpression lockingClauseList? + | selectStatementWithInto + ; + +selectStatementWithInto + : OPEN_PAR_SYMBOL selectStatementWithInto CLOSE_PAR_SYMBOL + | queryExpression intoClause lockingClauseList? + | queryExpression lockingClauseList intoClause + | {this.serverVersion >= 80024 && this.serverVersion < 80031}? queryExpressionParens intoClause + ; + +queryExpression + : withClause? queryExpressionBody orderClause? limitClause? + ; + +queryExpressionBody + : (queryPrimary | queryExpressionParens) + + // Unlimited UNIONS. + ( + ( + UNION_SYMBOL + | {this.serverVersion >= 80031}? (EXCEPT_SYMBOL | INTERSECT_SYMBOL) + ) unionOption? queryExpressionBody + )* + ; + +queryExpressionParens + : OPEN_PAR_SYMBOL (queryExpressionParens | queryExpressionWithOptLockingClauses) CLOSE_PAR_SYMBOL + ; + +queryPrimary + : querySpecification + | {this.serverVersion >= 80019}? tableValueConstructor + | {this.serverVersion >= 80019}? explicitTable + ; + +querySpecification + : SELECT_SYMBOL selectOption* selectItemList intoClause? fromClause? whereClause? groupByClause? havingClause? windowClause? + qualifyClause? + ; + +subquery + : queryExpressionParens + ; + +querySpecOption + : ALL_SYMBOL + | DISTINCT_SYMBOL + | STRAIGHT_JOIN_SYMBOL + | HIGH_PRIORITY_SYMBOL + | SQL_SMALL_RESULT_SYMBOL + | SQL_BIG_RESULT_SYMBOL + | SQL_BUFFER_RESULT_SYMBOL + | SQL_CALC_FOUND_ROWS_SYMBOL + ; + +limitClause + : LIMIT_SYMBOL limitOptions + ; + +simpleLimitClause + : LIMIT_SYMBOL limitOption + ; + +limitOptions + : limitOption ((COMMA_SYMBOL | OFFSET_SYMBOL) limitOption)? + ; + +limitOption + : identifier + | (PARAM_MARKER | ULONGLONG_NUMBER | LONG_NUMBER | INT_NUMBER) + ; + +intoClause + : INTO_SYMBOL ( + OUTFILE_SYMBOL textStringLiteral charsetClause? fieldsClause? linesClause? + | DUMPFILE_SYMBOL textStringLiteral + | (textOrIdentifier | userVariable) ( + COMMA_SYMBOL (textOrIdentifier | userVariable) + )* + ) + ; + +procedureAnalyseClause + : PROCEDURE_SYMBOL OPEN_PAR_SYMBOL (INT_NUMBER (COMMA_SYMBOL INT_NUMBER)?)? CLOSE_PAR_SYMBOL + ; + +havingClause + : HAVING_SYMBOL expr + ; + +qualifyClause + : {this.serverVersion >= 80200}? QUALIFY_SYMBOL expr + ; + +windowClause + : WINDOW_SYMBOL windowDefinition (COMMA_SYMBOL windowDefinition)* + ; + +windowDefinition + : windowName AS_SYMBOL windowSpec + ; + +windowSpec + : OPEN_PAR_SYMBOL windowSpecDetails CLOSE_PAR_SYMBOL + ; + +windowSpecDetails + : windowName? (PARTITION_SYMBOL BY_SYMBOL orderList)? orderClause? windowFrameClause? + ; + +windowFrameClause + : windowFrameUnits windowFrameExtent windowFrameExclusion? + ; + +windowFrameUnits + : ROWS_SYMBOL + | RANGE_SYMBOL + | GROUPS_SYMBOL + ; + +windowFrameExtent + : windowFrameStart + | windowFrameBetween + ; + +windowFrameStart + : UNBOUNDED_SYMBOL PRECEDING_SYMBOL + | ulonglongNumber PRECEDING_SYMBOL + | PARAM_MARKER PRECEDING_SYMBOL + | INTERVAL_SYMBOL expr interval PRECEDING_SYMBOL + | CURRENT_SYMBOL ROW_SYMBOL + ; + +windowFrameBetween + : BETWEEN_SYMBOL windowFrameBound AND_SYMBOL windowFrameBound + ; + +windowFrameBound + : windowFrameStart + | UNBOUNDED_SYMBOL FOLLOWING_SYMBOL + | ulonglongNumber FOLLOWING_SYMBOL + | PARAM_MARKER FOLLOWING_SYMBOL + | INTERVAL_SYMBOL expr interval FOLLOWING_SYMBOL + ; + +windowFrameExclusion + : EXCLUDE_SYMBOL ( + CURRENT_SYMBOL ROW_SYMBOL + | GROUP_SYMBOL + | TIES_SYMBOL + | NO_SYMBOL OTHERS_SYMBOL + ) + ; + +withClause + : WITH_SYMBOL RECURSIVE_SYMBOL? commonTableExpression ( + COMMA_SYMBOL commonTableExpression + )* + ; + +commonTableExpression + : identifier columnInternalRefList? AS_SYMBOL subquery + ; + +groupByClause + : GROUP_SYMBOL BY_SYMBOL orderList olapOption? + | {this.serverVersion >= 80032}? GROUP_SYMBOL BY_SYMBOL ( + ROLLUP_SYMBOL + | CUBE_SYMBOL + ) OPEN_PAR_SYMBOL groupList CLOSE_PAR_SYMBOL + ; + +olapOption + : WITH_SYMBOL ROLLUP_SYMBOL + ; + +orderClause + : ORDER_SYMBOL BY_SYMBOL orderList + ; + +direction + : ASC_SYMBOL + | DESC_SYMBOL + ; + +fromClause + : FROM_SYMBOL (DUAL_SYMBOL | tableReferenceList) + ; + +tableReferenceList + : tableReference (COMMA_SYMBOL tableReference)* + ; + +tableValueConstructor + : VALUES_SYMBOL rowValueExplicit (COMMA_SYMBOL rowValueExplicit)* + ; + +explicitTable + : TABLE_SYMBOL tableRef + ; + +rowValueExplicit + : ROW_SYMBOL OPEN_PAR_SYMBOL values? CLOSE_PAR_SYMBOL + ; + +selectOption + : querySpecOption + | SQL_NO_CACHE_SYMBOL // Deprecated and ignored in 8.0. + ; + +lockingClauseList + : {this.serverVersion >= 80031}? lockingClause+ + ; + +lockingClause + : FOR_SYMBOL lockStrengh (OF_SYMBOL tableAliasRefList)? lockedRowAction? + | LOCK_SYMBOL IN_SYMBOL SHARE_SYMBOL MODE_SYMBOL + ; + +lockStrengh + : UPDATE_SYMBOL + | SHARE_SYMBOL + ; + +lockedRowAction + : SKIP_SYMBOL LOCKED_SYMBOL + | NOWAIT_SYMBOL + ; + +selectItemList + : (selectItem | MULT_OPERATOR) (COMMA_SYMBOL selectItem)* + ; + +selectItem + : tableWild + | expr selectAlias? + ; + +selectAlias + : AS_SYMBOL? (identifier | textStringLiteral) + ; + +whereClause + : WHERE_SYMBOL expr + ; + +tableReference + : // Note: we have also a tableRef rule for identifiers that reference a table anywhere. + ( + tableFactor + // ODBC syntax + | OPEN_CURLY_SYMBOL ({this.serverVersion < 80017}? identifier | OJ_SYMBOL) escapedTableReference CLOSE_CURLY_SYMBOL + ) joinedTable* + ; + +escapedTableReference + : tableFactor joinedTable* + ; + +joinedTable + : // Same as joined_table in sql_yacc.yy, but with removed left recursion. + innerJoinType tableReference ( + ON_SYMBOL expr + | USING_SYMBOL identifierListWithParentheses + )? + | outerJoinType tableReference ( + ON_SYMBOL expr + | USING_SYMBOL identifierListWithParentheses + ) + | naturalJoinType tableFactor + ; + +naturalJoinType + : NATURAL_SYMBOL INNER_SYMBOL? JOIN_SYMBOL + | NATURAL_SYMBOL (LEFT_SYMBOL | RIGHT_SYMBOL) OUTER_SYMBOL? JOIN_SYMBOL + ; + +innerJoinType + : type = (INNER_SYMBOL | CROSS_SYMBOL)? JOIN_SYMBOL + | type = STRAIGHT_JOIN_SYMBOL + ; + +outerJoinType + : type = (LEFT_SYMBOL | RIGHT_SYMBOL) OUTER_SYMBOL? JOIN_SYMBOL + ; + +tableFactor + : singleTable + | singleTableParens + | derivedTable + | tableReferenceListParens + | {this.serverVersion >= 80004}? tableFunction + ; + +singleTable + : tableRef usePartition? tableAlias? indexHintList? tablesampleClause? + ; + +singleTableParens + : OPEN_PAR_SYMBOL (singleTable | singleTableParens) CLOSE_PAR_SYMBOL + ; + +derivedTable + : subquery tableAlias? columnInternalRefList? + | {this.serverVersion >= 80014}? LATERAL_SYMBOL subquery tableAlias? columnInternalRefList? + ; + +// This rule covers both: joined_table_parens and table_reference_list_parens from sql_yacc.yy. +// We can simplify that because we have unrolled the indirect left recursion in joined_table <-> table_reference. +tableReferenceListParens + : OPEN_PAR_SYMBOL (tableReferenceList | tableReferenceListParens) CLOSE_PAR_SYMBOL + ; + +tableFunction + : JSON_TABLE_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL textStringLiteral columnsClause CLOSE_PAR_SYMBOL tableAlias? + ; + +columnsClause + : COLUMNS_SYMBOL OPEN_PAR_SYMBOL jtColumn (COMMA_SYMBOL jtColumn)* CLOSE_PAR_SYMBOL + ; + +jtColumn + : identifier FOR_SYMBOL ORDINALITY_SYMBOL + | identifier dataType ({this.serverVersion >= 80014}? collate)? EXISTS_SYMBOL? PATH_SYMBOL textStringLiteral + onEmptyOrErrorJsonTable? + | NESTED_SYMBOL PATH_SYMBOL textStringLiteral columnsClause + ; + +onEmptyOrError + : onEmpty onError? + | onError + ; + +// One variation of the empty/error syntax that is going to be deprecated, but currently still allowed. +onEmptyOrErrorJsonTable + : onEmptyOrError + | onError onEmpty + ; + +onEmpty + : jsonOnResponse ON_SYMBOL EMPTY_SYMBOL + ; + +onError + : jsonOnResponse ON_SYMBOL ERROR_SYMBOL + ; + +jsonOnResponse + : ERROR_SYMBOL + | NULL_SYMBOL + | DEFAULT_SYMBOL textStringLiteral + ; + +unionOption + : DISTINCT_SYMBOL + | ALL_SYMBOL + ; + +tableAlias + : (AS_SYMBOL | {this.serverVersion < 80017}? EQUAL_OPERATOR)? identifier + ; + +indexHintList + : indexHint (COMMA_SYMBOL indexHint)* + ; + +indexHint + : indexHintType keyOrIndex indexHintClause? OPEN_PAR_SYMBOL indexList CLOSE_PAR_SYMBOL + | USE_SYMBOL keyOrIndex indexHintClause? OPEN_PAR_SYMBOL indexList? CLOSE_PAR_SYMBOL + ; + +indexHintType + : FORCE_SYMBOL + | IGNORE_SYMBOL + ; + +keyOrIndex + : KEY_SYMBOL + | INDEX_SYMBOL + ; + +constraintKeyType + : PRIMARY_SYMBOL KEY_SYMBOL + | UNIQUE_SYMBOL keyOrIndex? + ; + +indexHintClause + : FOR_SYMBOL (JOIN_SYMBOL | ORDER_SYMBOL BY_SYMBOL | GROUP_SYMBOL BY_SYMBOL) + ; + +indexList + : indexListElement (COMMA_SYMBOL indexListElement)* + ; + +indexListElement + : identifier + | PRIMARY_SYMBOL + ; + +//---------------------------------------------------------------------------------------------------------------------- + +updateStatement + : withClause? UPDATE_SYMBOL LOW_PRIORITY_SYMBOL? IGNORE_SYMBOL? tableReferenceList SET_SYMBOL updateList whereClause? + orderClause? simpleLimitClause? + ; + +//---------------------------------------------------------------------------------------------------------------------- + +transactionOrLockingStatement + : transactionStatement + | savepointStatement + | lockStatement + | xaStatement + ; + +transactionStatement + : START_SYMBOL TRANSACTION_SYMBOL startTransactionOptionList* + | COMMIT_SYMBOL WORK_SYMBOL? (AND_SYMBOL NO_SYMBOL? CHAIN_SYMBOL)? ( + NO_SYMBOL? RELEASE_SYMBOL + )? + // SET TRANSACTION is part of setStatement. + ; + +// BEGIN WORK is separated from transactional statements as it must not appear as part of a stored program. +beginWork + : BEGIN_SYMBOL WORK_SYMBOL? + ; + +startTransactionOptionList + : WITH_SYMBOL CONSISTENT_SYMBOL SNAPSHOT_SYMBOL + | READ_SYMBOL (WRITE_SYMBOL | ONLY_SYMBOL) + ; + +savepointStatement + : SAVEPOINT_SYMBOL identifier + | ROLLBACK_SYMBOL WORK_SYMBOL? ( + TO_SYMBOL SAVEPOINT_SYMBOL? identifier + | (AND_SYMBOL NO_SYMBOL? CHAIN_SYMBOL)? (NO_SYMBOL? RELEASE_SYMBOL)? + ) + | RELEASE_SYMBOL SAVEPOINT_SYMBOL identifier + ; + +lockStatement + : LOCK_SYMBOL (TABLES_SYMBOL | TABLE_SYMBOL) lockItem (COMMA_SYMBOL lockItem)* + | LOCK_SYMBOL INSTANCE_SYMBOL FOR_SYMBOL BACKUP_SYMBOL + | UNLOCK_SYMBOL ( TABLES_SYMBOL | TABLE_SYMBOL | INSTANCE_SYMBOL) + ; + +lockItem + : tableRef tableAlias? lockOption + ; + +lockOption + : READ_SYMBOL LOCAL_SYMBOL? + | LOW_PRIORITY_SYMBOL? WRITE_SYMBOL // low priority deprecated since 5.7 + ; + +xaStatement + : XA_SYMBOL ( + (START_SYMBOL | BEGIN_SYMBOL) xid (JOIN_SYMBOL | RESUME_SYMBOL)? + | END_SYMBOL xid (SUSPEND_SYMBOL (FOR_SYMBOL MIGRATE_SYMBOL)?)? + | PREPARE_SYMBOL xid + | COMMIT_SYMBOL xid (ONE_SYMBOL PHASE_SYMBOL)? + | ROLLBACK_SYMBOL xid + | RECOVER_SYMBOL xaConvert? + ) + ; + +xaConvert + : CONVERT_SYMBOL XID_SYMBOL + ; + +xid + : textString (COMMA_SYMBOL textString (COMMA_SYMBOL ulong_number)?)? + ; + +//---------------------------------------------------------------------------------------------------------------------- + +replicationStatement + : PURGE_SYMBOL purgeOptions + | changeSource + | RESET_SYMBOL resetOption (COMMA_SYMBOL resetOption)* + | RESET_SYMBOL PERSIST_SYMBOL ifExistsIdentifier? + | startReplicaStatement + | stopReplicaStatement + | changeReplication + | replicationLoad + | groupReplication + ; + +purgeOptions + : (BINARY_SYMBOL | MASTER_SYMBOL) LOGS_SYMBOL ( + TO_SYMBOL textLiteral + | BEFORE_SYMBOL expr + ) + ; + +resetOption + : masterOrBinaryLogsAndGtids sourceResetOptions? + | replica ALL_SYMBOL? channel? + ; + +masterOrBinaryLogsAndGtids + : MASTER_SYMBOL + | {this.serverVersion >= 80032}? BINARY_SYMBOL LOGS_SYMBOL AND_SYMBOL GTIDS_SYMBOL + ; + +sourceResetOptions + : TO_SYMBOL real_ulonglong_number + ; + +replicationLoad + : LOAD_SYMBOL (DATA_SYMBOL | TABLE_SYMBOL tableRef) FROM_SYMBOL MASTER_SYMBOL + ; + +changeReplicationSource + : MASTER_SYMBOL + | {this.serverVersion >= 80024}? REPLICATION_SYMBOL SOURCE_SYMBOL + ; + +changeSource + : CHANGE_SYMBOL changeReplicationSource TO_SYMBOL sourceDefinitions channel? + ; + +sourceDefinitions + : sourceDefinition (COMMA_SYMBOL sourceDefinition)* + ; + +sourceDefinition + : // source_def in sql_yacc.yy + changeReplicationSourceHost EQUAL_OPERATOR textStringNoLinebreak + | NETWORK_NAMESPACE_SYMBOL EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceBind EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceUser EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourcePassword EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourcePort EQUAL_OPERATOR ulong_number + | changeReplicationSourceConnectRetry EQUAL_OPERATOR ulong_number + | changeReplicationSourceRetryCount EQUAL_OPERATOR ulong_number + | changeReplicationSourceDelay EQUAL_OPERATOR ulong_number + | changeReplicationSourceSSL EQUAL_OPERATOR ulong_number + | changeReplicationSourceSSLCA EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceSSLCApath EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceTLSVersion EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceSSLCert EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceTLSCiphersuites EQUAL_OPERATOR sourceTlsCiphersuitesDef + | changeReplicationSourceSSLCipher EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceSSLKey EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceSSLVerifyServerCert EQUAL_OPERATOR ulong_number + | changeReplicationSourceSSLCLR EQUAL_OPERATOR textLiteral + | changeReplicationSourceSSLCLRpath EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourcePublicKey EQUAL_OPERATOR textStringNoLinebreak + | changeReplicationSourceGetSourcePublicKey EQUAL_OPERATOR ulong_number + | changeReplicationSourceHeartbeatPeriod EQUAL_OPERATOR ulong_number + | IGNORE_SERVER_IDS_SYMBOL EQUAL_OPERATOR serverIdList + | changeReplicationSourceCompressionAlgorithm EQUAL_OPERATOR textStringLiteral + | changeReplicationSourceZstdCompressionLevel EQUAL_OPERATOR ulong_number + | changeReplicationSourceAutoPosition EQUAL_OPERATOR ulong_number + | PRIVILEGE_CHECKS_USER_SYMBOL EQUAL_OPERATOR privilegeCheckDef + | REQUIRE_ROW_FORMAT_SYMBOL EQUAL_OPERATOR ulong_number + | REQUIRE_TABLE_PRIMARY_KEY_CHECK_SYMBOL EQUAL_OPERATOR tablePrimaryKeyCheckDef + | {this.serverVersion >= 80024}? SOURCE_CONNECTION_AUTO_FAILOVER_SYMBOL EQUAL_OPERATOR real_ulong_number + | {this.serverVersion >= 80024}? ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_SYMBOL EQUAL_OPERATOR + assignGtidsToAnonymousTransactionsDefinition + | {this.serverVersion >= 80027}? GTID_ONLY_SYMBOL EQUAL_OPERATOR real_ulong_number + | sourceFileDef + ; + +changeReplicationSourceAutoPosition + : MASTER_AUTO_POSITION_SYMBOL + | SOURCE_AUTO_POSITION_SYMBOL + ; + +changeReplicationSourceHost + : MASTER_HOST_SYMBOL + | SOURCE_HOST_SYMBOL + ; + +changeReplicationSourceBind + : MASTER_BIND_SYMBOL + | SOURCE_BIND_SYMBOL + ; + +changeReplicationSourceUser + : MASTER_USER_SYMBOL + | SOURCE_USER_SYMBOL + ; + +changeReplicationSourcePassword + : MASTER_PASSWORD_SYMBOL + | SOURCE_PASSWORD_SYMBOL + ; + +changeReplicationSourcePort + : MASTER_PORT_SYMBOL + | SOURCE_PORT_SYMBOL + ; + +changeReplicationSourceConnectRetry + : MASTER_CONNECT_RETRY_SYMBOL + | SOURCE_CONNECT_RETRY_SYMBOL + ; + +changeReplicationSourceRetryCount + : MASTER_RETRY_COUNT_SYMBOL + | SOURCE_RETRY_COUNT_SYMBOL + ; + +changeReplicationSourceDelay + : MASTER_DELAY_SYMBOL + | SOURCE_DELAY_SYMBOL + ; + +changeReplicationSourceSSL + : MASTER_SSL_SYMBOL + | SOURCE_SSL_SYMBOL + ; + +changeReplicationSourceSSLCA + : MASTER_SSL_CA_SYMBOL + | SOURCE_SSL_CA_SYMBOL + ; + +changeReplicationSourceSSLCApath + : MASTER_SSL_CAPATH_SYMBOL + | SOURCE_SSL_CAPATH_SYMBOL + ; + +changeReplicationSourceSSLCipher + : MASTER_SSL_CIPHER_SYMBOL + | SOURCE_SSL_CIPHER_SYMBOL + ; + +changeReplicationSourceSSLCLR + : MASTER_SSL_CRL_SYMBOL + | SOURCE_SSL_CRL_SYMBOL + ; + +changeReplicationSourceSSLCLRpath + : MASTER_SSL_CRLPATH_SYMBOL + | SOURCE_SSL_CRLPATH_SYMBOL + ; + +changeReplicationSourceSSLKey + : MASTER_SSL_KEY_SYMBOL + | SOURCE_SSL_KEY_SYMBOL + ; + +changeReplicationSourceSSLVerifyServerCert + : MASTER_SSL_VERIFY_SERVER_CERT_SYMBOL + | SOURCE_SSL_VERIFY_SERVER_CERT_SYMBOL + ; + +changeReplicationSourceTLSVersion + : MASTER_TLS_VERSION_SYMBOL + | SOURCE_TLS_VERSION_SYMBOL + ; + +changeReplicationSourceTLSCiphersuites + : MASTER_TLS_CIPHERSUITES_SYMBOL + | SOURCE_TLS_CIPHERSUITES_SYMBOL + ; + +changeReplicationSourceSSLCert + : MASTER_SSL_CERT_SYMBOL + | SOURCE_SSL_CERT_SYMBOL + ; + +changeReplicationSourcePublicKey + : MASTER_PUBLIC_KEY_PATH_SYMBOL + | SOURCE_PUBLIC_KEY_PATH_SYMBOL + ; + +changeReplicationSourceGetSourcePublicKey + : GET_MASTER_PUBLIC_KEY_SYMBOL + | GET_SOURCE_PUBLIC_KEY_SYMBOL + ; + +changeReplicationSourceHeartbeatPeriod + : MASTER_HEARTBEAT_PERIOD_SYMBOL + | SOURCE_HEARTBEAT_PERIOD_SYMBOL + ; + +changeReplicationSourceCompressionAlgorithm + : MASTER_COMPRESSION_ALGORITHM_SYMBOL + | SOURCE_COMPRESSION_ALGORITHM_SYMBOL + ; + +changeReplicationSourceZstdCompressionLevel + : MASTER_ZSTD_COMPRESSION_LEVEL_SYMBOL + | SOURCE_ZSTD_COMPRESSION_LEVEL_SYMBOL + ; + +privilegeCheckDef + : userIdentifierOrText + | NULL_SYMBOL + ; + +tablePrimaryKeyCheckDef + : STREAM_SYMBOL + | ON_SYMBOL + | OFF_SYMBOL + | GENERATE_SYMBOL + ; + +assignGtidsToAnonymousTransactionsDefinition + : OFF_SYMBOL + | LOCAL_SYMBOL + | textStringLiteral + ; + +sourceTlsCiphersuitesDef + : textStringNoLinebreak + | NULL_SYMBOL + ; + +sourceFileDef + : sourceLogFile EQUAL_OPERATOR textStringNoLinebreak + | sourceLogPos EQUAL_OPERATOR ulonglongNumber + | RELAY_LOG_FILE_SYMBOL EQUAL_OPERATOR textStringNoLinebreak + | RELAY_LOG_POS_SYMBOL EQUAL_OPERATOR ulong_number + ; + +sourceLogFile + : MASTER_LOG_FILE_SYMBOL + | SOURCE_LOG_FILE_SYMBOL + ; + +sourceLogPos + : MASTER_LOG_POS_SYMBOL + | SOURCE_LOG_POS_SYMBOL + ; + +serverIdList + : OPEN_PAR_SYMBOL (ulong_number (COMMA_SYMBOL ulong_number)*)? CLOSE_PAR_SYMBOL + ; + +changeReplication + : CHANGE_SYMBOL REPLICATION_SYMBOL FILTER_SYMBOL filterDefinition ( + COMMA_SYMBOL filterDefinition + )* channel? + ; + +filterDefinition + : REPLICATE_DO_DB_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterDbList? CLOSE_PAR_SYMBOL + | REPLICATE_IGNORE_DB_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterDbList? CLOSE_PAR_SYMBOL + | REPLICATE_DO_TABLE_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterTableList? CLOSE_PAR_SYMBOL + | REPLICATE_IGNORE_TABLE_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterTableList? CLOSE_PAR_SYMBOL + | REPLICATE_WILD_DO_TABLE_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterStringList? CLOSE_PAR_SYMBOL + | REPLICATE_WILD_IGNORE_TABLE_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterStringList? CLOSE_PAR_SYMBOL + | REPLICATE_REWRITE_DB_SYMBOL EQUAL_OPERATOR OPEN_PAR_SYMBOL filterDbPairList? CLOSE_PAR_SYMBOL + ; + +filterDbList + : schemaRef (COMMA_SYMBOL schemaRef)* + ; + +filterTableList + : filterTableRef (COMMA_SYMBOL filterTableRef)* + ; + +filterStringList + : filterWildDbTableString (COMMA_SYMBOL filterWildDbTableString)* + ; + +filterWildDbTableString + : textStringNoLinebreak // sql_yacc.yy checks for the existance of at least one dot char in the string. + ; + +filterDbPairList + : schemaIdentifierPair (COMMA_SYMBOL schemaIdentifierPair)* + ; + +startReplicaStatement + : START_SYMBOL replica replicaThreadOptions? (UNTIL_SYMBOL replicaUntil)? userOption? passwordOption? defaultAuthOption? + pluginDirOption? channel? + ; + +stopReplicaStatement + : STOP_SYMBOL replica replicaThreadOptions? channel? + ; + +replicaUntil + : ( + sourceFileDef + | (SQL_BEFORE_GTIDS_SYMBOL | SQL_AFTER_GTIDS_SYMBOL) EQUAL_OPERATOR textString + | SQL_AFTER_MTS_GAPS_SYMBOL + ) (COMMA_SYMBOL sourceFileDef)* + ; + +userOption + : USER_SYMBOL EQUAL_OPERATOR textString + ; + +passwordOption + : PASSWORD_SYMBOL EQUAL_OPERATOR textString + ; + +defaultAuthOption + : DEFAULT_AUTH_SYMBOL EQUAL_OPERATOR textString + ; + +pluginDirOption + : PLUGIN_DIR_SYMBOL EQUAL_OPERATOR textString + ; + +replicaThreadOptions + : replicaThreadOption (COMMA_SYMBOL replicaThreadOption)* + ; + +replicaThreadOption + : SQL_THREAD_SYMBOL + | RELAY_THREAD_SYMBOL + ; + +groupReplication + : (START_SYMBOL groupReplicationStartOptions? | STOP_SYMBOL) GROUP_REPLICATION_SYMBOL + ; + +groupReplicationStartOptions + : groupReplicationStartOption (COMMA_SYMBOL groupReplicationStartOption)* + ; + +groupReplicationStartOption + : groupReplicationUser + | groupReplicationPassword + | groupReplicationPluginAuth + ; + +groupReplicationUser + : USER_SYMBOL EQUAL_OPERATOR textStringNoLinebreak + ; + +groupReplicationPassword + : PASSWORD_SYMBOL EQUAL_OPERATOR textStringNoLinebreak + ; + +groupReplicationPluginAuth + : DEFAULT_AUTH_SYMBOL EQUAL_OPERATOR textStringNoLinebreak + ; + +replica + : // Part of the terminology cleanup starting with 8.0.24. + SLAVE_SYMBOL + | REPLICA_SYMBOL + ; + +//---------------------------------------------------------------------------------------------------------------------- + +preparedStatement + : type = PREPARE_SYMBOL identifier FROM_SYMBOL (textLiteral | userVariable) + | executeStatement + | type = (DEALLOCATE_SYMBOL | DROP_SYMBOL) PREPARE_SYMBOL identifier + ; + +executeStatement + : EXECUTE_SYMBOL identifier (USING_SYMBOL executeVarList)? + ; + +executeVarList + : userVariable (COMMA_SYMBOL userVariable)* + ; + +//---------------------------------------------------------------------------------------------------------------------- + +cloneStatement + : CLONE_SYMBOL ( + LOCAL_SYMBOL DATA_SYMBOL DIRECTORY_SYMBOL equal? textStringLiteral + // Clone remote has been removed in 8.0.14. This alt is taken out by the conditional REMOTE_SYMBOL. + | REMOTE_SYMBOL (FOR_SYMBOL REPLICATION_SYMBOL)? + | {this.serverVersion >= 80014}? INSTANCE_SYMBOL FROM_SYMBOL user COLON_SYMBOL ulong_number IDENTIFIED_SYMBOL BY_SYMBOL + textStringLiteral dataDirSSL? + ) + ; + +dataDirSSL + : ssl + | DATA_SYMBOL DIRECTORY_SYMBOL equal? textStringLiteral ssl? + ; + +ssl + : REQUIRE_SYMBOL NO_SYMBOL? SSL_SYMBOL + ; + +//---------------------------------------------------------------------------------------------------------------------- + +// Note: SET PASSWORD is part of the SET statement. +accountManagementStatement + : alterUserStatement + | createUserStatement + | dropUserStatement + | grantStatement + | renameUserStatement + | revokeStatement + | setRoleStatement + ; + +alterUserStatement + : ALTER_SYMBOL USER_SYMBOL ifExists? ( + ( + {this.serverVersion < 80014}? createUserList + | {this.serverVersion >= 80014}? alterUserList + ) createUserTail + | userFunction ( + (identifiedByRandomPassword | identifiedByPassword) replacePassword? retainCurrentPassword? + | DISCARD_SYMBOL OLD_SYMBOL PASSWORD_SYMBOL + | userRegistration? + ) + | user ( + DEFAULT_SYMBOL ROLE_SYMBOL (ALL_SYMBOL | NONE_SYMBOL | roleList) + | userRegistration? + ) + ) + ; + +alterUserList + : alterUser (COMMA_SYMBOL alterUser)* + ; + +alterUser + : {this.serverVersion < 80025}? oldAlterUser + | {this.serverVersion >= 80025}? ( + user ( + identifiedByPassword ( + REPLACE_SYMBOL textStringLiteral retainCurrentPassword? + | retainCurrentPassword? + ) + | identifiedByRandomPassword ( + retainCurrentPassword? + | REPLACE_SYMBOL textStringLiteral retainCurrentPassword? + ) + | identifiedWithPlugin + | identifiedWithPluginAsAuth retainCurrentPassword? + | identifiedWithPluginByPassword ( + REPLACE_SYMBOL textStringLiteral retainCurrentPassword? + | retainCurrentPassword? + ) + | identifiedWithPluginByRandomPassword retainCurrentPassword? + | discardOldPassword? + | ADD_SYMBOL factor identification (ADD_SYMBOL factor identification)? + | MODIFY_SYMBOL factor identification ( + MODIFY_SYMBOL factor identification + )? + | DROP_SYMBOL factor (DROP_SYMBOL factor)? + ) + ) + ; + +oldAlterUser + : user IDENTIFIED_SYMBOL BY_SYMBOL ( + textString REPLACE_SYMBOL textString retainCurrentPassword? + | textString retainCurrentPassword? + | RANDOM_SYMBOL PASSWORD_SYMBOL (REPLACE_SYMBOL textString)? retainCurrentPassword? + ) + | user IDENTIFIED_SYMBOL WITH_SYMBOL ( + textOrIdentifier ( + BY_SYMBOL textString REPLACE_SYMBOL textString retainCurrentPassword? + | AS_SYMBOL textStringHash retainCurrentPassword? + | BY_SYMBOL textString retainCurrentPassword? + | BY_SYMBOL RANDOM_SYMBOL PASSWORD_SYMBOL retainCurrentPassword? + )? + ) + | user discardOldPassword? + ; + +userFunction + : USER_SYMBOL parentheses + ; + +createUserStatement + : CREATE_SYMBOL USER_SYMBOL ifNotExists? createUserList defaultRoleClause? createUserTail + ; + +createUserTail + : requireClause? connectOptions? accountLockPasswordExpireOptions* ( + {this.serverVersion >= 80024}? userAttributes + )? + ; + +userAttributes + : ATTRIBUTE_SYMBOL textStringLiteral + | COMMENT_SYMBOL textStringLiteral + ; + +defaultRoleClause + : DEFAULT_SYMBOL ROLE_SYMBOL roleList + ; + +requireClause + : REQUIRE_SYMBOL ( + requireList + | option = (SSL_SYMBOL | X509_SYMBOL | NONE_SYMBOL) + ) + ; + +connectOptions + : WITH_SYMBOL ( + MAX_QUERIES_PER_HOUR_SYMBOL ulong_number + | MAX_UPDATES_PER_HOUR_SYMBOL ulong_number + | MAX_CONNECTIONS_PER_HOUR_SYMBOL ulong_number + | MAX_USER_CONNECTIONS_SYMBOL ulong_number + )+ + ; + +accountLockPasswordExpireOptions + : ACCOUNT_SYMBOL (LOCK_SYMBOL | UNLOCK_SYMBOL) + | PASSWORD_SYMBOL ( + EXPIRE_SYMBOL ( + INTERVAL_SYMBOL real_ulong_number DAY_SYMBOL + | NEVER_SYMBOL + | DEFAULT_SYMBOL + )? + | HISTORY_SYMBOL (real_ulong_number | DEFAULT_SYMBOL) + | REUSE_SYMBOL INTERVAL_SYMBOL ( + real_ulong_number DAY_SYMBOL + | DEFAULT_SYMBOL + ) + | {this.serverVersion >= 80014}? REQUIRE_SYMBOL CURRENT_SYMBOL ( + DEFAULT_SYMBOL + | OPTIONAL_SYMBOL + )? + ) + | FAILED_LOGIN_ATTEMPTS_SYMBOL real_ulong_number + | PASSWORD_LOCK_TIME_SYMBOL (real_ulong_number | UNBOUNDED_SYMBOL) + ; + +userAttribute + : + | ATTRIBUTE_SYMBOL textStringLiteral + | COMMENT_SYMBOL textStringLiteral + ; + +dropUserStatement + : DROP_SYMBOL USER_SYMBOL ifExists? userList + ; + +grantStatement + : GRANT_SYMBOL ( + roleOrPrivilegesList TO_SYMBOL userList ( + WITH_SYMBOL ADMIN_SYMBOL OPTION_SYMBOL + )? + | (roleOrPrivilegesList | ALL_SYMBOL PRIVILEGES_SYMBOL?) ON_SYMBOL aclType? grantIdentifier TO_SYMBOL grantTargetList + versionedRequireClause? grantOptions? grantAs? + | PROXY_SYMBOL ON_SYMBOL user TO_SYMBOL grantTargetList ( + WITH_SYMBOL GRANT_SYMBOL OPTION_SYMBOL + )? + ) + ; + +grantTargetList + : {this.serverVersion < 80011}? createUserList + | {this.serverVersion >= 80011}? userList + ; + +grantOptions + : WITH_SYMBOL grantOption + ; + +exceptRoleList + : EXCEPT_SYMBOL roleList + ; + +withRoles + : WITH_SYMBOL ROLE_SYMBOL ( + roleList + | ALL_SYMBOL exceptRoleList? + | NONE_SYMBOL + | DEFAULT_SYMBOL + ) + ; + +grantAs + : AS_SYMBOL USER_SYMBOL withRoles? + ; + +versionedRequireClause + : {this.serverVersion < 80011}? requireClause + ; + +renameUserStatement + : RENAME_SYMBOL USER_SYMBOL user TO_SYMBOL user ( + COMMA_SYMBOL user TO_SYMBOL user + )* + ; + +revokeStatement + : REVOKE_SYMBOL ({this.serverVersion >= 80031}? ifExists)? ( + roleOrPrivilegesList FROM_SYMBOL userList + | roleOrPrivilegesList ON_SYMBOL aclType? grantIdentifier FROM_SYMBOL userList + | ALL_SYMBOL PRIVILEGES_SYMBOL? ( + ON_SYMBOL aclType? grantIdentifier + | COMMA_SYMBOL GRANT_SYMBOL OPTION_SYMBOL + ) FROM_SYMBOL userList + | PROXY_SYMBOL ON_SYMBOL user FROM_SYMBOL userList + ) ({this.serverVersion >= 80031}? ignoreUnknownUser)? + ; + +aclType + : TABLE_SYMBOL + | FUNCTION_SYMBOL + | PROCEDURE_SYMBOL + ; + +roleOrPrivilegesList + : roleOrPrivilege (COMMA_SYMBOL roleOrPrivilege)* + ; + +roleOrPrivilege + : ( + roleIdentifierOrText columnInternalRefList? + | roleIdentifierOrText (AT_TEXT_SUFFIX | AT_SIGN_SYMBOL textOrIdentifier) + ) + | (SELECT_SYMBOL | INSERT_SYMBOL | UPDATE_SYMBOL | REFERENCES_SYMBOL) columnInternalRefList? + | ( + DELETE_SYMBOL + | USAGE_SYMBOL + | INDEX_SYMBOL + | DROP_SYMBOL + | EXECUTE_SYMBOL + | RELOAD_SYMBOL + | SHUTDOWN_SYMBOL + | PROCESS_SYMBOL + | FILE_SYMBOL + | PROXY_SYMBOL + | SUPER_SYMBOL + | EVENT_SYMBOL + | TRIGGER_SYMBOL + ) + | GRANT_SYMBOL OPTION_SYMBOL + | SHOW_SYMBOL DATABASES_SYMBOL + | CREATE_SYMBOL ( + TEMPORARY_SYMBOL object = TABLES_SYMBOL + | object = (ROUTINE_SYMBOL | TABLESPACE_SYMBOL | USER_SYMBOL | VIEW_SYMBOL) + )? + | LOCK_SYMBOL TABLES_SYMBOL + | REPLICATION_SYMBOL (CLIENT_SYMBOL | replica) + | SHOW_SYMBOL VIEW_SYMBOL + | ALTER_SYMBOL ROUTINE_SYMBOL? + | (CREATE_SYMBOL | DROP_SYMBOL) ROLE_SYMBOL + ; + +grantIdentifier + : MULT_OPERATOR (DOT_SYMBOL MULT_OPERATOR)? + | schemaRef (DOT_SYMBOL MULT_OPERATOR)? + | tableRef + | {this.serverVersion >= 80017}? schemaRef DOT_SYMBOL tableRef + ; + +requireList + : requireListElement (AND_SYMBOL? requireListElement)* + ; + +requireListElement + : element = CIPHER_SYMBOL textString + | element = ISSUER_SYMBOL textString + | element = SUBJECT_SYMBOL textString + ; + +grantOption + : option = GRANT_SYMBOL OPTION_SYMBOL + | {this.serverVersion < 80011}? ( + option = MAX_QUERIES_PER_HOUR_SYMBOL ulong_number + | option = MAX_UPDATES_PER_HOUR_SYMBOL ulong_number + | option = MAX_CONNECTIONS_PER_HOUR_SYMBOL ulong_number + | option = MAX_USER_CONNECTIONS_SYMBOL ulong_number + ) + ; + +setRoleStatement + : SET_SYMBOL ROLE_SYMBOL roleList + | SET_SYMBOL ROLE_SYMBOL (NONE_SYMBOL | DEFAULT_SYMBOL) + | SET_SYMBOL DEFAULT_SYMBOL ROLE_SYMBOL (roleList | NONE_SYMBOL | ALL_SYMBOL) TO_SYMBOL roleList + | SET_SYMBOL ROLE_SYMBOL ALL_SYMBOL (EXCEPT_SYMBOL roleList)? + ; + +roleList + : role (COMMA_SYMBOL role)* + ; + +role + : roleIdentifierOrText userVariable? + ; + +//---------------------------------------------------------------------------------------------------------------------- + +tableAdministrationStatement + : type = ANALYZE_SYMBOL noWriteToBinLog? TABLE_SYMBOL tableRefList histogram? + | type = CHECK_SYMBOL TABLE_SYMBOL tableRefList checkOption* + | type = CHECKSUM_SYMBOL TABLE_SYMBOL tableRefList ( + QUICK_SYMBOL + | EXTENDED_SYMBOL + )? + | type = OPTIMIZE_SYMBOL noWriteToBinLog? TABLE_SYMBOL tableRefList + | type = REPAIR_SYMBOL noWriteToBinLog? TABLE_SYMBOL tableRefList repairType* + ; + +histogramAutoUpdate + : {this.serverVersion >= 80200}? (MANUAL_SYMBOL | AUTO_SYMBOL) UPDATE_SYMBOL + ; + +histogramUpdateParam + : histogramNumBuckets? histogramAutoUpdate? + | {this.serverVersion >= 80031}? USING_SYMBOL DATA_SYMBOL textStringLiteral + ; + +histogramNumBuckets + : {this.serverVersion >= 80200}? WITH_SYMBOL INT_NUMBER BUCKETS_SYMBOL + ; + +histogram + : UPDATE_SYMBOL HISTOGRAM_SYMBOL ON_SYMBOL identifierList histogramUpdateParam + | DROP_SYMBOL HISTOGRAM_SYMBOL ON_SYMBOL identifierList + ; + +checkOption + : FOR_SYMBOL UPGRADE_SYMBOL + | (QUICK_SYMBOL | FAST_SYMBOL | MEDIUM_SYMBOL | EXTENDED_SYMBOL | CHANGED_SYMBOL) + ; + +repairType + : QUICK_SYMBOL + | EXTENDED_SYMBOL + | USE_FRM_SYMBOL + ; + +//---------------------------------------------------------------------------------------------------------------------- + +uninstallStatement + : UNINSTALL_SYMBOL ( + PLUGIN_SYMBOL pluginRef + | COMPONENT_SYMBOL componentRef (COMMA_SYMBOL componentRef)* + ) + ; + +installStatement + : INSTALL_SYMBOL ( + PLUGIN_SYMBOL identifier SONAME_SYMBOL textStringLiteral + | COMPONENT_SYMBOL textStringLiteralList installSetValueList? + ) + ; + +installOptionType + : GLOBAL_SYMBOL + | PERSIST_SYMBOL + ; + +installSetRvalue + : expr + | ON_SYMBOL + ; + +installSetValue + : installOptionType lvalueVariable equal installSetRvalue + ; + +installSetValueList + : {this.serverVersion >= 80032}? SET_SYMBOL installSetValue ( + COMMA_SYMBOL installSetValue + )* + ; + +//---------------------------------------------------------------------------------------------------------------------- + +setStatement + : SET_SYMBOL startOptionValueList + ; + +startOptionValueList + : optionValueNoOptionType optionValueListContinued + | TRANSACTION_SYMBOL transactionCharacteristics + | optionType startOptionValueListFollowingOptionType + | PASSWORD_SYMBOL (FOR_SYMBOL user)? equal ( + textString replacePassword? retainCurrentPassword? + | textString replacePassword? retainCurrentPassword? + | {this.serverVersion < 80014}? PASSWORD_SYMBOL OPEN_PAR_SYMBOL textString CLOSE_PAR_SYMBOL + ) + | {this.serverVersion >= 80018}? PASSWORD_SYMBOL (FOR_SYMBOL user)? TO_SYMBOL RANDOM_SYMBOL replacePassword? + retainCurrentPassword? + ; + +transactionCharacteristics + : transactionAccessMode isolationLevel? + | isolationLevel (COMMA_SYMBOL transactionAccessMode)? + ; + +transactionAccessMode + : READ_SYMBOL (WRITE_SYMBOL | ONLY_SYMBOL) + ; + +isolationLevel + : ISOLATION_SYMBOL LEVEL_SYMBOL ( + REPEATABLE_SYMBOL READ_SYMBOL + | READ_SYMBOL (COMMITTED_SYMBOL | UNCOMMITTED_SYMBOL) + | SERIALIZABLE_SYMBOL + ) + ; + +optionValueListContinued + : (COMMA_SYMBOL optionValue)* + ; + +optionValueNoOptionType + : lvalueVariable equal setExprOrDefault + | charsetClause + | userVariable equal expr + | AT_AT_SIGN_SYMBOL setVarIdentType? lvalueVariable equal setExprOrDefault + | NAMES_SYMBOL ( + equal expr + | charsetName collate? + | {this.serverVersion >= 80011}? DEFAULT_SYMBOL + ) + ; + +optionValue + : optionType lvalueVariable equal setExprOrDefault + | optionValueNoOptionType + ; + +setSystemVariable + : AT_AT_SIGN_SYMBOL setVarIdentType? lvalueVariable + ; + +startOptionValueListFollowingOptionType + : optionValueFollowingOptionType optionValueListContinued + | TRANSACTION_SYMBOL transactionCharacteristics + ; + +optionValueFollowingOptionType + : lvalueVariable equal setExprOrDefault + ; + +setExprOrDefault + : expr + | DEFAULT_SYMBOL + | ON_SYMBOL + | ALL_SYMBOL + | BINARY_SYMBOL + | ROW_SYMBOL + | SYSTEM_SYMBOL + ; + +//---------------------------------------------------------------------------------------------------------------------- + +showDatabasesStatement + : SHOW_SYMBOL DATABASES_SYMBOL likeOrWhere? + ; + +showTablesStatement + : SHOW_SYMBOL showCommandType? value = TABLES_SYMBOL inDb? likeOrWhere? + ; + +showTriggersStatement + : SHOW_SYMBOL FULL_SYMBOL? TRIGGERS_SYMBOL inDb? likeOrWhere? + ; + +showEventsStatement + : SHOW_SYMBOL EVENTS_SYMBOL inDb? likeOrWhere? + ; + +showTableStatusStatement + : SHOW_SYMBOL TABLE_SYMBOL STATUS_SYMBOL inDb? likeOrWhere? + ; + +showOpenTablesStatement + : SHOW_SYMBOL OPEN_SYMBOL TABLES_SYMBOL inDb? likeOrWhere? + ; + +showParseTreeStatement + : {this.serverVersion >= 80100}? SHOW_SYMBOL PARSE_TREE_SYMBOL simpleStatement + ; + +showPluginsStatement + : SHOW_SYMBOL PLUGINS_SYMBOL + ; + +showEngineLogsStatement + : SHOW_SYMBOL ENGINE_SYMBOL engineOrAll LOGS_SYMBOL + ; + +showEngineMutexStatement + : SHOW_SYMBOL ENGINE_SYMBOL engineOrAll MUTEX_SYMBOL + ; + +showEngineStatusStatement + : SHOW_SYMBOL ENGINE_SYMBOL engineOrAll STATUS_SYMBOL + ; + +showColumnsStatement + : SHOW_SYMBOL showCommandType? COLUMNS_SYMBOL (FROM_SYMBOL | IN_SYMBOL) tableRef inDb? likeOrWhere? + ; + +showBinaryLogsStatement + : SHOW_SYMBOL (BINARY_SYMBOL | MASTER_SYMBOL) value = LOGS_SYMBOL + ; + +showBinaryLogStatusStatement + : SHOW_SYMBOL BINARY_SYMBOL LOG_SYMBOL STATUS_SYMBOL + ; + +showReplicasStatement + : SHOW_SYMBOL (replica HOSTS_SYMBOL | REPLICAS_SYMBOL) + ; + +showBinlogEventsStatement + : SHOW_SYMBOL BINLOG_SYMBOL EVENTS_SYMBOL (IN_SYMBOL textString)? ( + FROM_SYMBOL ulonglongNumber + )? limitClause? channel? + ; + +showRelaylogEventsStatement + : SHOW_SYMBOL RELAYLOG_SYMBOL EVENTS_SYMBOL (IN_SYMBOL textString)? ( + FROM_SYMBOL ulonglongNumber + )? limitClause? channel? + ; + +showKeysStatement + : SHOW_SYMBOL EXTENDED_SYMBOL? (INDEX_SYMBOL | INDEXES_SYMBOL | KEYS_SYMBOL) fromOrIn tableRef inDb? whereClause? + ; + +showEnginesStatement + : SHOW_SYMBOL STORAGE_SYMBOL? value = ENGINES_SYMBOL + ; + +showCountWarningsStatement + : SHOW_SYMBOL COUNT_SYMBOL OPEN_PAR_SYMBOL MULT_OPERATOR CLOSE_PAR_SYMBOL WARNINGS_SYMBOL + ; + +showCountErrorsStatement + : SHOW_SYMBOL COUNT_SYMBOL OPEN_PAR_SYMBOL MULT_OPERATOR CLOSE_PAR_SYMBOL ERRORS_SYMBOL + ; + +showWarningsStatement + : SHOW_SYMBOL WARNINGS_SYMBOL limitClause? + ; + +showErrorsStatement + : SHOW_SYMBOL ERRORS_SYMBOL limitClause? + ; + +showProfilesStatement + : SHOW_SYMBOL PROFILES_SYMBOL + ; + +showProfileStatement + : SHOW_SYMBOL PROFILE_SYMBOL profileDefinitions? ( + FOR_SYMBOL QUERY_SYMBOL INT_NUMBER + )? limitClause? + ; + +showStatusStatement + : SHOW_SYMBOL optionType? STATUS_SYMBOL likeOrWhere? + ; + +showProcessListStatement + : SHOW_SYMBOL FULL_SYMBOL? PROCESSLIST_SYMBOL + ; + +showVariablesStatement + : SHOW_SYMBOL optionType? VARIABLES_SYMBOL likeOrWhere? + ; + +showCharacterSetStatement + : SHOW_SYMBOL charset likeOrWhere? + ; + +showCollationStatement + : SHOW_SYMBOL COLLATION_SYMBOL likeOrWhere? + ; + +showPrivilegesStatement + : SHOW_SYMBOL PRIVILEGES_SYMBOL + ; + +showGrantsStatement + : SHOW_SYMBOL GRANTS_SYMBOL (FOR_SYMBOL user (USING_SYMBOL userList)?)? + ; + +showCreateDatabaseStatement + : SHOW_SYMBOL CREATE_SYMBOL DATABASE_SYMBOL ifNotExists? schemaRef + ; + +showCreateTableStatement + : SHOW_SYMBOL CREATE_SYMBOL TABLE_SYMBOL tableRef + ; + +showCreateViewStatement + : SHOW_SYMBOL CREATE_SYMBOL VIEW_SYMBOL viewRef + ; + +showMasterStatusStatement + : SHOW_SYMBOL MASTER_SYMBOL STATUS_SYMBOL + ; + +showReplicaStatusStatement + : SHOW_SYMBOL replica STATUS_SYMBOL channel? + ; + +showCreateProcedureStatement + : SHOW_SYMBOL CREATE_SYMBOL PROCEDURE_SYMBOL procedureRef + ; + +showCreateFunctionStatement + : SHOW_SYMBOL CREATE_SYMBOL FUNCTION_SYMBOL functionRef + ; + +showCreateTriggerStatement + : SHOW_SYMBOL CREATE_SYMBOL TRIGGER_SYMBOL triggerRef + ; + +showCreateProcedureStatusStatement + : SHOW_SYMBOL CREATE_SYMBOL PROCEDURE_SYMBOL STATUS_SYMBOL likeOrWhere? + ; + +showCreateFunctionStatusStatement + : SHOW_SYMBOL CREATE_SYMBOL FUNCTION_SYMBOL STATUS_SYMBOL likeOrWhere? + ; + +showCreateProcedureCodeStatement + : SHOW_SYMBOL CREATE_SYMBOL PROCEDURE_SYMBOL CODE_SYMBOL procedureRef + ; + +showCreateFunctionCodeStatement + : SHOW_SYMBOL CREATE_SYMBOL FUNCTION_SYMBOL CODE_SYMBOL functionRef + ; + +showCreateEventStatement + : SHOW_SYMBOL CREATE_SYMBOL EVENT_SYMBOL eventRef + ; + +showCreateUserStatement + : SHOW_SYMBOL CREATE_SYMBOL USER_SYMBOL user + ; + +showCommandType + : FULL_SYMBOL + | EXTENDED_SYMBOL FULL_SYMBOL? + ; + +engineOrAll + : engineRef + | ALL_SYMBOL + ; + +fromOrIn + : FROM_SYMBOL + | IN_SYMBOL + ; + +inDb + : fromOrIn identifier + ; + +profileDefinitions + : profileDefinition (COMMA_SYMBOL profileDefinition)* + ; + +profileDefinition + : BLOCK_SYMBOL IO_SYMBOL + | CONTEXT_SYMBOL SWITCHES_SYMBOL + | PAGE_SYMBOL FAULTS_SYMBOL + | ( + ALL_SYMBOL + | CPU_SYMBOL + | IPC_SYMBOL + | MEMORY_SYMBOL + | SOURCE_SYMBOL + | SWAPS_SYMBOL + ) + ; + +//---------------------------------------------------------------------------------------------------------------------- + +otherAdministrativeStatement + : type = BINLOG_SYMBOL textLiteral + | type = CACHE_SYMBOL INDEX_SYMBOL keyCacheListOrParts IN_SYMBOL ( + identifier + | DEFAULT_SYMBOL + ) + | type = FLUSH_SYMBOL noWriteToBinLog? ( + flushTables + | flushOption (COMMA_SYMBOL flushOption)* + ) + | type = KILL_SYMBOL (CONNECTION_SYMBOL | QUERY_SYMBOL)? expr + | type = LOAD_SYMBOL INDEX_SYMBOL INTO_SYMBOL CACHE_SYMBOL preloadTail + | type = SHUTDOWN_SYMBOL + ; + +keyCacheListOrParts + : keyCacheList + | assignToKeycachePartition + ; + +keyCacheList + : assignToKeycache (COMMA_SYMBOL assignToKeycache)* + ; + +assignToKeycache + : tableRef cacheKeyList? + ; + +assignToKeycachePartition + : tableRef PARTITION_SYMBOL OPEN_PAR_SYMBOL allOrPartitionNameList CLOSE_PAR_SYMBOL cacheKeyList? + ; + +cacheKeyList + : keyOrIndex OPEN_PAR_SYMBOL keyUsageList? CLOSE_PAR_SYMBOL + ; + +keyUsageElement + : identifier + | PRIMARY_SYMBOL + ; + +keyUsageList + : keyUsageElement (COMMA_SYMBOL keyUsageElement)* + ; + +flushOption + : option = ( + HOSTS_SYMBOL + | PRIVILEGES_SYMBOL + | STATUS_SYMBOL + | USER_RESOURCES_SYMBOL + ) + | logType? option = LOGS_SYMBOL + | option = RELAY_SYMBOL LOGS_SYMBOL channel? + | option = OPTIMIZER_COSTS_SYMBOL + ; + +logType + : BINARY_SYMBOL + | ENGINE_SYMBOL + | ERROR_SYMBOL + | GENERAL_SYMBOL + | SLOW_SYMBOL + ; + +flushTables + : (TABLES_SYMBOL | TABLE_SYMBOL) ( + WITH_SYMBOL READ_SYMBOL LOCK_SYMBOL + | identifierList flushTablesOptions? + )? + ; + +flushTablesOptions + : FOR_SYMBOL EXPORT_SYMBOL + | WITH_SYMBOL READ_SYMBOL LOCK_SYMBOL + ; + +preloadTail + : tableRef adminPartition cacheKeyList? (IGNORE_SYMBOL LEAVES_SYMBOL)? + | preloadList + ; + +preloadList + : preloadKeys (COMMA_SYMBOL preloadKeys)* + ; + +preloadKeys + : tableRef cacheKeyList? (IGNORE_SYMBOL LEAVES_SYMBOL)? + ; + +adminPartition + : PARTITION_SYMBOL OPEN_PAR_SYMBOL allOrPartitionNameList CLOSE_PAR_SYMBOL + ; + +//---------------------------------------------------------------------------------------------------------------------- + +resourceGroupManagement + : createResourceGroup + | alterResourceGroup + | setResourceGroup + | dropResourceGroup + ; + +createResourceGroup + : CREATE_SYMBOL RESOURCE_SYMBOL GROUP_SYMBOL identifier TYPE_SYMBOL equal? ( + USER_SYMBOL + | SYSTEM_SYMBOL + ) resourceGroupVcpuList? resourceGroupPriority? resourceGroupEnableDisable? + ; + +resourceGroupVcpuList + : VCPU_SYMBOL equal? vcpuNumOrRange (COMMA_SYMBOL? vcpuNumOrRange)* + ; + +vcpuNumOrRange + : INT_NUMBER (MINUS_OPERATOR INT_NUMBER)? + ; + +resourceGroupPriority + : THREAD_PRIORITY_SYMBOL equal? INT_NUMBER + ; + +resourceGroupEnableDisable + : ENABLE_SYMBOL + | DISABLE_SYMBOL + ; + +alterResourceGroup + : ALTER_SYMBOL RESOURCE_SYMBOL GROUP_SYMBOL resourceGroupRef resourceGroupVcpuList? resourceGroupPriority? + resourceGroupEnableDisable? FORCE_SYMBOL? + ; + +setResourceGroup + : SET_SYMBOL RESOURCE_SYMBOL GROUP_SYMBOL identifier (FOR_SYMBOL threadIdList)? + ; + +threadIdList + : real_ulong_number (COMMA_SYMBOL? real_ulong_number)* + ; + +dropResourceGroup + : DROP_SYMBOL RESOURCE_SYMBOL GROUP_SYMBOL resourceGroupRef FORCE_SYMBOL? + ; + +//---------------------------------------------------------------------------------------------------------------------- + +utilityStatement + : describeStatement + | explainStatement + | helpCommand + | useCommand + | {this.serverVersion >= 80011}? restartServer + ; + +describeStatement + : (EXPLAIN_SYMBOL | DESCRIBE_SYMBOL | DESC_SYMBOL) tableRef ( + textString + | columnRef + )? + ; + +explainStatement + : (EXPLAIN_SYMBOL | DESCRIBE_SYMBOL | DESC_SYMBOL) explainOptions? ( + {this.serverVersion >= 80032}? FOR_SYMBOL DATABASE_SYMBOL textOrIdentifier + )? explainableStatement + ; + +explainOptions + : FORMAT_SYMBOL EQUAL_OPERATOR textOrIdentifier ( + {this.serverVersion >= 80032}? explainInto + )? + | {this.serverVersion < 80012}? EXTENDED_SYMBOL + | {this.serverVersion >= 80018}? ANALYZE_SYMBOL + | {this.serverVersion >= 80019}? ANALYZE_SYMBOL FORMAT_SYMBOL EQUAL_OPERATOR textOrIdentifier + ; + +explainableStatement + : selectStatement + | deleteStatement + | insertStatement + | replaceStatement + | updateStatement + | FOR_SYMBOL CONNECTION_SYMBOL real_ulong_number + ; + +explainInto + : INTO_SYMBOL AT_SIGN_SYMBOL textOrIdentifier + ; + +helpCommand + : HELP_SYMBOL textOrIdentifier + ; + +useCommand + : USE_SYMBOL schemaRef + ; + +restartServer + : RESTART_SYMBOL + ; + +//----------------- Expression support --------------------------------------------------------------------------------- + +expr + : boolPri ( + IS_SYMBOL notRule? type = (TRUE_SYMBOL | FALSE_SYMBOL | UNKNOWN_SYMBOL) + )? # exprIs + | NOT_SYMBOL expr # exprNot + | expr op = (AND_SYMBOL | LOGICAL_AND_OPERATOR) expr # exprAnd + | expr XOR_SYMBOL expr # exprXor + | expr op = (OR_SYMBOL | LOGICAL_OR_OPERATOR) expr # exprOr + ; + +boolPri + : predicate # primaryExprPredicate + | boolPri IS_SYMBOL notRule? NULL_SYMBOL # primaryExprIsNull + | boolPri compOp predicate # primaryExprCompare + | boolPri compOp (ALL_SYMBOL | ANY_SYMBOL) subquery # primaryExprAllAny + ; + +compOp + : EQUAL_OPERATOR + | NULL_SAFE_EQUAL_OPERATOR + | GREATER_OR_EQUAL_OPERATOR + | GREATER_THAN_OPERATOR + | LESS_OR_EQUAL_OPERATOR + | LESS_THAN_OPERATOR + | NOT_EQUAL_OPERATOR + ; + +predicate + : bitExpr ( + notRule? predicateOperations + | {this.serverVersion >= 80017}? MEMBER_SYMBOL OF_SYMBOL? simpleExprWithParentheses + | SOUNDS_SYMBOL LIKE_SYMBOL bitExpr + )? + ; + +predicateOperations + : IN_SYMBOL (subquery | OPEN_PAR_SYMBOL exprList CLOSE_PAR_SYMBOL) # predicateExprIn + | BETWEEN_SYMBOL bitExpr AND_SYMBOL predicate # predicateExprBetween + | LIKE_SYMBOL simpleExpr (ESCAPE_SYMBOL simpleExpr)? # predicateExprLike + | REGEXP_SYMBOL bitExpr # predicateExprRegex + ; + +bitExpr + : simpleExpr + | bitExpr op = BITWISE_XOR_OPERATOR bitExpr + | bitExpr op = ( + MULT_OPERATOR + | DIV_OPERATOR + | MOD_OPERATOR + | DIV_SYMBOL + | MOD_SYMBOL + ) bitExpr + | bitExpr op = (PLUS_OPERATOR | MINUS_OPERATOR) bitExpr + | bitExpr op = (PLUS_OPERATOR | MINUS_OPERATOR) INTERVAL_SYMBOL expr interval + | bitExpr op = (SHIFT_LEFT_OPERATOR | SHIFT_RIGHT_OPERATOR) bitExpr + | bitExpr op = BITWISE_AND_OPERATOR bitExpr + | bitExpr op = BITWISE_OR_OPERATOR bitExpr + ; + +// $antlr-format groupedAlignments off +simpleExpr + : columnRef jsonOperator? # simpleExprColumnRef + | runtimeFunctionCall # simpleExprRuntimeFunction + | functionCall # simpleExprFunction + | simpleExpr COLLATE_SYMBOL textOrIdentifier # simpleExprCollate + | literalOrNull # simpleExprLiteral + | PARAM_MARKER # simpleExprParamMarker + | rvalueSystemOrUserVariable # simpleExpressionRValue + | inExpressionUserVariableAssignment # simpleExprUserVariableAssignment + | sumExpr # simpleExprSum + | groupingOperation # simpleExprGroupingOperation + | windowFunctionCall # simpleExprWindowingFunction + | simpleExpr CONCAT_PIPES_SYMBOL simpleExpr # simpleExprConcat + | op = (PLUS_OPERATOR | MINUS_OPERATOR | BITWISE_NOT_OPERATOR) simpleExpr # simpleExprUnary + | not2Rule simpleExpr # simpleExprNot + | ROW_SYMBOL? OPEN_PAR_SYMBOL exprList CLOSE_PAR_SYMBOL # simpleExprList + | EXISTS_SYMBOL? subquery # simpleExprSubQuery + | OPEN_CURLY_SYMBOL identifier expr CLOSE_CURLY_SYMBOL # simpleExprOdbc + | MATCH_SYMBOL identListArg AGAINST_SYMBOL OPEN_PAR_SYMBOL bitExpr fulltextOptions? CLOSE_PAR_SYMBOL # simpleExprMatch + | BINARY_SYMBOL simpleExpr # simpleExprBinary + | CAST_SYMBOL OPEN_PAR_SYMBOL expr (AT_SYMBOL LOCAL_SYMBOL)? AS_SYMBOL castType arrayCast? CLOSE_PAR_SYMBOL # simpleExprCast + | CAST_SYMBOL OPEN_PAR_SYMBOL expr AT_SYMBOL TIME_SYMBOL ZONE_SYMBOL INTERVAL_SYMBOL? textStringLiteral AS_SYMBOL + DATETIME_SYMBOL typeDatetimePrecision CLOSE_PAR_SYMBOL # simpleExprCastTime + | CASE_SYMBOL expr? (whenExpression thenExpression)+ elseExpression? END_SYMBOL # simpleExprCase + | CONVERT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL castType CLOSE_PAR_SYMBOL # simpleExprConvert + | CONVERT_SYMBOL OPEN_PAR_SYMBOL expr USING_SYMBOL charsetName CLOSE_PAR_SYMBOL # simpleExprConvertUsing + | DEFAULT_SYMBOL OPEN_PAR_SYMBOL simpleIdentifier CLOSE_PAR_SYMBOL # simpleExprDefault + | VALUES_SYMBOL OPEN_PAR_SYMBOL simpleIdentifier CLOSE_PAR_SYMBOL # simpleExprValues + | INTERVAL_SYMBOL expr interval PLUS_OPERATOR expr # simpleExprInterval + ; + +// $antlr-format groupedAlignments on + +arrayCast + : {this.serverVersion >= 80017}? ARRAY_SYMBOL + ; + +jsonOperator + : JSON_SEPARATOR_SYMBOL textStringLiteral + | JSON_UNQUOTED_SEPARATOR_SYMBOL textStringLiteral + ; + +sumExpr + : name = AVG_SYMBOL OPEN_PAR_SYMBOL DISTINCT_SYMBOL? inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | name = (BIT_AND_SYMBOL | BIT_OR_SYMBOL | BIT_XOR_SYMBOL) OPEN_PAR_SYMBOL inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | jsonFunction + | name = ST_COLLECT_SYMBOL OPEN_PAR_SYMBOL DISTINCT_SYMBOL? inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | name = COUNT_SYMBOL OPEN_PAR_SYMBOL ( + ALL_SYMBOL? MULT_OPERATOR + | inSumExpr + | DISTINCT_SYMBOL exprList + ) CLOSE_PAR_SYMBOL windowingClause? + | name = (MIN_SYMBOL | MAX_SYMBOL) OPEN_PAR_SYMBOL DISTINCT_SYMBOL? inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | name = ( + STD_SYMBOL + | VARIANCE_SYMBOL + | STDDEV_SAMP_SYMBOL + | VAR_SAMP_SYMBOL + | SUM_SYMBOL + ) OPEN_PAR_SYMBOL inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | name = SUM_SYMBOL OPEN_PAR_SYMBOL DISTINCT_SYMBOL inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | name = GROUP_CONCAT_SYMBOL OPEN_PAR_SYMBOL DISTINCT_SYMBOL? exprList orderClause? ( + SEPARATOR_SYMBOL textString + )? CLOSE_PAR_SYMBOL windowingClause? + ; + +groupingOperation + : GROUPING_SYMBOL OPEN_PAR_SYMBOL exprList CLOSE_PAR_SYMBOL + ; + +windowFunctionCall + : ( + ROW_NUMBER_SYMBOL + | RANK_SYMBOL + | DENSE_RANK_SYMBOL + | CUME_DIST_SYMBOL + | PERCENT_RANK_SYMBOL + ) parentheses windowingClause + | NTILE_SYMBOL ( + OPEN_PAR_SYMBOL stableInteger CLOSE_PAR_SYMBOL + | {this.serverVersion < 80024}? simpleExprWithParentheses + ) windowingClause + | (LEAD_SYMBOL | LAG_SYMBOL) OPEN_PAR_SYMBOL expr leadLagInfo? CLOSE_PAR_SYMBOL nullTreatment? windowingClause + | (FIRST_VALUE_SYMBOL | LAST_VALUE_SYMBOL) exprWithParentheses nullTreatment? windowingClause + | NTH_VALUE_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL simpleExpr CLOSE_PAR_SYMBOL ( + FROM_SYMBOL (FIRST_SYMBOL | LAST_SYMBOL) + )? nullTreatment? windowingClause + ; + +samplingMethod + : SYSTEM_SYMBOL + | BERNOULLI_SYMBOL + ; + +samplingPercentage + : ulonglongNumber + | AT_SIGN_SYMBOL textOrIdentifier + | PARAM_MARKER + ; + +tablesampleClause + : {this.serverVersion >= 80200}? TABLESAMPLE_SYMBOL samplingMethod OPEN_PAR_SYMBOL samplingPercentage CLOSE_PAR_SYMBOL + ; + +windowingClause + : OVER_SYMBOL (windowName | windowSpec) + ; + +leadLagInfo + : COMMA_SYMBOL ( + ulonglongNumber + | PARAM_MARKER + | {this.serverVersion >= 80024}? stableInteger + ) (COMMA_SYMBOL expr)? + ; + +// The stable_integer nonterminal symbol is not really constant, but constant for the duration of an execution. +stableInteger + : int64Literal + | paramOrVar + ; + +paramOrVar + : PARAM_MARKER + | identifier + | AT_SIGN_SYMBOL textOrIdentifier + ; + +nullTreatment + : (RESPECT_SYMBOL | IGNORE_SYMBOL) NULLS_SYMBOL + ; + +jsonFunction + : JSON_ARRAYAGG_SYMBOL OPEN_PAR_SYMBOL inSumExpr CLOSE_PAR_SYMBOL windowingClause? + | JSON_OBJECTAGG_SYMBOL OPEN_PAR_SYMBOL inSumExpr COMMA_SYMBOL inSumExpr CLOSE_PAR_SYMBOL windowingClause? + ; + +inSumExpr + : ALL_SYMBOL? expr + ; + +identListArg + : identList + | OPEN_PAR_SYMBOL identList CLOSE_PAR_SYMBOL + ; + +identList + : simpleIdentifier (COMMA_SYMBOL simpleIdentifier)* + ; + +fulltextOptions + : IN_SYMBOL BOOLEAN_SYMBOL MODE_SYMBOL + | IN_SYMBOL NATURAL_SYMBOL LANGUAGE_SYMBOL MODE_SYMBOL ( + WITH_SYMBOL QUERY_SYMBOL EXPANSION_SYMBOL + )? + | WITH_SYMBOL QUERY_SYMBOL EXPANSION_SYMBOL + ; + +// function_call_keyword and function_call_nonkeyword in sql_yacc.yy. +runtimeFunctionCall + : + // Function names that are keywords. + CHAR_SYMBOL OPEN_PAR_SYMBOL exprList (USING_SYMBOL charsetName)? CLOSE_PAR_SYMBOL + | CURRENT_USER_SYMBOL parentheses? + | DATE_SYMBOL exprWithParentheses + | DAY_SYMBOL exprWithParentheses + | HOUR_SYMBOL exprWithParentheses + | INSERT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr COMMA_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | INTERVAL_SYMBOL OPEN_PAR_SYMBOL expr (COMMA_SYMBOL expr)+ CLOSE_PAR_SYMBOL + | JSON_VALUE_SYMBOL OPEN_PAR_SYMBOL simpleExpr COMMA_SYMBOL textLiteral returningType? onEmptyOrError CLOSE_PAR_SYMBOL + | LEFT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | MINUTE_SYMBOL exprWithParentheses + | MONTH_SYMBOL exprWithParentheses + | RIGHT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | SECOND_SYMBOL exprWithParentheses + | TIME_SYMBOL exprWithParentheses + | TIMESTAMP_SYMBOL OPEN_PAR_SYMBOL expr (COMMA_SYMBOL expr)? CLOSE_PAR_SYMBOL + | trimFunction + | userFunction + | VALUES_SYMBOL exprWithParentheses + | YEAR_SYMBOL exprWithParentheses + + // Function names that are not keywords. + | (ADDDATE_SYMBOL | SUBDATE_SYMBOL) OPEN_PAR_SYMBOL expr COMMA_SYMBOL ( + expr + | INTERVAL_SYMBOL expr interval + ) CLOSE_PAR_SYMBOL + | CURDATE_SYMBOL parentheses? + | CURTIME_SYMBOL timeFunctionParameters? + | (DATE_ADD_SYMBOL | DATE_SUB_SYMBOL) OPEN_PAR_SYMBOL expr COMMA_SYMBOL INTERVAL_SYMBOL expr interval CLOSE_PAR_SYMBOL + | EXTRACT_SYMBOL OPEN_PAR_SYMBOL interval FROM_SYMBOL expr CLOSE_PAR_SYMBOL + | GET_FORMAT_SYMBOL OPEN_PAR_SYMBOL dateTimeTtype COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | {this.serverVersion >= 80032}? LOG_SYMBOL OPEN_PAR_SYMBOL expr ( + COMMA_SYMBOL expr + )? CLOSE_PAR_SYMBOL + | NOW_SYMBOL timeFunctionParameters? + | POSITION_SYMBOL OPEN_PAR_SYMBOL bitExpr IN_SYMBOL expr CLOSE_PAR_SYMBOL + | substringFunction + | SYSDATE_SYMBOL timeFunctionParameters? + | (TIMESTAMPADD_SYMBOL | TIMESTAMPDIFF_SYMBOL) OPEN_PAR_SYMBOL intervalTimeStamp COMMA_SYMBOL expr COMMA_SYMBOL expr + CLOSE_PAR_SYMBOL + | UTC_DATE_SYMBOL parentheses? + | UTC_TIME_SYMBOL timeFunctionParameters? + | UTC_TIMESTAMP_SYMBOL timeFunctionParameters? + + // Function calls with other conflicts. + | ASCII_SYMBOL exprWithParentheses + | CHARSET_SYMBOL exprWithParentheses + | COALESCE_SYMBOL exprListWithParentheses + | COLLATION_SYMBOL exprWithParentheses + | DATABASE_SYMBOL parentheses + | IF_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | FORMAT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr (COMMA_SYMBOL expr)? CLOSE_PAR_SYMBOL + | MICROSECOND_SYMBOL exprWithParentheses + | MOD_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | {this.serverVersion < 80011}? PASSWORD_SYMBOL exprWithParentheses + | QUARTER_SYMBOL exprWithParentheses + | REPEAT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | REPLACE_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | REVERSE_SYMBOL exprWithParentheses + | ROW_COUNT_SYMBOL parentheses + | TRUNCATE_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | WEEK_SYMBOL OPEN_PAR_SYMBOL expr (COMMA_SYMBOL expr)? CLOSE_PAR_SYMBOL + | WEIGHT_STRING_SYMBOL OPEN_PAR_SYMBOL expr ( + (AS_SYMBOL CHAR_SYMBOL wsNumCodepoints)? + | AS_SYMBOL BINARY_SYMBOL wsNumCodepoints + | COMMA_SYMBOL ulong_number COMMA_SYMBOL ulong_number COMMA_SYMBOL ulong_number + ) CLOSE_PAR_SYMBOL + | geometryFunction + ; + +// JSON_VALUE's optional JSON returning clause. +returningType + : + // The default returning type is CHAR(512). (The max length of 512 + // is chosen so that the returned values are not handled as BLOBs + // internally. See CONVERT_IF_BIGGER_TO_BLOB.) + RETURNING_SYMBOL castType + ; + +geometryFunction + : GEOMETRYCOLLECTION_SYMBOL OPEN_PAR_SYMBOL exprList? CLOSE_PAR_SYMBOL + | LINESTRING_SYMBOL exprListWithParentheses + | MULTILINESTRING_SYMBOL exprListWithParentheses + | MULTIPOINT_SYMBOL exprListWithParentheses + | MULTIPOLYGON_SYMBOL exprListWithParentheses + | POINT_SYMBOL OPEN_PAR_SYMBOL expr COMMA_SYMBOL expr CLOSE_PAR_SYMBOL + | POLYGON_SYMBOL exprListWithParentheses + ; + +timeFunctionParameters + : OPEN_PAR_SYMBOL fractionalPrecision? CLOSE_PAR_SYMBOL + ; + +fractionalPrecision + : INT_NUMBER + ; + +weightStringLevels + : LEVEL_SYMBOL ( + real_ulong_number MINUS_OPERATOR real_ulong_number + | weightStringLevelListItem (COMMA_SYMBOL weightStringLevelListItem)* + ) + ; + +weightStringLevelListItem + : real_ulong_number ((ASC_SYMBOL | DESC_SYMBOL) REVERSE_SYMBOL? | REVERSE_SYMBOL)? + ; + +dateTimeTtype + : DATE_SYMBOL + | TIME_SYMBOL + | DATETIME_SYMBOL + | TIMESTAMP_SYMBOL + ; + +trimFunction + : TRIM_SYMBOL OPEN_PAR_SYMBOL ( + expr (FROM_SYMBOL expr)? + | LEADING_SYMBOL expr? FROM_SYMBOL expr + | TRAILING_SYMBOL expr? FROM_SYMBOL expr + | BOTH_SYMBOL expr? FROM_SYMBOL expr + ) CLOSE_PAR_SYMBOL + ; + +substringFunction + : SUBSTRING_SYMBOL OPEN_PAR_SYMBOL expr ( + COMMA_SYMBOL expr (COMMA_SYMBOL expr)? + | FROM_SYMBOL expr (FOR_SYMBOL expr)? + ) CLOSE_PAR_SYMBOL + ; + +functionCall + : pureIdentifier OPEN_PAR_SYMBOL udfExprList? CLOSE_PAR_SYMBOL // For both UDF + other functions. + | qualifiedIdentifier OPEN_PAR_SYMBOL exprList? CLOSE_PAR_SYMBOL // Other functions only. + ; + +udfExprList + : udfExpr (COMMA_SYMBOL udfExpr)* + ; + +udfExpr + : expr selectAlias? + ; + +userVariable + : AT_SIGN_SYMBOL textOrIdentifier + | AT_TEXT_SUFFIX + ; + +inExpressionUserVariableAssignment + : userVariable ASSIGN_OPERATOR expr + ; + +rvalueSystemOrUserVariable + : userVariable + | AT_AT_SIGN_SYMBOL rvalueSystemVariableType? rvalueSystemVariable + ; + +lvalueVariable + : ( + // Check in semantic phase that the first id is not global/local/session/default. + identifier dotIdentifier? + | {this.serverVersion >= 80017}? lValueIdentifier dotIdentifier? + ) + | DEFAULT_SYMBOL dotIdentifier + ; + +rvalueSystemVariable + : textOrIdentifier dotIdentifier? + ; + +whenExpression + : WHEN_SYMBOL expr + ; + +thenExpression + : THEN_SYMBOL expr + ; + +elseExpression + : ELSE_SYMBOL expr + ; + +castType + : BINARY_SYMBOL fieldLength? + | CHAR_SYMBOL fieldLength? charsetWithOptBinary? + | nchar fieldLength? + | SIGNED_SYMBOL INT_SYMBOL? + | UNSIGNED_SYMBOL INT_SYMBOL? + | DATE_SYMBOL + | {this.serverVersion >= 80024}? YEAR_SYMBOL + | TIME_SYMBOL typeDatetimePrecision? + | DATETIME_SYMBOL typeDatetimePrecision? + | DECIMAL_SYMBOL floatOptions? + | JSON_SYMBOL + | {this.serverVersion >= 80017}? realType + | {this.serverVersion >= 80017}? FLOAT_SYMBOL standardFloatOptions? + | {this.serverVersion >= 80027}? ( + POINT_SYMBOL + | LINESTRING_SYMBOL + | POLYGON_SYMBOL + | MULTIPOINT_SYMBOL + | MULTILINESTRING_SYMBOL + | MULTIPOLYGON_SYMBOL + | GEOMETRYCOLLECTION_SYMBOL + ) + ; + +exprList + : expr (COMMA_SYMBOL expr)* + ; + +charset + : CHAR_SYMBOL SET_SYMBOL + | CHARSET_SYMBOL + ; + +notRule + : NOT_SYMBOL + | NOT2_SYMBOL // A NOT with a different (higher) operator precedence. + ; + +not2Rule + : LOGICAL_NOT_OPERATOR + | NOT2_SYMBOL + ; + +// None of the microsecond variants can be used in schedules (e.g. events). +interval + : intervalTimeStamp + | ( + SECOND_MICROSECOND_SYMBOL + | MINUTE_MICROSECOND_SYMBOL + | MINUTE_SECOND_SYMBOL + | HOUR_MICROSECOND_SYMBOL + | HOUR_SECOND_SYMBOL + | HOUR_MINUTE_SYMBOL + | DAY_MICROSECOND_SYMBOL + | DAY_SECOND_SYMBOL + | DAY_MINUTE_SYMBOL + | DAY_HOUR_SYMBOL + | YEAR_MONTH_SYMBOL + ) + ; + +// Support for SQL_TSI_* units is added by mapping those to tokens without SQL_TSI_ prefix. +intervalTimeStamp + : MICROSECOND_SYMBOL + | SECOND_SYMBOL + | MINUTE_SYMBOL + | HOUR_SYMBOL + | DAY_SYMBOL + | WEEK_SYMBOL + | MONTH_SYMBOL + | QUARTER_SYMBOL + | YEAR_SYMBOL + ; + +exprListWithParentheses + : OPEN_PAR_SYMBOL exprList CLOSE_PAR_SYMBOL + ; + +exprWithParentheses + : OPEN_PAR_SYMBOL expr CLOSE_PAR_SYMBOL + ; + +simpleExprWithParentheses + : OPEN_PAR_SYMBOL simpleExpr CLOSE_PAR_SYMBOL + ; + +orderList + : orderExpression (COMMA_SYMBOL orderExpression)* + ; + +orderExpression + : expr direction? + ; + +groupList + : groupingExpression (COMMA_SYMBOL groupingExpression)* + ; + +groupingExpression + : expr + ; + +channel + : FOR_SYMBOL CHANNEL_SYMBOL textStringNoLinebreak + ; + +//----------------- Stored routines rules ------------------------------------------------------------------------------ + +// Compound syntax for stored procedures, stored functions, triggers and events. +// Implements both, sp_proc_stmt and ev_sql_stmt_inner from the server grammar. +compoundStatement + : simpleStatement + | returnStatement + | ifStatement + | caseStatement + | labeledBlock + | unlabeledBlock + | labeledControl + | unlabeledControl + | leaveStatement + | iterateStatement + | cursorOpen + | cursorFetch + | cursorClose + ; + +returnStatement + : RETURN_SYMBOL expr + ; + +ifStatement + : IF_SYMBOL ifBody END_SYMBOL IF_SYMBOL + ; + +ifBody + : expr thenStatement (ELSEIF_SYMBOL ifBody | ELSE_SYMBOL compoundStatementList)? + ; + +thenStatement + : THEN_SYMBOL compoundStatementList + ; + +compoundStatementList + : (compoundStatement SEMICOLON_SYMBOL)+ + ; + +caseStatement + : CASE_SYMBOL expr? (whenExpression thenStatement)+ elseStatement? END_SYMBOL CASE_SYMBOL + ; + +elseStatement + : ELSE_SYMBOL compoundStatementList + ; + +labeledBlock + : label beginEndBlock labelRef? + ; + +unlabeledBlock + : beginEndBlock + ; + +label + : + // Block labels can only be up to 16 characters long. + labelIdentifier COLON_SYMBOL + ; + +beginEndBlock + : BEGIN_SYMBOL spDeclarations? compoundStatementList? END_SYMBOL + ; + +labeledControl + : label unlabeledControl labelRef? + ; + +unlabeledControl + : loopBlock + | whileDoBlock + | repeatUntilBlock + ; + +loopBlock + : LOOP_SYMBOL compoundStatementList END_SYMBOL LOOP_SYMBOL + ; + +whileDoBlock + : WHILE_SYMBOL expr DO_SYMBOL compoundStatementList END_SYMBOL WHILE_SYMBOL + ; + +repeatUntilBlock + : REPEAT_SYMBOL compoundStatementList UNTIL_SYMBOL expr END_SYMBOL REPEAT_SYMBOL + ; + +spDeclarations + : (spDeclaration SEMICOLON_SYMBOL)+ + ; + +spDeclaration + : variableDeclaration + | conditionDeclaration + | handlerDeclaration + | cursorDeclaration + ; + +variableDeclaration + : DECLARE_SYMBOL identifierList dataType collate? (DEFAULT_SYMBOL expr)? + ; + +conditionDeclaration + : DECLARE_SYMBOL identifier CONDITION_SYMBOL FOR_SYMBOL spCondition + ; + +spCondition + : ulong_number + | sqlstate + ; + +sqlstate + : SQLSTATE_SYMBOL VALUE_SYMBOL? textLiteral + ; + +handlerDeclaration + : DECLARE_SYMBOL (CONTINUE_SYMBOL | EXIT_SYMBOL | UNDO_SYMBOL) HANDLER_SYMBOL FOR_SYMBOL handlerCondition ( + COMMA_SYMBOL handlerCondition + )* compoundStatement + ; + +handlerCondition + : spCondition + | identifier + | SQLWARNING_SYMBOL + | notRule FOUND_SYMBOL + | SQLEXCEPTION_SYMBOL + ; + +cursorDeclaration + : DECLARE_SYMBOL identifier CURSOR_SYMBOL FOR_SYMBOL selectStatement + ; + +iterateStatement + : ITERATE_SYMBOL labelRef + ; + +leaveStatement + : LEAVE_SYMBOL labelRef + ; + +getDiagnosticsStatement + : GET_SYMBOL (CURRENT_SYMBOL | STACKED_SYMBOL)? DIAGNOSTICS_SYMBOL ( + statementInformationItem (COMMA_SYMBOL statementInformationItem)* + | CONDITION_SYMBOL signalAllowedExpr conditionInformationItem ( + COMMA_SYMBOL conditionInformationItem + )* + ) + ; + +// Only a limited subset of expr is allowed in SIGNAL/RESIGNAL/CONDITIONS. +signalAllowedExpr + : literal + | rvalueSystemOrUserVariable + | qualifiedIdentifier + ; + +statementInformationItem + : (userVariable | identifier) EQUAL_OPERATOR (NUMBER_SYMBOL | ROW_COUNT_SYMBOL) + ; + +conditionInformationItem + : (userVariable | identifier) EQUAL_OPERATOR ( + signalInformationItemName + | RETURNED_SQLSTATE_SYMBOL + ) + ; + +signalInformationItemName + : CLASS_ORIGIN_SYMBOL + | SUBCLASS_ORIGIN_SYMBOL + | CONSTRAINT_CATALOG_SYMBOL + | CONSTRAINT_SCHEMA_SYMBOL + | CONSTRAINT_NAME_SYMBOL + | CATALOG_NAME_SYMBOL + | SCHEMA_NAME_SYMBOL + | TABLE_NAME_SYMBOL + | COLUMN_NAME_SYMBOL + | CURSOR_NAME_SYMBOL + | MESSAGE_TEXT_SYMBOL + | MYSQL_ERRNO_SYMBOL + ; + +signalStatement + : SIGNAL_SYMBOL (identifier | sqlstate) ( + SET_SYMBOL signalInformationItem (COMMA_SYMBOL signalInformationItem)* + )? + ; + +resignalStatement + : RESIGNAL_SYMBOL (identifier | sqlstate)? ( + SET_SYMBOL signalInformationItem (COMMA_SYMBOL signalInformationItem)* + )? + ; + +signalInformationItem + : signalInformationItemName EQUAL_OPERATOR signalAllowedExpr + ; + +cursorOpen + : OPEN_SYMBOL identifier + ; + +cursorClose + : CLOSE_SYMBOL identifier + ; + +cursorFetch + : FETCH_SYMBOL (NEXT_SYMBOL? FROM_SYMBOL)? identifier INTO_SYMBOL identifierList + ; + +//----------------- Supplemental rules --------------------------------------------------------------------------------- + +// Schedules in CREATE/ALTER EVENT. +schedule + : AT_SYMBOL expr + | EVERY_SYMBOL expr interval (STARTS_SYMBOL expr)? (ENDS_SYMBOL expr)? + ; + +columnDefinition + : columnName fieldDefinition checkOrReferences? + ; + +checkOrReferences + : {this.serverVersion < 80016}? checkConstraint + | references + ; + +checkConstraint + : CHECK_SYMBOL exprWithParentheses + ; + +constraintEnforcement + : { this.serverVersion >= 80017}? NOT_SYMBOL? ENFORCED_SYMBOL + ; + +tableConstraintDef + : type = (KEY_SYMBOL | INDEX_SYMBOL) indexNameAndType? keyListWithExpression indexOption* + | type = FULLTEXT_SYMBOL keyOrIndex? indexName? keyListWithExpression fulltextIndexOption* + | type = SPATIAL_SYMBOL keyOrIndex? indexName? keyListWithExpression spatialIndexOption* + | constraintName? ( + (type = PRIMARY_SYMBOL KEY_SYMBOL | type = UNIQUE_SYMBOL keyOrIndex?) indexNameAndType? keyListWithExpression indexOption* + | type = FOREIGN_SYMBOL KEY_SYMBOL indexName? keyList references + | checkConstraint constraintEnforcement? + ) + ; + +constraintName + : CONSTRAINT_SYMBOL identifier? + ; + +fieldDefinition + : dataType ( + columnAttribute* + | collate? (GENERATED_SYMBOL ALWAYS_SYMBOL)? AS_SYMBOL exprWithParentheses ( + VIRTUAL_SYMBOL + | STORED_SYMBOL + )? columnAttribute* + ) + ; + +columnAttribute + : NOT_SYMBOL? nullLiteral + | {this.serverVersion >= 80014}? NOT_SYMBOL SECONDARY_SYMBOL + | value = DEFAULT_SYMBOL ( + nowOrSignedLiteral + | {this.serverVersion >= 80013}? exprWithParentheses + ) + | value = ON_SYMBOL UPDATE_SYMBOL NOW_SYMBOL timeFunctionParameters? + | value = AUTO_INCREMENT_SYMBOL + | value = SERIAL_SYMBOL DEFAULT_SYMBOL VALUE_SYMBOL + | PRIMARY_SYMBOL? value = KEY_SYMBOL + | value = UNIQUE_SYMBOL KEY_SYMBOL? + | value = COMMENT_SYMBOL textLiteral + | collate + | value = COLUMN_FORMAT_SYMBOL columnFormat + | value = STORAGE_SYMBOL storageMedia + | value = SRID_SYMBOL real_ulonglong_number + | {this.serverVersion >= 80017}? constraintName? checkConstraint + | {this.serverVersion >= 80017}? constraintEnforcement + | {this.serverVersion >= 80024}? value = ENGINE_ATTRIBUTE_SYMBOL EQUAL_OPERATOR? jsonAttribute + | {this.serverVersion >= 80024}? value = SECONDARY_ENGINE_ATTRIBUTE_SYMBOL EQUAL_OPERATOR? jsonAttribute + | {this.serverVersion >= 80024}? visibility + ; + +columnFormat + : FIXED_SYMBOL + | DYNAMIC_SYMBOL + | DEFAULT_SYMBOL + ; + +storageMedia + : DISK_SYMBOL + | MEMORY_SYMBOL + | DEFAULT_SYMBOL + ; + +now + : NOW_SYMBOL functionDatetimePrecision + ; + +nowOrSignedLiteral + : now + | signedLiteralOrNull + ; + +gcolAttribute + : UNIQUE_SYMBOL KEY_SYMBOL? + | COMMENT_SYMBOL textString + | notRule? NULL_SYMBOL + | PRIMARY_SYMBOL? KEY_SYMBOL + ; + +references + : REFERENCES_SYMBOL tableRef identifierListWithParentheses? ( + MATCH_SYMBOL match = (FULL_SYMBOL | PARTIAL_SYMBOL | SIMPLE_SYMBOL) + )? ( + ON_SYMBOL option = UPDATE_SYMBOL deleteOption ( + ON_SYMBOL DELETE_SYMBOL deleteOption + )? + | ON_SYMBOL option = DELETE_SYMBOL deleteOption ( + ON_SYMBOL UPDATE_SYMBOL deleteOption + )? + )? + ; + +deleteOption + : (RESTRICT_SYMBOL | CASCADE_SYMBOL) + | SET_SYMBOL nullLiteral + | SET_SYMBOL DEFAULT_SYMBOL + | NO_SYMBOL ACTION_SYMBOL + ; + +keyList + : OPEN_PAR_SYMBOL keyPart (COMMA_SYMBOL keyPart)* CLOSE_PAR_SYMBOL + ; + +keyPart + : identifier fieldLength? direction? + ; + +keyListWithExpression + : OPEN_PAR_SYMBOL keyPartOrExpression (COMMA_SYMBOL keyPartOrExpression)* CLOSE_PAR_SYMBOL + ; + +keyPartOrExpression + : // key_part_with_expression in sql_yacc.yy. + keyPart + | {this.serverVersion >= 80013}? exprWithParentheses direction? + ; + +indexType + : algorithm = (BTREE_SYMBOL | RTREE_SYMBOL | HASH_SYMBOL) + ; + +indexOption + : commonIndexOption + | indexTypeClause + ; + +// These options are common for all index types. +commonIndexOption + : KEY_BLOCK_SIZE_SYMBOL EQUAL_OPERATOR? ulong_number + | COMMENT_SYMBOL textLiteral + | visibility + | {this.serverVersion >= 80024}? ENGINE_ATTRIBUTE_SYMBOL EQUAL_OPERATOR? jsonAttribute + | {this.serverVersion >= 80024}? SECONDARY_ENGINE_ATTRIBUTE_SYMBOL EQUAL_OPERATOR? jsonAttribute + ; + +visibility + : VISIBLE_SYMBOL + | INVISIBLE_SYMBOL + ; + +indexTypeClause + : (USING_SYMBOL | TYPE_SYMBOL) indexType + ; + +fulltextIndexOption + : commonIndexOption + | WITH_SYMBOL PARSER_SYMBOL identifier + ; + +spatialIndexOption + : commonIndexOption + ; + +dataTypeDefinition + : // For external use only. Don't reference this in the normal grammar. + dataType EOF + ; + +dataType + : // type in sql_yacc.yy + type = ( + INT_SYMBOL + | TINYINT_SYMBOL + | SMALLINT_SYMBOL + | MEDIUMINT_SYMBOL + | BIGINT_SYMBOL + ) fieldLength? fieldOptions? + | (type = REAL_SYMBOL | type = DOUBLE_SYMBOL PRECISION_SYMBOL?) precision? fieldOptions? + | type = (FLOAT_SYMBOL | DECIMAL_SYMBOL | NUMERIC_SYMBOL | FIXED_SYMBOL) floatOptions? fieldOptions? + | type = BIT_SYMBOL fieldLength? + | type = (BOOL_SYMBOL | BOOLEAN_SYMBOL) + | type = CHAR_SYMBOL fieldLength? charsetWithOptBinary? + | nchar fieldLength? BINARY_SYMBOL? + | type = BINARY_SYMBOL fieldLength? + | (type = CHAR_SYMBOL VARYING_SYMBOL | type = VARCHAR_SYMBOL) fieldLength charsetWithOptBinary? + | ( + type = NATIONAL_SYMBOL VARCHAR_SYMBOL + | type = NVARCHAR_SYMBOL + | type = NCHAR_SYMBOL VARCHAR_SYMBOL + | type = NATIONAL_SYMBOL CHAR_SYMBOL VARYING_SYMBOL + | type = NCHAR_SYMBOL VARYING_SYMBOL + ) fieldLength BINARY_SYMBOL? + | type = VARBINARY_SYMBOL fieldLength + | type = YEAR_SYMBOL fieldLength? fieldOptions? + | type = DATE_SYMBOL + | type = TIME_SYMBOL typeDatetimePrecision? + | type = TIMESTAMP_SYMBOL typeDatetimePrecision? + | type = DATETIME_SYMBOL typeDatetimePrecision? + | type = TINYBLOB_SYMBOL + | type = BLOB_SYMBOL fieldLength? + | type = (MEDIUMBLOB_SYMBOL | LONGBLOB_SYMBOL) + | type = LONG_SYMBOL VARBINARY_SYMBOL + | type = LONG_SYMBOL (CHAR_SYMBOL VARYING_SYMBOL | VARCHAR_SYMBOL)? charsetWithOptBinary? + | type = TINYTEXT_SYMBOL charsetWithOptBinary? + | type = TEXT_SYMBOL fieldLength? charsetWithOptBinary? + | type = MEDIUMTEXT_SYMBOL charsetWithOptBinary? + | type = LONGTEXT_SYMBOL charsetWithOptBinary? + | type = ENUM_SYMBOL stringList charsetWithOptBinary? + | type = SET_SYMBOL stringList charsetWithOptBinary? + | type = SERIAL_SYMBOL + | type = JSON_SYMBOL + | type = ( + GEOMETRY_SYMBOL + | GEOMETRYCOLLECTION_SYMBOL + | POINT_SYMBOL + | MULTIPOINT_SYMBOL + | LINESTRING_SYMBOL + | MULTILINESTRING_SYMBOL + | POLYGON_SYMBOL + | MULTIPOLYGON_SYMBOL + ) + ; + +nchar + : type = NCHAR_SYMBOL + | type = NATIONAL_SYMBOL CHAR_SYMBOL + ; + +realType + : type = REAL_SYMBOL + | type = DOUBLE_SYMBOL PRECISION_SYMBOL? + ; + +fieldLength + : OPEN_PAR_SYMBOL (real_ulonglong_number | DECIMAL_NUMBER) CLOSE_PAR_SYMBOL + ; + +fieldOptions + : (SIGNED_SYMBOL | UNSIGNED_SYMBOL | ZEROFILL_SYMBOL)+ + ; + +charsetWithOptBinary + : ascii + | unicode + | BYTE_SYMBOL + | charset charsetName BINARY_SYMBOL? + | BINARY_SYMBOL (charset charsetName)? + ; + +ascii + : ASCII_SYMBOL BINARY_SYMBOL? + | BINARY_SYMBOL ASCII_SYMBOL + ; + +unicode + : UNICODE_SYMBOL BINARY_SYMBOL? + | BINARY_SYMBOL UNICODE_SYMBOL + ; + +wsNumCodepoints + : OPEN_PAR_SYMBOL real_ulong_number CLOSE_PAR_SYMBOL + ; + +typeDatetimePrecision + : OPEN_PAR_SYMBOL INT_NUMBER CLOSE_PAR_SYMBOL + ; + +functionDatetimePrecision + : + | parentheses + | OPEN_PAR_SYMBOL INT_NUMBER CLOSE_PAR_SYMBOL + ; + +charsetName + : textOrIdentifier + | BINARY_SYMBOL + | {this.serverVersion < 80011}? DEFAULT_SYMBOL + ; + +collationName + : textOrIdentifier + | {this.serverVersion < 80011}? DEFAULT_SYMBOL + | {this.serverVersion >= 80018}? BINARY_SYMBOL + ; + +createTableOptions + : createTableOption (COMMA_SYMBOL? createTableOption)* + ; + +createTableOptionsEtc + : createTableOptions createPartitioningEtc? + | createPartitioningEtc + ; + +createPartitioningEtc + : partitionClause duplicateAsQe? + | duplicateAsQe + ; + +createTableOptionsSpaceSeparated + : createTableOption+ + ; + +createTableOption + : // In the order as they appear in the server grammar. + option = ENGINE_SYMBOL EQUAL_OPERATOR? engineRef + | {this.serverVersion >= 80014}? option = SECONDARY_ENGINE_SYMBOL equal? ( + NULL_SYMBOL + | textOrIdentifier + ) + | option = MAX_ROWS_SYMBOL EQUAL_OPERATOR? ulonglongNumber + | option = MIN_ROWS_SYMBOL EQUAL_OPERATOR? ulonglongNumber + | option = AVG_ROW_LENGTH_SYMBOL EQUAL_OPERATOR? ulonglongNumber + | option = PASSWORD_SYMBOL EQUAL_OPERATOR? textStringLiteral + | option = COMMENT_SYMBOL EQUAL_OPERATOR? textStringLiteral + | option = COMPRESSION_SYMBOL EQUAL_OPERATOR? textString + | option = ENCRYPTION_SYMBOL EQUAL_OPERATOR? textString + | option = AUTO_INCREMENT_SYMBOL EQUAL_OPERATOR? ulonglongNumber + | option = PACK_KEYS_SYMBOL EQUAL_OPERATOR? ternaryOption + | option = ( + STATS_AUTO_RECALC_SYMBOL + | STATS_PERSISTENT_SYMBOL + | STATS_SAMPLE_PAGES_SYMBOL + ) EQUAL_OPERATOR? ternaryOption + | option = (CHECKSUM_SYMBOL | TABLE_CHECKSUM_SYMBOL) EQUAL_OPERATOR? ulong_number + | option = DELAY_KEY_WRITE_SYMBOL EQUAL_OPERATOR? ulong_number + | option = ROW_FORMAT_SYMBOL EQUAL_OPERATOR? format = ( + DEFAULT_SYMBOL + | DYNAMIC_SYMBOL + | FIXED_SYMBOL + | COMPRESSED_SYMBOL + | REDUNDANT_SYMBOL + | COMPACT_SYMBOL + ) + | option = UNION_SYMBOL EQUAL_OPERATOR? OPEN_PAR_SYMBOL tableRefList CLOSE_PAR_SYMBOL + | defaultCharset + | defaultCollation + | option = INSERT_METHOD_SYMBOL EQUAL_OPERATOR? method = ( + NO_SYMBOL + | FIRST_SYMBOL + | LAST_SYMBOL + ) + | option = DATA_SYMBOL DIRECTORY_SYMBOL EQUAL_OPERATOR? textString + | option = INDEX_SYMBOL DIRECTORY_SYMBOL EQUAL_OPERATOR? textString + | option = TABLESPACE_SYMBOL EQUAL_OPERATOR? identifier + | option = STORAGE_SYMBOL (DISK_SYMBOL | MEMORY_SYMBOL) + | option = CONNECTION_SYMBOL EQUAL_OPERATOR? textString + | option = KEY_BLOCK_SIZE_SYMBOL EQUAL_OPERATOR? ulonglongNumber + | {this.serverVersion >= 80024}? option = START_SYMBOL TRANSACTION_SYMBOL + | {this.serverVersion >= 80024}? option = ENGINE_ATTRIBUTE_SYMBOL EQUAL_OPERATOR? jsonAttribute + | {this.serverVersion >= 80024}? option = SECONDARY_ENGINE_ATTRIBUTE_SYMBOL EQUAL_OPERATOR? jsonAttribute + | {this.serverVersion >= 80024}? tsOptionAutoextendSize + ; + +ternaryOption + : ulong_number + | DEFAULT_SYMBOL + ; + +defaultCollation + : DEFAULT_SYMBOL? COLLATE_SYMBOL EQUAL_OPERATOR? collationName + ; + +defaultEncryption + : DEFAULT_SYMBOL? ENCRYPTION_SYMBOL EQUAL_OPERATOR? textStringLiteral + ; + +defaultCharset + : DEFAULT_SYMBOL? charset EQUAL_OPERATOR? charsetName + ; + +// Partition rules for CREATE/ALTER TABLE. +partitionClause + : PARTITION_SYMBOL BY_SYMBOL partitionTypeDef ( + PARTITIONS_SYMBOL real_ulong_number + )? subPartitions? partitionDefinitions? + ; + +partitionTypeDef + : LINEAR_SYMBOL? KEY_SYMBOL partitionKeyAlgorithm? OPEN_PAR_SYMBOL identifierList? CLOSE_PAR_SYMBOL # partitionDefKey + | LINEAR_SYMBOL? HASH_SYMBOL OPEN_PAR_SYMBOL bitExpr CLOSE_PAR_SYMBOL # partitionDefHash + | (RANGE_SYMBOL | LIST_SYMBOL) ( + OPEN_PAR_SYMBOL bitExpr CLOSE_PAR_SYMBOL + | COLUMNS_SYMBOL OPEN_PAR_SYMBOL identifierList? CLOSE_PAR_SYMBOL + ) # partitionDefRangeList + ; + +subPartitions + : SUBPARTITION_SYMBOL BY_SYMBOL LINEAR_SYMBOL? ( + HASH_SYMBOL OPEN_PAR_SYMBOL bitExpr CLOSE_PAR_SYMBOL + | KEY_SYMBOL partitionKeyAlgorithm? identifierListWithParentheses + ) (SUBPARTITIONS_SYMBOL real_ulong_number)? + ; + +partitionKeyAlgorithm + : // Actually only 1 and 2 are allowed. Needs a semantic check. + ALGORITHM_SYMBOL EQUAL_OPERATOR real_ulong_number + ; + +partitionDefinitions + : OPEN_PAR_SYMBOL partitionDefinition (COMMA_SYMBOL partitionDefinition)* CLOSE_PAR_SYMBOL + ; + +partitionDefinition + : PARTITION_SYMBOL identifier ( + VALUES_SYMBOL LESS_SYMBOL THAN_SYMBOL ( + partitionValueItemListParen + | MAXVALUE_SYMBOL + ) + | VALUES_SYMBOL IN_SYMBOL partitionValuesIn + )? partitionOption* ( + OPEN_PAR_SYMBOL subpartitionDefinition (COMMA_SYMBOL subpartitionDefinition)* CLOSE_PAR_SYMBOL + )? + ; + +partitionValuesIn + : partitionValueItemListParen + | OPEN_PAR_SYMBOL partitionValueItemListParen ( + COMMA_SYMBOL partitionValueItemListParen + )* CLOSE_PAR_SYMBOL + ; + +partitionOption + : option = TABLESPACE_SYMBOL EQUAL_OPERATOR? identifier + | STORAGE_SYMBOL? option = ENGINE_SYMBOL EQUAL_OPERATOR? engineRef + | option = NODEGROUP_SYMBOL EQUAL_OPERATOR? real_ulong_number + | option = (MAX_ROWS_SYMBOL | MIN_ROWS_SYMBOL) EQUAL_OPERATOR? real_ulong_number + | option = (DATA_SYMBOL | INDEX_SYMBOL) DIRECTORY_SYMBOL EQUAL_OPERATOR? textLiteral + | option = COMMENT_SYMBOL EQUAL_OPERATOR? textLiteral + ; + +subpartitionDefinition + : SUBPARTITION_SYMBOL textOrIdentifier partitionOption* + ; + +partitionValueItemListParen + : OPEN_PAR_SYMBOL partitionValueItem (COMMA_SYMBOL partitionValueItem)* CLOSE_PAR_SYMBOL + ; + +partitionValueItem + : bitExpr + | MAXVALUE_SYMBOL + ; + +definerClause + : DEFINER_SYMBOL EQUAL_OPERATOR user + ; + +ifExists + : IF_SYMBOL EXISTS_SYMBOL + ; + +ifExistsIdentifier + : ifExists persistedVariableIdentifier + ; + +persistedVariableIdentifier + : identifier + | {this.serverVersion >= 80032}? ( + qualifiedIdentifier + | DEFAULT_SYMBOL dotIdentifier + ) + ; + +ifNotExists + : IF_SYMBOL notRule EXISTS_SYMBOL + ; + +ignoreUnknownUser + : IGNORE_SYMBOL UNKNOWN_SYMBOL USER_SYMBOL + ; + +procedureParameter + : type = (IN_SYMBOL | OUT_SYMBOL | INOUT_SYMBOL)? functionParameter + ; + +functionParameter + : parameterName typeWithOptCollate + ; + +collate + : COLLATE_SYMBOL collationName + ; + +typeWithOptCollate + : dataType collate? + ; + +schemaIdentifierPair + : OPEN_PAR_SYMBOL schemaRef COMMA_SYMBOL schemaRef CLOSE_PAR_SYMBOL + ; + +viewRefList + : viewRef (COMMA_SYMBOL viewRef)* + ; + +updateList + : updateElement (COMMA_SYMBOL updateElement)* + ; + +updateElement + : columnRef EQUAL_OPERATOR (expr | DEFAULT_SYMBOL) + ; + +charsetClause + : charset charsetName + ; + +fieldsClause + : COLUMNS_SYMBOL fieldTerm+ + ; + +fieldTerm + : TERMINATED_SYMBOL BY_SYMBOL textString + | OPTIONALLY_SYMBOL? ENCLOSED_SYMBOL BY_SYMBOL textString + | ESCAPED_SYMBOL BY_SYMBOL textString + ; + +linesClause + : LINES_SYMBOL lineTerm+ + ; + +lineTerm + : (TERMINATED_SYMBOL | STARTING_SYMBOL) BY_SYMBOL textString + ; + +userList + : user (COMMA_SYMBOL user)* + ; + +createUserList + : createUser (COMMA_SYMBOL createUser)* + ; + +createUser + : user ( + identification createUserWithMfa? + | identifiedWithPlugin initialAuth? + | createUserWithMfa + )? + ; + +createUserWithMfa + : AND_SYMBOL identification (AND_SYMBOL identification)? + ; + +identification + : identifiedByPassword + | identifiedByRandomPassword + | identifiedWithPlugin + | identifiedWithPluginAsAuth + | identifiedWithPluginByPassword + | identifiedWithPluginByRandomPassword + ; + +identifiedByPassword + : IDENTIFIED_SYMBOL BY_SYMBOL textStringLiteral + ; + +identifiedByRandomPassword + : IDENTIFIED_SYMBOL BY_SYMBOL RANDOM_SYMBOL PASSWORD_SYMBOL + ; + +identifiedWithPlugin + : IDENTIFIED_SYMBOL WITH_SYMBOL textOrIdentifier + ; + +identifiedWithPluginAsAuth + : IDENTIFIED_SYMBOL WITH_SYMBOL textOrIdentifier AS_SYMBOL textStringHash + ; + +identifiedWithPluginByPassword + : IDENTIFIED_SYMBOL WITH_SYMBOL textOrIdentifier BY_SYMBOL textStringLiteral + ; + +identifiedWithPluginByRandomPassword + : IDENTIFIED_SYMBOL WITH_SYMBOL textOrIdentifier BY_SYMBOL RANDOM_SYMBOL PASSWORD_SYMBOL + ; + +initialAuth + : INITIAL_SYMBOL AUTHENTICATION_SYMBOL ( + identifiedByRandomPassword + | identifiedWithPluginAsAuth + | identifiedByPassword + ) + ; + +retainCurrentPassword + : RETAIN_SYMBOL CURRENT_SYMBOL PASSWORD_SYMBOL + ; + +discardOldPassword + : DISCARD_SYMBOL OLD_SYMBOL PASSWORD_SYMBOL + ; + +userRegistration + : factor INITIATE_SYMBOL REGISTRATION_SYMBOL + | factor UNREGISTER_SYMBOL + | factor FINISH_SYMBOL REGISTRATION_SYMBOL SET_SYMBOL CHALLENGE_RESPONSE_SYMBOL AS_SYMBOL textStringHash + ; + +factor + : numLiteral FACTOR_SYMBOL + ; + +replacePassword + : REPLACE_SYMBOL textString + ; + +userIdentifierOrText + : textOrIdentifier userVariable? + ; + +user + : userIdentifierOrText + | CURRENT_USER_SYMBOL parentheses? + ; + +likeClause + : LIKE_SYMBOL textStringLiteral + ; + +likeOrWhere + : // opt_wild_or_where in sql_yacc.yy + likeClause + | whereClause + ; + +onlineOption + : ONLINE_SYMBOL + | OFFLINE_SYMBOL + ; + +noWriteToBinLog + : LOCAL_SYMBOL + | NO_WRITE_TO_BINLOG_SYMBOL + ; + +usePartition + : PARTITION_SYMBOL identifierListWithParentheses + ; + +//----------------- Object names and references ------------------------------------------------------------------------ + +// For each object we have at least 2 rules here: +// 1) The name when creating that object. +// 2) The name when used to reference it from other rules. +// +// Sometimes we need additional reference rules with different form, depending on the place such a reference is used. + +// A name for a field (column/index). Can be qualified with the current schema + table (although it's not a reference). +fieldIdentifier + : dotIdentifier + | qualifiedIdentifier dotIdentifier? + ; + +columnName + : identifier + ; + +// A reference to a column of the object we are working on. +columnInternalRef + : identifier + ; + +columnInternalRefList + : // column_list (+ parentheses) + opt_derived_column_list in sql_yacc.yy + OPEN_PAR_SYMBOL columnInternalRef (COMMA_SYMBOL columnInternalRef)* CLOSE_PAR_SYMBOL + ; + +columnRef + : // A field identifier that can reference any schema/table. + fieldIdentifier + ; + +insertIdentifier + : columnRef + | tableWild + ; + +indexName + : identifier + ; + +indexRef + : // Always internal reference. Still all qualification variations are accepted. + fieldIdentifier + ; + +tableWild + : identifier DOT_SYMBOL (identifier DOT_SYMBOL)? MULT_OPERATOR + ; + +schemaName + : identifier + ; + +schemaRef + : identifier + ; + +procedureName + : qualifiedIdentifier + ; + +procedureRef + : qualifiedIdentifier + ; + +functionName + : qualifiedIdentifier + ; + +functionRef + : qualifiedIdentifier + ; + +triggerName + : qualifiedIdentifier + ; + +triggerRef + : qualifiedIdentifier + ; + +viewName + : qualifiedIdentifier + | dotIdentifier + ; + +viewRef + : qualifiedIdentifier + | dotIdentifier + ; + +tablespaceName + : identifier + ; + +tablespaceRef + : identifier + ; + +logfileGroupName + : identifier + ; + +logfileGroupRef + : identifier + ; + +eventName + : qualifiedIdentifier + ; + +eventRef + : qualifiedIdentifier + ; + +udfName + : // UDFs are referenced at the same places as any other function. So, no dedicated *_ref here. + identifier + ; + +serverName + : textOrIdentifier + ; + +serverRef + : textOrIdentifier + ; + +engineRef + : textOrIdentifier + ; + +tableName + : qualifiedIdentifier + | dotIdentifier + ; + +filterTableRef + : // Always qualified. + schemaRef dotIdentifier + ; + +tableRefWithWildcard + : identifier ( + DOT_SYMBOL MULT_OPERATOR + | dotIdentifier (DOT_SYMBOL MULT_OPERATOR)? + )? + ; + +tableRef + : qualifiedIdentifier + | dotIdentifier + ; + +tableRefList + : tableRef (COMMA_SYMBOL tableRef)* + ; + +tableAliasRefList + : tableRefWithWildcard (COMMA_SYMBOL tableRefWithWildcard)* + ; + +parameterName + : identifier + ; + +labelIdentifier + : pureIdentifier + | labelKeyword + ; + +labelRef + : labelIdentifier + ; + +roleIdentifier + : pureIdentifier + | roleKeyword + ; + +pluginRef + : identifier + ; + +componentRef + : textStringLiteral + ; + +resourceGroupRef + : identifier + ; + +windowName + : identifier + ; + +//----------------- Common basic rules --------------------------------------------------------------------------------- + +// Identifiers excluding keywords (except if they are quoted). IDENT_sys in sql_yacc.yy. +pureIdentifier + : (IDENTIFIER | BACK_TICK_QUOTED_ID) + | {this.isSqlModeActive(SqlMode.AnsiQuotes)}? DOUBLE_QUOTED_TEXT + ; + +// Identifiers including a certain set of keywords, which are allowed also if not quoted. +// ident in sql_yacc.yy +identifier + : pureIdentifier + | identifierKeyword + ; + +identifierList + : // ident_string_list in sql_yacc.yy. + identifier (COMMA_SYMBOL identifier)* + ; + +identifierListWithParentheses + : OPEN_PAR_SYMBOL identifierList CLOSE_PAR_SYMBOL + ; + +qualifiedIdentifier + : identifier dotIdentifier? + ; + +simpleIdentifier + : // simple_ident + simple_ident_q + identifier (dotIdentifier dotIdentifier?)? + ; + +// This rule encapsulates the frequently used dot + identifier sequence, which also requires a special +// treatment in the lexer. See there in the DOT_IDENTIFIER rule. +dotIdentifier + : DOT_SYMBOL identifier + ; + +ulong_number + : INT_NUMBER + | HEX_NUMBER + | LONG_NUMBER + | ULONGLONG_NUMBER + | DECIMAL_NUMBER + | FLOAT_NUMBER + ; + +real_ulong_number + : INT_NUMBER + | HEX_NUMBER + | LONG_NUMBER + | ULONGLONG_NUMBER + ; + +ulonglongNumber + : INT_NUMBER + | LONG_NUMBER + | ULONGLONG_NUMBER + | DECIMAL_NUMBER + | FLOAT_NUMBER + ; + +real_ulonglong_number + : INT_NUMBER + | {this.serverVersion >= 80017}? HEX_NUMBER + | ULONGLONG_NUMBER + | LONG_NUMBER + ; + +signedLiteral + : literal + | PLUS_OPERATOR ulong_number + | MINUS_OPERATOR ulong_number + ; + +signedLiteralOrNull + : signedLiteral + | {this.serverVersion >= 80024}? nullAsLiteral + ; + +literal + : textLiteral + | numLiteral + | temporalLiteral + | nullLiteral + | boolLiteral + | UNDERSCORE_CHARSET? (HEX_NUMBER | BIN_NUMBER) + ; + +literalOrNull + : literal + | {this.serverVersion >= 80024}? nullAsLiteral + ; + +nullAsLiteral + : NULL_SYMBOL + ; + +stringList + : OPEN_PAR_SYMBOL textString (COMMA_SYMBOL textString)* CLOSE_PAR_SYMBOL + ; + +// TEXT_STRING_sys + TEXT_STRING_literal + TEXT_STRING_filesystem + TEXT_STRING + TEXT_STRING_password + +// TEXT_STRING_validated in sql_yacc.yy. +textStringLiteral + : value = SINGLE_QUOTED_TEXT + | {!this.isSqlModeActive(SqlMode.AnsiQuotes)}? value = DOUBLE_QUOTED_TEXT + ; + +textString + : textStringLiteral + | HEX_NUMBER + | BIN_NUMBER + ; + +textStringHash + : textStringLiteral + | {this.serverVersion >= 80017}? HEX_NUMBER + ; + +textLiteral + : (UNDERSCORE_CHARSET? textStringLiteral | NCHAR_TEXT) textStringLiteral* + ; + +// A special variant of a text string that must not contain a linebreak (TEXT_STRING_sys_nonewline in sql_yacc.yy). +// Check validity in semantic phase. +textStringNoLinebreak + : textStringLiteral + ; + +textStringLiteralList + : textStringLiteral (COMMA_SYMBOL textStringLiteral)* + ; + +numLiteral + : int64Literal + | DECIMAL_NUMBER + | FLOAT_NUMBER + ; + +boolLiteral + : TRUE_SYMBOL + | FALSE_SYMBOL + ; + +nullLiteral + : // In sql_yacc.cc both 'NULL' and '\N' are mapped to NULL_SYMBOL(which is our nullLiteral). + NULL_SYMBOL + | NULL2_SYMBOL + ; + +// int64Literal if for unsigned exact integer literals in a range of [0 .. 2^64-1]. +int64Literal + : INT_NUMBER + | LONG_NUMBER + | ULONGLONG_NUMBER + ; + +temporalLiteral + : DATE_SYMBOL SINGLE_QUOTED_TEXT + | TIME_SYMBOL SINGLE_QUOTED_TEXT + | TIMESTAMP_SYMBOL SINGLE_QUOTED_TEXT + ; + +floatOptions + : fieldLength + | precision + ; + +standardFloatOptions + : precision + ; + +precision + : OPEN_PAR_SYMBOL INT_NUMBER COMMA_SYMBOL INT_NUMBER CLOSE_PAR_SYMBOL + ; + +textOrIdentifier + : identifier + | textStringLiteral + ; + +lValueIdentifier + : pureIdentifier + | lValueKeyword + ; + +roleIdentifierOrText + : roleIdentifier + | textStringLiteral + ; + +sizeNumber + : real_ulonglong_number + | pureIdentifier // Something like 10G. Semantic check needed for validity. + ; + +parentheses + : OPEN_PAR_SYMBOL CLOSE_PAR_SYMBOL + ; + +equal + : EQUAL_OPERATOR + | ASSIGN_OPERATOR + ; + +optionType + : PERSIST_SYMBOL + | PERSIST_ONLY_SYMBOL + | GLOBAL_SYMBOL + | LOCAL_SYMBOL + | SESSION_SYMBOL + ; + +rvalueSystemVariableType + : GLOBAL_SYMBOL DOT_SYMBOL + | LOCAL_SYMBOL DOT_SYMBOL + | SESSION_SYMBOL DOT_SYMBOL + ; + +setVarIdentType + : ( + PERSIST_SYMBOL + | PERSIST_ONLY_SYMBOL + | GLOBAL_SYMBOL + | LOCAL_SYMBOL + | SESSION_SYMBOL + ) DOT_SYMBOL + ; + +jsonAttribute + : textStringLiteral + ; + +// Note: rules for non-reserved keywords have changed significantly with MySQL 8.0.17, which make their +// version dependent handling complicated. +// Comments for keyword rules are taken over directly from the server grammar, but usually don't apply here +// since we don't have something like shift/reduce conflicts in ANTLR4 (which those ugly rules try to overcome). + +// Non-reserved keywords are allowed as unquoted identifiers in general. +// +// OTOH, in a few particular cases statement-specific rules are used +// instead of `ident_keyword` to avoid grammar ambiguities: +// +// * `label_keyword` for SP label names +// * `role_keyword` for role names +// * `lvalue_keyword` for variable prefixes and names in left sides of +// assignments in SET statements +// +// Normally, new non-reserved words should be added to the +// the rule `ident_keywords_unambiguous`. If they cause grammar conflicts, try +// one of `ident_keywords_ambiguous_...` rules instead. +identifierKeyword + : {this.serverVersion < 80017}? ( + labelKeyword + | roleOrIdentifierKeyword + | EXECUTE_SYMBOL + | SHUTDOWN_SYMBOL // Previously allowed as SP label as well. + | {this.serverVersion >= 80011}? RESTART_SYMBOL + ) + | ( + identifierKeywordsUnambiguous + | identifierKeywordsAmbiguous1RolesAndLabels + | identifierKeywordsAmbiguous2Labels + | identifierKeywordsAmbiguous3Roles + | identifierKeywordsAmbiguous4SystemVariables + ) + ; + +// These non-reserved words cannot be used as role names and SP label names: +identifierKeywordsAmbiguous1RolesAndLabels + : EXECUTE_SYMBOL + | RESTART_SYMBOL + | SHUTDOWN_SYMBOL + ; + +// These non-reserved keywords cannot be used as unquoted SP label names: +identifierKeywordsAmbiguous2Labels + : ASCII_SYMBOL + | BEGIN_SYMBOL + | BYTE_SYMBOL + | CACHE_SYMBOL + | CHARSET_SYMBOL + | CHECKSUM_SYMBOL + | CLONE_SYMBOL + | COMMENT_SYMBOL + | COMMIT_SYMBOL + | CONTAINS_SYMBOL + | DEALLOCATE_SYMBOL + | DO_SYMBOL + | END_SYMBOL + | FLUSH_SYMBOL + | FOLLOWS_SYMBOL + | HANDLER_SYMBOL + | HELP_SYMBOL + | IMPORT_SYMBOL + | INSTALL_SYMBOL + | LANGUAGE_SYMBOL + | NO_SYMBOL + | PRECEDES_SYMBOL + | PREPARE_SYMBOL + | REPAIR_SYMBOL + | RESET_SYMBOL + | ROLLBACK_SYMBOL + | SAVEPOINT_SYMBOL + | SIGNED_SYMBOL + | SLAVE_SYMBOL + | START_SYMBOL + | STOP_SYMBOL + | TRUNCATE_SYMBOL + | UNICODE_SYMBOL + | UNINSTALL_SYMBOL + | XA_SYMBOL + ; + +// Keywords that we allow for labels in SPs in the unquoted form. +// Any keyword that is allowed to begin a statement or routine characteristics +// must be in `ident_keywords_ambiguous_2_labels` above, otherwise +// we get (harmful) shift/reduce conflicts. +// +// Not allowed: +// +// ident_keywords_ambiguous_1_roles_and_labels +// ident_keywords_ambiguous_2_labels +labelKeyword + : {this.serverVersion < 80017}? ( + roleOrLabelKeyword + | EVENT_SYMBOL + | FILE_SYMBOL + | NONE_SYMBOL + | PROCESS_SYMBOL + | PROXY_SYMBOL + | RELOAD_SYMBOL + | REPLICATION_SYMBOL + | RESOURCE_SYMBOL + | SUPER_SYMBOL + ) + | ( + identifierKeywordsUnambiguous + | identifierKeywordsAmbiguous3Roles + | identifierKeywordsAmbiguous4SystemVariables + ) + ; + +// These non-reserved keywords cannot be used as unquoted role names: +identifierKeywordsAmbiguous3Roles + : EVENT_SYMBOL + | FILE_SYMBOL + | NONE_SYMBOL + | PROCESS_SYMBOL + | PROXY_SYMBOL + | RELOAD_SYMBOL + | REPLICATION_SYMBOL + | RESOURCE_SYMBOL + | SUPER_SYMBOL + ; + +// These are the non-reserved keywords which may be used for unquoted +// identifiers everywhere without introducing grammar conflicts: +identifierKeywordsUnambiguous + : ( + ACTION_SYMBOL + | ACCOUNT_SYMBOL + | ACTIVE_SYMBOL + | ADDDATE_SYMBOL + | ADMIN_SYMBOL + | AFTER_SYMBOL + | AGAINST_SYMBOL + | AGGREGATE_SYMBOL + | ALGORITHM_SYMBOL + | ALWAYS_SYMBOL + | ANY_SYMBOL + | AT_SYMBOL + | ATTRIBUTE_SYMBOL + | AUTHENTICATION_SYMBOL + | AUTOEXTEND_SIZE_SYMBOL + | AUTO_INCREMENT_SYMBOL + | AVG_ROW_LENGTH_SYMBOL + | AVG_SYMBOL + | BACKUP_SYMBOL + | BINLOG_SYMBOL + | BIT_SYMBOL + | BLOCK_SYMBOL + | BOOLEAN_SYMBOL + | BOOL_SYMBOL + | BTREE_SYMBOL + | BUCKETS_SYMBOL + | CASCADED_SYMBOL + | CATALOG_NAME_SYMBOL + | CHAIN_SYMBOL + | CHALLENGE_RESPONSE_SYMBOL + | CHANGED_SYMBOL + | CHANNEL_SYMBOL + | CIPHER_SYMBOL + | CLASS_ORIGIN_SYMBOL + | CLIENT_SYMBOL + | CLOSE_SYMBOL + | COALESCE_SYMBOL + | CODE_SYMBOL + | COLLATION_SYMBOL + | COLUMNS_SYMBOL + | COLUMN_FORMAT_SYMBOL + | COLUMN_NAME_SYMBOL + | COMMITTED_SYMBOL + | COMPACT_SYMBOL + | COMPLETION_SYMBOL + | COMPONENT_SYMBOL + | COMPRESSED_SYMBOL + | COMPRESSION_SYMBOL + | CONCURRENT_SYMBOL + | CONNECTION_SYMBOL + | CONSISTENT_SYMBOL + | CONSTRAINT_CATALOG_SYMBOL + | CONSTRAINT_NAME_SYMBOL + | CONSTRAINT_SCHEMA_SYMBOL + | CONTEXT_SYMBOL + | CPU_SYMBOL + | CURRENT_SYMBOL + | CURSOR_NAME_SYMBOL + | DATAFILE_SYMBOL + | DATA_SYMBOL + | DATETIME_SYMBOL + | DATE_SYMBOL + | DAY_SYMBOL + | DEFAULT_AUTH_SYMBOL + | DEFINER_SYMBOL + | DEFINITION_SYMBOL + | DELAY_KEY_WRITE_SYMBOL + | DESCRIPTION_SYMBOL + | DIAGNOSTICS_SYMBOL + | DIRECTORY_SYMBOL + | DISABLE_SYMBOL + | DISCARD_SYMBOL + | DISK_SYMBOL + | DUMPFILE_SYMBOL + | DUPLICATE_SYMBOL + | DYNAMIC_SYMBOL + | ENABLE_SYMBOL + | ENCRYPTION_SYMBOL + | ENDS_SYMBOL + | ENFORCED_SYMBOL + | ENGINES_SYMBOL + | ENGINE_SYMBOL + | ENUM_SYMBOL + | ERRORS_SYMBOL + | ERROR_SYMBOL + | ESCAPE_SYMBOL + | EVENTS_SYMBOL + | EVERY_SYMBOL + | EXCHANGE_SYMBOL + | EXCLUDE_SYMBOL + | EXPANSION_SYMBOL + | EXPIRE_SYMBOL + | EXPORT_SYMBOL + | EXTENDED_SYMBOL + | EXTENT_SIZE_SYMBOL + | FACTOR_SYMBOL + | FAST_SYMBOL + | FAULTS_SYMBOL + | FILE_BLOCK_SIZE_SYMBOL + | FILTER_SYMBOL + | FINISH_SYMBOL + | FIRST_SYMBOL + | FIXED_SYMBOL + | FOLLOWING_SYMBOL + | FORMAT_SYMBOL + | FOUND_SYMBOL + | FULL_SYMBOL + | GENERAL_SYMBOL + | GEOMETRYCOLLECTION_SYMBOL + | GEOMETRY_SYMBOL + | GET_FORMAT_SYMBOL + | GET_MASTER_PUBLIC_KEY_SYMBOL + | GET_SOURCE_PUBLIC_KEY_SYMBOL + | GRANTS_SYMBOL + | GROUP_REPLICATION_SYMBOL + | GTID_ONLY_SYMBOL + | HASH_SYMBOL + | HISTOGRAM_SYMBOL + | HISTORY_SYMBOL + | HOSTS_SYMBOL + | HOST_SYMBOL + | HOUR_SYMBOL + | IDENTIFIED_SYMBOL + | IGNORE_SERVER_IDS_SYMBOL + | INACTIVE_SYMBOL + | INDEXES_SYMBOL + | INITIAL_SIZE_SYMBOL + | INITIAL_SYMBOL + | INITIATE_SYMBOL + | INSERT_METHOD_SYMBOL + | INSTANCE_SYMBOL + | INVISIBLE_SYMBOL + | INVOKER_SYMBOL + | IO_SYMBOL + | IPC_SYMBOL + | ISOLATION_SYMBOL + | ISSUER_SYMBOL + | JSON_SYMBOL + | JSON_VALUE_SYMBOL + | KEY_BLOCK_SIZE_SYMBOL + | KEYRING_SYMBOL + | LAST_SYMBOL + | LEAVES_SYMBOL + | LESS_SYMBOL + | LEVEL_SYMBOL + | LINESTRING_SYMBOL + | LIST_SYMBOL + | LOCKED_SYMBOL + | LOCKS_SYMBOL + | LOGFILE_SYMBOL + | LOGS_SYMBOL + | MASTER_AUTO_POSITION_SYMBOL + | MASTER_COMPRESSION_ALGORITHM_SYMBOL + | MASTER_CONNECT_RETRY_SYMBOL + | MASTER_DELAY_SYMBOL + | MASTER_HEARTBEAT_PERIOD_SYMBOL + | MASTER_HOST_SYMBOL + | NETWORK_NAMESPACE_SYMBOL + | MASTER_LOG_FILE_SYMBOL + | MASTER_LOG_POS_SYMBOL + | MASTER_PASSWORD_SYMBOL + | MASTER_PORT_SYMBOL + | MASTER_PUBLIC_KEY_PATH_SYMBOL + | MASTER_RETRY_COUNT_SYMBOL + | MASTER_SSL_CAPATH_SYMBOL + | MASTER_SSL_CA_SYMBOL + | MASTER_SSL_CERT_SYMBOL + | MASTER_SSL_CIPHER_SYMBOL + | MASTER_SSL_CRLPATH_SYMBOL + | MASTER_SSL_CRL_SYMBOL + | MASTER_SSL_KEY_SYMBOL + | MASTER_SSL_SYMBOL + | MASTER_SYMBOL + | MASTER_TLS_CIPHERSUITES_SYMBOL + | MASTER_TLS_VERSION_SYMBOL + | MASTER_USER_SYMBOL + | MASTER_ZSTD_COMPRESSION_LEVEL_SYMBOL + | MAX_CONNECTIONS_PER_HOUR_SYMBOL + | MAX_QUERIES_PER_HOUR_SYMBOL + | MAX_ROWS_SYMBOL + | MAX_SIZE_SYMBOL + | MAX_UPDATES_PER_HOUR_SYMBOL + | MAX_USER_CONNECTIONS_SYMBOL + | MEDIUM_SYMBOL + | MEMORY_SYMBOL + | MERGE_SYMBOL + | MESSAGE_TEXT_SYMBOL + | MICROSECOND_SYMBOL + | MIGRATE_SYMBOL + | MINUTE_SYMBOL + | MIN_ROWS_SYMBOL + | MODE_SYMBOL + | MODIFY_SYMBOL + | MONTH_SYMBOL + | MULTILINESTRING_SYMBOL + | MULTIPOINT_SYMBOL + | MULTIPOLYGON_SYMBOL + | MUTEX_SYMBOL + | MYSQL_ERRNO_SYMBOL + | NAMES_SYMBOL + | NAME_SYMBOL + | NATIONAL_SYMBOL + | NCHAR_SYMBOL + | NDBCLUSTER_SYMBOL + | NESTED_SYMBOL + | NEVER_SYMBOL + | NEW_SYMBOL + | NEXT_SYMBOL + | NODEGROUP_SYMBOL + | NOWAIT_SYMBOL + | NO_WAIT_SYMBOL + | NULLS_SYMBOL + | NUMBER_SYMBOL + | NVARCHAR_SYMBOL + | OFFSET_SYMBOL + | OJ_SYMBOL + | OLD_SYMBOL + | ONE_SYMBOL + | ONLY_SYMBOL + | OPEN_SYMBOL + | OPTIONAL_SYMBOL + | OPTIONS_SYMBOL + | ORDINALITY_SYMBOL + | ORGANIZATION_SYMBOL + | OTHERS_SYMBOL + | OWNER_SYMBOL + | PACK_KEYS_SYMBOL + | PAGE_SYMBOL + | PARSER_SYMBOL + | PARTIAL_SYMBOL + | PARTITIONING_SYMBOL + | PARTITIONS_SYMBOL + | PASSWORD_SYMBOL + | PATH_SYMBOL + | PHASE_SYMBOL + | PLUGINS_SYMBOL + | PLUGIN_DIR_SYMBOL + | PLUGIN_SYMBOL + | POINT_SYMBOL + | POLYGON_SYMBOL + | PORT_SYMBOL + | PRECEDING_SYMBOL + | PRESERVE_SYMBOL + | PREV_SYMBOL + | PRIVILEGES_SYMBOL + | PRIVILEGE_CHECKS_USER_SYMBOL + | PROCESSLIST_SYMBOL + | PROFILES_SYMBOL + | PROFILE_SYMBOL + | QUARTER_SYMBOL + | QUERY_SYMBOL + | QUICK_SYMBOL + | READ_ONLY_SYMBOL + | REBUILD_SYMBOL + | RECOVER_SYMBOL + | REDO_BUFFER_SIZE_SYMBOL + | REDUNDANT_SYMBOL + | REFERENCE_SYMBOL + | REGISTRATION_SYMBOL + | RELAY_SYMBOL + | RELAYLOG_SYMBOL + | RELAY_LOG_FILE_SYMBOL + | RELAY_LOG_POS_SYMBOL + | RELAY_THREAD_SYMBOL + | REMOVE_SYMBOL + | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_SYMBOL + | REORGANIZE_SYMBOL + | REPEATABLE_SYMBOL + | REPLICAS_SYMBOL + | REPLICATE_DO_DB_SYMBOL + | REPLICATE_DO_TABLE_SYMBOL + | REPLICATE_IGNORE_DB_SYMBOL + | REPLICATE_IGNORE_TABLE_SYMBOL + | REPLICATE_REWRITE_DB_SYMBOL + | REPLICATE_WILD_DO_TABLE_SYMBOL + | REPLICATE_WILD_IGNORE_TABLE_SYMBOL + | REPLICA_SYMBOL + | USER_RESOURCES_SYMBOL + | RESPECT_SYMBOL + | RESTORE_SYMBOL + | RESUME_SYMBOL + | RETAIN_SYMBOL + | RETURNED_SQLSTATE_SYMBOL + | RETURNING_SYMBOL + | RETURNS_SYMBOL + | REUSE_SYMBOL + | REVERSE_SYMBOL + | ROLE_SYMBOL + | ROLLUP_SYMBOL + | ROTATE_SYMBOL + | ROUTINE_SYMBOL + | ROW_COUNT_SYMBOL + | ROW_FORMAT_SYMBOL + | RTREE_SYMBOL + | SCHEDULE_SYMBOL + | SCHEMA_NAME_SYMBOL + | SECONDARY_ENGINE_SYMBOL + | SECONDARY_ENGINE_ATTRIBUTE_SYMBOL + | SECONDARY_LOAD_SYMBOL + | SECONDARY_SYMBOL + | SECONDARY_UNLOAD_SYMBOL + | SECOND_SYMBOL + | SECURITY_SYMBOL + | SERIALIZABLE_SYMBOL + | SERIAL_SYMBOL + | SERVER_SYMBOL + | SHARE_SYMBOL + | SIMPLE_SYMBOL + | SKIP_SYMBOL + | SLOW_SYMBOL + | SNAPSHOT_SYMBOL + | SOCKET_SYMBOL + | SONAME_SYMBOL + | SOUNDS_SYMBOL + | SOURCE_AUTO_POSITION_SYMBOL + | SOURCE_BIND_SYMBOL + | SOURCE_COMPRESSION_ALGORITHM_SYMBOL + | SOURCE_CONNECTION_AUTO_FAILOVER_SYMBOL + | SOURCE_CONNECT_RETRY_SYMBOL + | SOURCE_DELAY_SYMBOL + | SOURCE_HEARTBEAT_PERIOD_SYMBOL + | SOURCE_HOST_SYMBOL + | SOURCE_LOG_FILE_SYMBOL + | SOURCE_LOG_POS_SYMBOL + | SOURCE_PASSWORD_SYMBOL + | SOURCE_PORT_SYMBOL + | SOURCE_PUBLIC_KEY_PATH_SYMBOL + | SOURCE_RETRY_COUNT_SYMBOL + | SOURCE_SSL_CAPATH_SYMBOL + | SOURCE_SSL_CA_SYMBOL + | SOURCE_SSL_CERT_SYMBOL + | SOURCE_SSL_CIPHER_SYMBOL + | SOURCE_SSL_CRLPATH_SYMBOL + | SOURCE_SSL_CRL_SYMBOL + | SOURCE_SSL_KEY_SYMBOL + | SOURCE_SSL_SYMBOL + | SOURCE_SSL_VERIFY_SERVER_CERT_SYMBOL + | SOURCE_SYMBOL + | SOURCE_TLS_CIPHERSUITES_SYMBOL + | SOURCE_TLS_VERSION_SYMBOL + | SOURCE_USER_SYMBOL + | SOURCE_ZSTD_COMPRESSION_LEVEL_SYMBOL + | SQL_AFTER_GTIDS_SYMBOL + | SQL_AFTER_MTS_GAPS_SYMBOL + | SQL_BEFORE_GTIDS_SYMBOL + | SQL_BUFFER_RESULT_SYMBOL + | SQL_NO_CACHE_SYMBOL + | SQL_THREAD_SYMBOL + | SRID_SYMBOL + | STACKED_SYMBOL + | STARTS_SYMBOL + | STATS_AUTO_RECALC_SYMBOL + | STATS_PERSISTENT_SYMBOL + | STATS_SAMPLE_PAGES_SYMBOL + | STATUS_SYMBOL + | STORAGE_SYMBOL + | STRING_SYMBOL + | ST_COLLECT_SYMBOL + | SUBCLASS_ORIGIN_SYMBOL + | SUBDATE_SYMBOL + | SUBJECT_SYMBOL + | SUBPARTITIONS_SYMBOL + | SUBPARTITION_SYMBOL + | SUSPEND_SYMBOL + | SWAPS_SYMBOL + | SWITCHES_SYMBOL + | TABLES_SYMBOL + | TABLESPACE_SYMBOL + | TABLE_CHECKSUM_SYMBOL + | TABLE_NAME_SYMBOL + | TEMPORARY_SYMBOL + | TEMPTABLE_SYMBOL + | TEXT_SYMBOL + | THAN_SYMBOL + | THREAD_PRIORITY_SYMBOL + | TIES_SYMBOL + | TIMESTAMPADD_SYMBOL + | TIMESTAMPDIFF_SYMBOL + | TIMESTAMP_SYMBOL + | TIME_SYMBOL + | TLS_SYMBOL + | TRANSACTION_SYMBOL + | TRIGGERS_SYMBOL + | TYPES_SYMBOL + | TYPE_SYMBOL + | UNBOUNDED_SYMBOL + | UNCOMMITTED_SYMBOL + | UNDEFINED_SYMBOL + | UNDOFILE_SYMBOL + | UNDO_BUFFER_SIZE_SYMBOL + | UNKNOWN_SYMBOL + | UNREGISTER_SYMBOL + | UNTIL_SYMBOL + | UPGRADE_SYMBOL + | USER_SYMBOL + | USE_FRM_SYMBOL + | VALIDATION_SYMBOL + | VALUE_SYMBOL + | VARIABLES_SYMBOL + | VCPU_SYMBOL + | VIEW_SYMBOL + | VISIBLE_SYMBOL + | WAIT_SYMBOL + | WARNINGS_SYMBOL + | WEEK_SYMBOL + | WEIGHT_STRING_SYMBOL + | WITHOUT_SYMBOL + | WORK_SYMBOL + | WRAPPER_SYMBOL + | X509_SYMBOL + | XID_SYMBOL + | XML_SYMBOL + | YEAR_SYMBOL + | ZONE_SYMBOL + ) + | {this.serverVersion >= 80019}? ( + ARRAY_SYMBOL + | FAILED_LOGIN_ATTEMPTS_SYMBOL + | MASTER_COMPRESSION_ALGORITHM_SYMBOL + | MASTER_TLS_CIPHERSUITES_SYMBOL + | MASTER_ZSTD_COMPRESSION_LEVEL_SYMBOL + | MEMBER_SYMBOL + | OFF_SYMBOL + | PASSWORD_LOCK_TIME_SYMBOL + | PRIVILEGE_CHECKS_USER_SYMBOL + | RANDOM_SYMBOL + | REQUIRE_ROW_FORMAT_SYMBOL + | REQUIRE_TABLE_PRIMARY_KEY_CHECK_SYMBOL + | STREAM_SYMBOL + | TIMESTAMP_SYMBOL + | TIME_SYMBOL + ) + | {this.serverVersion >= 80200}? ( + BULK_SYMBOL + | GENERATE_SYMBOL + | GTIDS_SYMBOL + | LOG_SYMBOL + | PARSE_TREE_SYMBOL + | S3_SYMBOL + | BERNOULLI_SYMBOL + ) + /* INSERT OTHER KEYWORDS HERE */ + ; + +// Non-reserved keywords that we allow for unquoted role names: +// +// Not allowed: +// +// ident_keywords_ambiguous_1_roles_and_labels +// ident_keywords_ambiguous_3_roles +roleKeyword + : {this.serverVersion < 80017}? (roleOrLabelKeyword | roleOrIdentifierKeyword) + | ( + identifierKeywordsUnambiguous + | identifierKeywordsAmbiguous2Labels + | identifierKeywordsAmbiguous4SystemVariables + ) + ; + +// Non-reserved words allowed for unquoted unprefixed variable names and +// unquoted variable prefixes in the left side of assignments in SET statements: +// +// Not allowed: +// +// ident_keywords_ambiguous_4_system_variables +lValueKeyword + : identifierKeywordsUnambiguous + | identifierKeywordsAmbiguous1RolesAndLabels + | identifierKeywordsAmbiguous2Labels + | identifierKeywordsAmbiguous3Roles + ; + +// These non-reserved keywords cannot be used as unquoted unprefixed +// variable names and unquoted variable prefixes in the left side of +// assignments in SET statements: +identifierKeywordsAmbiguous4SystemVariables + : GLOBAL_SYMBOL + | LOCAL_SYMBOL + | PERSIST_SYMBOL + | PERSIST_ONLY_SYMBOL + | SESSION_SYMBOL + ; + +// $antlr-format groupedAlignments off + +// These are the non-reserved keywords which may be used for roles or idents. +// Keywords defined only for specific server versions are handled at lexer level and so cannot match this rule +// if the current server version doesn't allow them. Hence we don't need predicates here for them. +roleOrIdentifierKeyword + : ( + ACCOUNT_SYMBOL + | ASCII_SYMBOL + | ALWAYS_SYMBOL + | BACKUP_SYMBOL + | BEGIN_SYMBOL + | BYTE_SYMBOL + | CACHE_SYMBOL + | CHARSET_SYMBOL + | CHECKSUM_SYMBOL + | CLONE_SYMBOL + | CLOSE_SYMBOL + | COMMENT_SYMBOL + | COMMIT_SYMBOL + | CONTAINS_SYMBOL + | DEALLOCATE_SYMBOL + | DO_SYMBOL + | END_SYMBOL + | FLUSH_SYMBOL + | FOLLOWS_SYMBOL + | FORMAT_SYMBOL + | GROUP_REPLICATION_SYMBOL + | HANDLER_SYMBOL + | HELP_SYMBOL + | HOST_SYMBOL + | INSTALL_SYMBOL + | INVISIBLE_SYMBOL + | LANGUAGE_SYMBOL + | NO_SYMBOL + | OPEN_SYMBOL + | OPTIONS_SYMBOL + | OWNER_SYMBOL + | PARSER_SYMBOL + | PARTITION_SYMBOL + | PORT_SYMBOL + | PRECEDES_SYMBOL + | PREPARE_SYMBOL + | REMOVE_SYMBOL + | REPAIR_SYMBOL + | RESET_SYMBOL + | RESTORE_SYMBOL + | ROLE_SYMBOL + | ROLLBACK_SYMBOL + | SAVEPOINT_SYMBOL + | SECONDARY_SYMBOL + | SECONDARY_ENGINE_SYMBOL + | SECONDARY_LOAD_SYMBOL + | SECONDARY_UNLOAD_SYMBOL + | SECURITY_SYMBOL + | SERVER_SYMBOL + | SIGNED_SYMBOL + | SOCKET_SYMBOL + | SLAVE_SYMBOL + | SONAME_SYMBOL + | START_SYMBOL + | STOP_SYMBOL + | TRUNCATE_SYMBOL + | UNICODE_SYMBOL + | UNINSTALL_SYMBOL + | UPGRADE_SYMBOL + | VISIBLE_SYMBOL + | WRAPPER_SYMBOL + | XA_SYMBOL + ) + ; + +roleOrLabelKeyword + : ( + ACTION_SYMBOL + | ACTIVE_SYMBOL + | ADDDATE_SYMBOL + | AFTER_SYMBOL + | AGAINST_SYMBOL + | AGGREGATE_SYMBOL + | ALGORITHM_SYMBOL + | ANY_SYMBOL + | AT_SYMBOL + | AUTO_INCREMENT_SYMBOL + | AUTOEXTEND_SIZE_SYMBOL + | AVG_ROW_LENGTH_SYMBOL + | AVG_SYMBOL + | BINLOG_SYMBOL + | BIT_SYMBOL + | BLOCK_SYMBOL + | BOOL_SYMBOL + | BOOLEAN_SYMBOL + | BTREE_SYMBOL + | BUCKETS_SYMBOL + | CASCADED_SYMBOL + | CATALOG_NAME_SYMBOL + | CHAIN_SYMBOL + | CHANGED_SYMBOL + | CHANNEL_SYMBOL + | CIPHER_SYMBOL + | CLIENT_SYMBOL + | CLASS_ORIGIN_SYMBOL + | COALESCE_SYMBOL + | CODE_SYMBOL + | COLLATION_SYMBOL + | COLUMN_NAME_SYMBOL + | COLUMN_FORMAT_SYMBOL + | COLUMNS_SYMBOL + | COMMITTED_SYMBOL + | COMPACT_SYMBOL + | COMPLETION_SYMBOL + | COMPONENT_SYMBOL + | COMPRESSED_SYMBOL + | COMPRESSION_SYMBOL + | CONCURRENT_SYMBOL + | CONNECTION_SYMBOL + | CONSISTENT_SYMBOL + | CONSTRAINT_CATALOG_SYMBOL + | CONSTRAINT_SCHEMA_SYMBOL + | CONSTRAINT_NAME_SYMBOL + | CONTEXT_SYMBOL + | CPU_SYMBOL + | CURRENT_SYMBOL + | CURSOR_NAME_SYMBOL + | DATA_SYMBOL + | DATAFILE_SYMBOL + | DATETIME_SYMBOL + | DATE_SYMBOL + | DAY_SYMBOL + | DEFAULT_AUTH_SYMBOL + | DEFINER_SYMBOL + | DELAY_KEY_WRITE_SYMBOL + | DESCRIPTION_SYMBOL + | DIAGNOSTICS_SYMBOL + | DIRECTORY_SYMBOL + | DISABLE_SYMBOL + | DISCARD_SYMBOL + | DISK_SYMBOL + | DUMPFILE_SYMBOL + | DUPLICATE_SYMBOL + | DYNAMIC_SYMBOL + | ENCRYPTION_SYMBOL + | ENDS_SYMBOL + | ENUM_SYMBOL + | ENGINE_SYMBOL + | ENGINES_SYMBOL + | ENGINE_ATTRIBUTE_SYMBOL + | ERROR_SYMBOL + | ERRORS_SYMBOL + | ESCAPE_SYMBOL + | EVENTS_SYMBOL + | EVERY_SYMBOL + | EXCLUDE_SYMBOL + | EXPANSION_SYMBOL + | EXPORT_SYMBOL + | EXTENDED_SYMBOL + | EXTENT_SIZE_SYMBOL + | FAULTS_SYMBOL + | FAST_SYMBOL + | FOLLOWING_SYMBOL + | FOUND_SYMBOL + | ENABLE_SYMBOL + | FULL_SYMBOL + | FILE_BLOCK_SIZE_SYMBOL + | FILTER_SYMBOL + | FIRST_SYMBOL + | FIXED_SYMBOL + | GENERAL_SYMBOL + | GEOMETRY_SYMBOL + | GEOMETRYCOLLECTION_SYMBOL + | GET_FORMAT_SYMBOL + | GRANTS_SYMBOL + | GLOBAL_SYMBOL + | HASH_SYMBOL + | HISTOGRAM_SYMBOL + | HISTORY_SYMBOL + | HOSTS_SYMBOL + | HOUR_SYMBOL + | IDENTIFIED_SYMBOL + | IGNORE_SERVER_IDS_SYMBOL + | INVOKER_SYMBOL + | INDEXES_SYMBOL + | INITIAL_SIZE_SYMBOL + | INSTANCE_SYMBOL + | INACTIVE_SYMBOL + | IO_SYMBOL + | IPC_SYMBOL + | ISOLATION_SYMBOL + | ISSUER_SYMBOL + | INSERT_METHOD_SYMBOL + | JSON_SYMBOL + | KEY_BLOCK_SIZE_SYMBOL + | LAST_SYMBOL + | LEAVES_SYMBOL + | LESS_SYMBOL + | LEVEL_SYMBOL + | LINESTRING_SYMBOL + | LIST_SYMBOL + | LOCAL_SYMBOL + | LOCKED_SYMBOL + | LOCKS_SYMBOL + | LOGFILE_SYMBOL + | LOGS_SYMBOL + | MAX_ROWS_SYMBOL + | MASTER_SYMBOL + | MASTER_HEARTBEAT_PERIOD_SYMBOL + | MASTER_HOST_SYMBOL + | MASTER_PORT_SYMBOL + | MASTER_LOG_FILE_SYMBOL + | MASTER_LOG_POS_SYMBOL + | MASTER_USER_SYMBOL + | MASTER_PASSWORD_SYMBOL + | MASTER_PUBLIC_KEY_PATH_SYMBOL + | MASTER_CONNECT_RETRY_SYMBOL + | MASTER_RETRY_COUNT_SYMBOL + | MASTER_DELAY_SYMBOL + | MASTER_SSL_SYMBOL + | MASTER_SSL_CA_SYMBOL + | MASTER_SSL_CAPATH_SYMBOL + | MASTER_TLS_VERSION_SYMBOL + | MASTER_SSL_CERT_SYMBOL + | MASTER_SSL_CIPHER_SYMBOL + | MASTER_SSL_CRL_SYMBOL + | MASTER_SSL_CRLPATH_SYMBOL + | MASTER_SSL_KEY_SYMBOL + | MASTER_AUTO_POSITION_SYMBOL + | MAX_CONNECTIONS_PER_HOUR_SYMBOL + | MAX_QUERIES_PER_HOUR_SYMBOL + | MAX_SIZE_SYMBOL + | MAX_UPDATES_PER_HOUR_SYMBOL + | MAX_USER_CONNECTIONS_SYMBOL + | MEDIUM_SYMBOL + | MEMORY_SYMBOL + | MERGE_SYMBOL + | MESSAGE_TEXT_SYMBOL + | MICROSECOND_SYMBOL + | MIGRATE_SYMBOL + | MINUTE_SYMBOL + | MIN_ROWS_SYMBOL + | MODIFY_SYMBOL + | MODE_SYMBOL + | MONTH_SYMBOL + | MULTILINESTRING_SYMBOL + | MULTIPOINT_SYMBOL + | MULTIPOLYGON_SYMBOL + | MUTEX_SYMBOL + | MYSQL_ERRNO_SYMBOL + | NAME_SYMBOL + | NAMES_SYMBOL + | NATIONAL_SYMBOL + | NCHAR_SYMBOL + | NDBCLUSTER_SYMBOL + | NESTED_SYMBOL + | NEVER_SYMBOL + | NEXT_SYMBOL + | NEW_SYMBOL + | NO_WAIT_SYMBOL + | NODEGROUP_SYMBOL + | NULLS_SYMBOL + | NOWAIT_SYMBOL + | NUMBER_SYMBOL + | NVARCHAR_SYMBOL + | OFFSET_SYMBOL + | OLD_SYMBOL + | ONE_SYMBOL + | OPTIONAL_SYMBOL + | ORDINALITY_SYMBOL + | ORGANIZATION_SYMBOL + | OTHERS_SYMBOL + | PACK_KEYS_SYMBOL + | PAGE_SYMBOL + | PARTIAL_SYMBOL + | PARTITIONING_SYMBOL + | PARTITIONS_SYMBOL + | PASSWORD_SYMBOL + | PATH_SYMBOL + | PHASE_SYMBOL + | PLUGIN_DIR_SYMBOL + | PLUGIN_SYMBOL + | PLUGINS_SYMBOL + | POINT_SYMBOL + | POLYGON_SYMBOL + | PRECEDING_SYMBOL + | PRESERVE_SYMBOL + | PREV_SYMBOL + | THREAD_PRIORITY_SYMBOL + | PRIVILEGES_SYMBOL + | PROCESSLIST_SYMBOL + | PROFILE_SYMBOL + | PROFILES_SYMBOL + | QUARTER_SYMBOL + | QUERY_SYMBOL + | QUICK_SYMBOL + | READ_ONLY_SYMBOL + | REBUILD_SYMBOL + | RECOVER_SYMBOL + | REDO_BUFFER_SIZE_SYMBOL + | REDUNDANT_SYMBOL + | RELAY_SYMBOL + | RELAYLOG_SYMBOL + | RELAY_LOG_FILE_SYMBOL + | RELAY_LOG_POS_SYMBOL + | RELAY_THREAD_SYMBOL + | REMOTE_SYMBOL + | REORGANIZE_SYMBOL + | REPEATABLE_SYMBOL + | REPLICATE_DO_DB_SYMBOL + | REPLICATE_IGNORE_DB_SYMBOL + | REPLICATE_DO_TABLE_SYMBOL + | REPLICATE_IGNORE_TABLE_SYMBOL + | REPLICATE_WILD_DO_TABLE_SYMBOL + | REPLICATE_WILD_IGNORE_TABLE_SYMBOL + | REPLICATE_REWRITE_DB_SYMBOL + | USER_RESOURCES_SYMBOL + | RESPECT_SYMBOL + | RESUME_SYMBOL + | RETAIN_SYMBOL + | RETURNED_SQLSTATE_SYMBOL + | RETURNS_SYMBOL + | REUSE_SYMBOL + | REVERSE_SYMBOL + | ROLLUP_SYMBOL + | ROTATE_SYMBOL + | ROUTINE_SYMBOL + | ROW_COUNT_SYMBOL + | ROW_FORMAT_SYMBOL + | RTREE_SYMBOL + | SCHEDULE_SYMBOL + | SCHEMA_NAME_SYMBOL + | SECOND_SYMBOL + | SERIAL_SYMBOL + | SERIALIZABLE_SYMBOL + | SESSION_SYMBOL + | SHARE_SYMBOL + | SIMPLE_SYMBOL + | SKIP_SYMBOL + | SLOW_SYMBOL + | SNAPSHOT_SYMBOL + | SOUNDS_SYMBOL + | SOURCE_SYMBOL + | SQL_AFTER_GTIDS_SYMBOL + | SQL_AFTER_MTS_GAPS_SYMBOL + | SQL_BEFORE_GTIDS_SYMBOL + | SQL_BUFFER_RESULT_SYMBOL + | SQL_NO_CACHE_SYMBOL + | SQL_THREAD_SYMBOL + | SRID_SYMBOL + | STACKED_SYMBOL + | STARTS_SYMBOL + | STATS_AUTO_RECALC_SYMBOL + | STATS_PERSISTENT_SYMBOL + | STATS_SAMPLE_PAGES_SYMBOL + | STATUS_SYMBOL + | STORAGE_SYMBOL + | STRING_SYMBOL + | SUBCLASS_ORIGIN_SYMBOL + | SUBDATE_SYMBOL + | SUBJECT_SYMBOL + | SUBPARTITION_SYMBOL + | SUBPARTITIONS_SYMBOL + | SUPER_SYMBOL + | SUSPEND_SYMBOL + | SWAPS_SYMBOL + | SWITCHES_SYMBOL + | TABLE_NAME_SYMBOL + | TABLES_SYMBOL + | TABLE_CHECKSUM_SYMBOL + | TABLESPACE_SYMBOL + | TEMPORARY_SYMBOL + | TEMPTABLE_SYMBOL + | TEXT_SYMBOL + | THAN_SYMBOL + | TIES_SYMBOL + | TRANSACTION_SYMBOL + | TRIGGERS_SYMBOL + | TIMESTAMP_SYMBOL + | TIMESTAMPADD_SYMBOL + | TIMESTAMPDIFF_SYMBOL + | TIME_SYMBOL + | TYPES_SYMBOL + | TYPE_SYMBOL + | UDF_RETURNS_SYMBOL + | UNBOUNDED_SYMBOL + | UNCOMMITTED_SYMBOL + | UNDEFINED_SYMBOL + | UNDO_BUFFER_SIZE_SYMBOL + | UNDOFILE_SYMBOL + | UNKNOWN_SYMBOL + | UNTIL_SYMBOL + | USER_SYMBOL + | USE_FRM_SYMBOL + | VARIABLES_SYMBOL + | VCPU_SYMBOL + | VIEW_SYMBOL + | VALUE_SYMBOL + | WARNINGS_SYMBOL + | WAIT_SYMBOL + | WEEK_SYMBOL + | WORK_SYMBOL + | WEIGHT_STRING_SYMBOL + | X509_SYMBOL + | XID_SYMBOL + | XML_SYMBOL + | YEAR_SYMBOL + ) + // Tokens that entered or left this rule in specific versions and are not automatically + // handled in the lexer. + | {this.serverVersion >= 80014}? ADMIN_SYMBOL + ; diff --git a/sql/mysql/Oracle/original/README.md b/sql/mysql/Oracle/original/README.md new file mode 100644 index 0000000000..7d3948d9a0 --- /dev/null +++ b/sql/mysql/Oracle/original/README.md @@ -0,0 +1,50 @@ +# Oracle's MySQL Grammar + +## General + +For more than a decade, the MySQL GUI development tools team at Oracle has provided the open source +[MySQL Workbench](https://github.com/mysql/mysql-workbench), which uses ANTLR4 for all MySQL code parsing tasks. This requires to translate all changes from the +[MySQL server grammar](https://github.com/mysql/mysql-server/blob/8.0/sql/sql_yacc.yy) to ANTLR4, which is an ongoing effort to always stay up-to-date with the latest and greatest server features (like the Multi Language Extension (MLE) for stored routines). The current grammar supports all MySQL versions starting with 8.0. + +Meanwhile, development focus has been shifted to the [MySQL Shell for VS Code extension](https://marketplace.visualstudio.com/items?itemName=Oracle.mysql-shell-for-vs-code), which is the original source of the grammar you can find here. + +Parser generated from this grammar are very fast (given the high ambiguity of the MySQL language). For details see the [ANTLR4 runtime benchmarks](https://github.com/mike-lischke/antlr4-runtime-benchmarks/tree/main/src/mysql) repository. + +Like all of Oracle's open source, this grammar is released under the GPLv2. + +## Correct and Flexible Parsing + +In order for applications like MySQL Shell for VS Code to parse MySQL code correctly, some conditions must be considered, namely the currently used MySQL **server version** and the active **SQL modes** (e.g. to distinguish between identifiers and double-quoted strings, depending on the ANSI mode setting). There are also some peculiarities to consider: + +- [String literal concatenation and Character set introducers (aka underscore char sets or string repertoires)](https://dev.mysql.com/doc/refman/8.0/en/string-literals.html). +- [Keyword after dot](https://dev.mysql.com/doc/refman/8.0/en/keywords.html) +- [Built-in function name parsing](https://dev.mysql.com/doc/refman/8.0/en/function-resolution.html). The IGNORE_SPACE SQL mode is properly handled. +- [Version Comments](https://dev.mysql.com/doc/refman/8.0/en/comments.html), like `CREATE TABLE t1(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024 */;` + +The server version and SQL mode can be toggled at runtime, allowing the use of a single parser with different version/mode settings and providing better error messages (like for [a feature that is only valid for a specific version](https://github.com/mysql/mysql-shell-plugins/blob/master/gui/frontend/src/parsing/mysql/MySQLErrorListener.ts#L109)). + +String repertoires require a list of character set identifiers, which must be provided by your implementation. You can get a list of available character sets by running `show character set`. + +## Using the Grammar + +To provide the full feature set the MySQL grammar needs some support code, which is implemented in base classes for both, the MySQL Parser (named `MySQLBaseRecognizer`) and the MySQL Lexer (named `MySQLBaseLexer`). You can find a TypeScript implementation of both classes in the TypeScript/ folder, which should be easy to port over to different runtime languages. + +This folder also contains a demo script that shows how to set up the MySQL lexer and parser and parse some input. It needs the TS runtime antlr4ng (and some additional modules to allow running the demo). For this run the node module installation in the TypeScript/ folder: + +```bash +npm i +``` + +After that you can generate the (TypeScript) parser and lexer files by running: + +```bash +npm run generate +``` + +A new folder is created name `generated`, which contains the new files. Now the demo is ready for execution: + +```bash +npm run demo +``` + +It will run a simple MySQL query and prints its parse tree. diff --git a/sql/mysql/Oracle/TypeScript/MySQLBaseLexer.ts b/sql/mysql/Oracle/original/TypeScript/MySQLBaseLexer.ts similarity index 100% rename from sql/mysql/Oracle/TypeScript/MySQLBaseLexer.ts rename to sql/mysql/Oracle/original/TypeScript/MySQLBaseLexer.ts diff --git a/sql/mysql/Oracle/TypeScript/MySQLBaseRecognizer.ts b/sql/mysql/Oracle/original/TypeScript/MySQLBaseRecognizer.ts similarity index 100% rename from sql/mysql/Oracle/TypeScript/MySQLBaseRecognizer.ts rename to sql/mysql/Oracle/original/TypeScript/MySQLBaseRecognizer.ts diff --git a/sql/mysql/Oracle/TypeScript/demo.ts b/sql/mysql/Oracle/original/TypeScript/demo.ts similarity index 100% rename from sql/mysql/Oracle/TypeScript/demo.ts rename to sql/mysql/Oracle/original/TypeScript/demo.ts diff --git a/sql/mysql/Oracle/TypeScript/package.json b/sql/mysql/Oracle/original/TypeScript/package.json similarity index 100% rename from sql/mysql/Oracle/TypeScript/package.json rename to sql/mysql/Oracle/original/TypeScript/package.json diff --git a/sql/mysql/Oracle/TypeScript/tsconfig.json b/sql/mysql/Oracle/original/TypeScript/tsconfig.json similarity index 100% rename from sql/mysql/Oracle/TypeScript/tsconfig.json rename to sql/mysql/Oracle/original/TypeScript/tsconfig.json