protected void ScanBitField(bool quoteMode) { offsetCache = curIndex; for (; ch == '0' || ch == '1'; ScanChar()) { ; } sizeCache = curIndex - offsetCache; if (quoteMode) { if (ch != '\'') { throw new Exception("invalid char for bit: " + ch); } ScanChar(); } else if (CharTypes.IsIdentifierChar(ch)) { ScanIdentifierFromNumber(offsetCache - 2, sizeCache + 2); return; } token = MySQLToken.LITERAL_BIT; stringValue = new string(sql, offsetCache, sizeCache); }
protected void ScanSystemVeriable() { if (ch != '@' || sql[curIndex + 1] != '@') { throw err("first char must be @@"); } offsetCache = curIndex + 2; sizeCache = 0; ScanChar(2); if (ch == '`') { for (++sizeCache; ; ++sizeCache) { if (ScanChar() == '`') { ++sizeCache; if (ScanChar() != '`') { break; } } } } else { for (; CharTypes.IsIdentifierChar(ch); ++sizeCache) { ScanChar(); } } UpdateStringValue(sql, offsetCache, sizeCache); token = MySQLToken.SYS_VAR; }
protected void ScanIdentifierWithAccent() { offsetCache = curIndex; for (; ScanChar() != MySQLLexer.EOI;) { if (ch == '`' && ScanChar() != '`') { break; } } UpdateStringValue(sql, offsetCache, sizeCache = curIndex - offsetCache); token = MySQLToken.IDENTIFIER; }
private void ScanIdentifierFromNumber(int initOffset, int initSize) { this.offsetCache = initOffset; this.sizeCache = initSize; for (; CharTypes.IsIdentifierChar(ch); ++sizeCache) { ScanChar(); } UpdateStringValue(sql, offsetCache, sizeCache); MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase); this.token = tok == MySQLToken.NONE ? MySQLToken.IDENTIFIER ? tok; }
protected void ScanPlaceHolder() { this.offsetCache = curIndex + 1; this.sizeCache = 0; for (ScanChar(); ch != '}' && !IsEof(); ++sizeCache) { ScanChar(); } if (ch == '}') { ScanChar(); } UpdateStringValue(sql, offsetCache, sizeCache); token = MySQLToken.PLACE_HOLDER; }
public IExpression Expression() { MySQLToken token = lexer.Token(); if (token == null) { token = lexer.NextToken(); } if (token == MySQLToken.EOF) { throw new ArgumentException("unexpected EOF"); } IExpression left = }
protected void ScanHexaDecimal(bool quoteMode) { this.offsetCache = this.curIndex; this.sizeCache = this.curIndex - this.offsetCache; if (quoteMode) { if (ch != '\'') { throw new ArgumentException("invalid char for hex: " + ch); } ScanChar(); } else if (CharTypes.IsIdentifierChar(ch)) { ScanIdentifierFromNumber(offsetCache - 2, sizeCache + 2); return; } this.token = MySQLToken.LITERAL_HEX; }
protected int Match(params MySQLToken[] expectToken) { if (expectToken == null || expectToken.Length <= 0) { throw new ArgumentException("at least one expect token"); } MySQLToken token = lexer.Token(); for (int i = 0; i < expectToken.Length; ++i) { if (token == expectToken[i]) { if (token != MySQLToken.EOF || i < expectToken.Length - 1) { lexer.NextToken(); } return(i); } } throw new ArgumentException("expect " + expectToken); }
private MySQLToken NextTokenInternal() { switch (ch) { case '0': switch (sql[curIndex + 1]) { case 'x': ScanChar(2); ScanHexaDecimal(false); return(token); case 'b': ScanChar(2); ScanBitField(false); return(token); } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ScanNumber(); return(token); case '.': if (CharTypes.IsDigit(sql[curIndex + 1])) { ScanNumber(); } else { ScanChar(); token = MySQLToken.PUNC_DOT; } return(token); case '\'': case '"': ScanString(); return(token); case 'n': case 'N': if (sql[curIndex + 1] == '\'') { ScanChar(); ScanString(); token = MySQLToken.LITERAL_NCHARS; return(token); } ScanIdentifier(); return(token); case 'x': case 'X': if (sql[curIndex + 1] == '\'') { ScanChar(2); ScanHexaDecimal(true); return(token); } ScanIdentifier(); return(token); case 'b': case 'B': if (sql[curIndex + 1] == '\'') { ScanChar(2); ScanBitField(true); return(token); } ScanIdentifier(); return(token); case '@': if (sql[curIndex + 1] == '@') { ScanSystemVariable(); return(token); } ScanUserVariable(); return(token); case '?': ScanChar(); token = MySQLToken.QUESTION_MARK; ++paramIndex; return(token); case '(': ScanChar(); token = MySQLToken.PUNC_LEFT_PAREN; return(token); case ')': ScanChar(); token = MySQLToken.PUNC_RIGHT_PAREN; return(token); case '[': ScanChar(); token = MySQLToken.PUNC_LEFT_BRACKET; return(token); case ']': ScanChar(); token = MySQLToken.PUNC_RIGHT_BRACKET; return(token); case '{': ScanChar(); token = MySQLToken.PUNC_LEFT_BRACE; return(token); case '}': ScanChar(); token = MySQLToken.PUNC_RIGHT_BRACE; return(token); case ',': ScanChar(); token = MySQLToken.PUNC_COMMA; return(token); case ';': ScanChar(); token = MySQLToken.PUNC_SEMICOLON; return(token); case ':': if (sql[curIndex + 1] == '=') { ScanChar(2); token = MySQLToken.OP_ASSIGN; return(token); } ScanChar(); token = MySQLToken.PUNC_COLON; return(token); case '=': ScanChar(); token = MySQLToken.OP_EQUALS; return(token); case '~': ScanChar(); token = MySQLToken.OP_TILDE; return(token); case '*': if (inCStyleComment && sql[curIndex + 1] == '/') { inCStyleComment = false; inCStyleCommentIgnore = false; ScanChar(2); token = MySQLToken.PUNC_C_STYLE_COMMENT_END; return(token); } ScanChar(); token = MySQLToken.OP_ASTERISK; return(token); case '-': ScanChar(); token = MySQLToken.OP_MINUS; return(token); case '+': ScanChar(); token = MySQLToken.OP_PLUS; return(token); case '^': ScanChar(); token = MySQLToken.OP_CARET; return(token); case '/': ScanChar(); token = MySQLToken.OP_SLASH; return(token); case '%': ScanChar(); token = MySQLToken.OP_PERCENT; return(token); case '&': if (sql[curIndex + 1] == '&') { ScanChar(2); token = MySQLToken.OP_LOGICAL_AND; return(token); } ScanChar(); token = MySQLToken.OP_AMPERSAND; return(token); case '|': if (sql[curIndex + 1] == '|') { ScanChar(2); token = MySQLToken.OP_LOGICAL_OR; return(token); } ScanChar(); token = MySQLToken.OP_VERTICAL_BAR; return(token); case '!': if (sql[curIndex + 1] == '=') { ScanChar(2); token = MySQLToken.OP_NOT_EQUALS; return(token); } ScanChar(); token = MySQLToken.OP_EXCLAMATION; return(token); case '>': switch (sql[curIndex + 1]) { case '=': ScanChar(2); token = MySQLToken.OP_GREATER_OR_EQUALS; return(token); case '>': ScanChar(2); token = MySQLToken.OP_RIGHT_SHIFT; return(token); default: ScanChar(); token = MySQLToken.OP_GREATER_THAN; return(token); } case '<': switch (sql[curIndex + 1]) { case '=': if (sql[curIndex + 2] == '>') { ScanChar(3); token = MySQLToken.OP_NULL_SAFE_EQUALS; return(token); } ScanChar(2); token = MySQLToken.OP_LESS_OR_EQUALS; return(token); case '>': ScanChar(2); token = MySQLToken.OP_LESS_OR_GREATER; return(token); case '<': ScanChar(2); token = MySQLToken.OP_LEFT_SHIFT; return(token); default: ScanChar(); token = MySQLToken.OP_LESS_THAN; return(token); } case '`': ScanIdentifierWithAccent(); return(token); default: if (CharTypes.IsIdentifierChar(ch)) { ScanIdentifier(); } else if (IsEof()) { token = MySQLToken.EOF; curIndex = eofIndex; //tokenPos = curIndex; } else { throw new ArgumentException("unsupported character: " + ch); } return(token); } }
protected void ScanUserVeriable() { if (ch != '@') { throw new ArgumentException("first char must be @"); } offsetCache = curIndex; sizeCache = 1; bool dq = false; switch (ScanChar()) { case '"': dq = true; break; case '\'': for (++sizeCache; ; ++sizeCache) { switch (ScanChar()) { case '\\': ++sizeCache; ScanChar(); break; case '"': if (dq) { ++sizeCache; if (ScanChar() == '"') { break; } goto label3; } break; case '\'': if (!dq) { ++sizeCache; if (ScanChar() == '\'') { break; } goto label3; } break; } } label3: break; case '`': loop1 : for (++sizeCache; ; ++sizeCache) { switch (ScanChar()) { case '`': ++sizeCache; if (ScanChar() == '`') { break; } goto label4; } } label4: break; default: for (; CharTypes.IsIdentifierChar(ch) || ch == '.'; ++sizeCache) { ScanChar(); } break; } stringValue = new String(sql, offsetCache, sizeCache); token = MySQLToken.USR_VAR; }
protected void ScanString() { bool dq = false; if (ch == '\'') { } else if (ch == '"') { dq = true; } else { throw new ArgumentException("first char must be \" or '"); } offsetCache = curIndex; int size = 1; sbuf[0] = '\''; if (dq) { while (true) { switch (ScanChar()) { case '\'': PutChar('\\', size++); PutChar('\'', size++); break; case '\\': PutChar('\\', size++); PutChar(ScanChar(), size++); continue; case '"': if (sql[curIndex + 1] == '"') { PutChar('"', size++); ScanChar(); continue; } PutChar('\'', size++); ScanChar(); goto label1; default: if (IsEof()) { throw new ArgumentException("unclosed string"); } PutChar(ch, size++); continue; } } label1: ; } else { while (true) { switch (ScanChar()) { case '\\': PutChar('\\', size++); PutChar(ScanChar(), size++); continue; case '\'': if (sql[curIndex + 1] == '\'') { PutChar('\\', size++); PutChar(ScanChar(), size++); continue; } PutChar('\'', size++); ScanChar(); goto label2; default: if (IsEof()) { throw new ArgumentException("unclosed string"); } PutChar(ch, size++); continue; } } label2: ; } sizeCache = size; stringValue = new String(sbuf, 0, size); token = MySQLToken.LITERAL_CHARS; }
protected void ScanNumber() { offsetCache = curIndex; sizeCache = 1; bool fstDot = ch == '.'; bool dot = fstDot; bool sign = false; int state = fstDot ? 1 : 0; for (; ScanChar() != MySQLLexer.EOI; ++sizeCache) { switch (state) { case 0: if (CharTypes.IsDigit(ch)) { } else if (ch == '.') { dot = true; state = 1; } else if (ch == 'e' || ch == 'E') { state = 3; } else if (CharTypes.IsIdentifierChar(ch)) { ScanIdentifierFromNumber(offsetCache, sizeCache); return; } else { token = MySQLToken.LITERAL_NUM_PURE_DIGIT; return; } break; case 1: if (CharTypes.IsDigit(ch)) { state = 2; } else if (ch == 'e' || ch == 'E') { state = 3; } else if (CharTypes.IsIdentifierChar(ch) && fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; return; } else { token = MySQLToken.LITERAL_NUM_MIX_DIGIT; return; } break; case 2: if (CharTypes.IsDigit(ch)) { } else if (ch == 'e' || ch == 'E') { state = 3; } else if (CharTypes.IsIdentifierChar(ch) && fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; return; } else { token = MySQLToken.LITERAL_NUM_MIX_DIGIT; return; } break; case 3: if (CharTypes.IsDigit(ch)) { state = 5; } else if (ch == '+' || ch == '-') { sign = true; state = 4; } else if (fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; return; } else if (!dot) { if (CharTypes.IsIdentifierChar(ch)) { ScanIdentifierFromNumber(offsetCache, sizeCache); } else { UpdateStringValue(sql, offsetCache, sizeCache); MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase); token = tok == null ? MySQLToken.IDENTIFIER : tok; } return; } else { throw new ArgumentException("invalid char after '.' and 'e' for as part of number: " + ch); } break; case 4: if (CharTypes.IsDigit(ch)) { state = 5; break; } else if (fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; } else if (!dot) { ch = sql[--curIndex]; --sizeCache; UpdateStringValue(sql, offsetCache, sizeCache); MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase); token = tok == null ? MySQLToken.IDENTIFIER : tok; } else { throw new ArgumentException("expect digit char after SIGN for 'e': " + ch); } return; case 5: if (CharTypes.IsDigit(ch)) { break; } else if (CharTypes.IsIdentifierChar(ch)) { if (fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; } else if (!dot) { if (sign) { ch = sql[curIndex = offsetCache]; ScanIdentifierFromNumber(curIndex, 0); } else { ScanIdentifierFromNumber(offsetCache, sizeCache); } } else { token = MySQLToken.LITERAL_NUM_MIX_DIGIT; } } else { token = MySQLToken.LITERAL_NUM_MIX_DIGIT; } return; } } switch (state) { case 0: token = MySQLToken.LITERAL_NUM_PURE_DIGIT; return; case 1: if (fstDot) { token = MySQLToken.PUNC_DOT; return; } break; case 2: case 5: token = MySQLToken.LITERAL_NUM_MIX_DIGIT; return; case 3: if (fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; } else if (!dot) { UpdateStringValue(sql, offsetCache, sizeCache); MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase); token = tok == null ? MySQLToken.IDENTIFIER : tok; } else { throw new ArgumentException("expect digit char after SIGN for 'e': " + ch); } return; case 4: if (fstDot) { sizeCache = 1; ch = sql[curIndex = offsetCache + 1]; token = MySQLToken.PUNC_DOT; } else if (!dot) { ch = sql[--curIndex]; --sizeCache; UpdateStringValue(sql, offsetCache, sizeCache); MySQLToken tok = MySQLKeywords.Instance.GetKeyword(stringValueUppercase); token = tok == null ? MySQLToken.IDENTIFIER : tok; } else { throw new ArgumentException("expect digit char after SIGN for 'e': " + ch); } return; } }
public static string ToValue(this MySQLToken token) { switch (token) { case MySQLToken.KW_ACCESSIBLE: return("ACCESSIBLE"); case MySQLToken.KW_ADD: return("ADD"); case MySQLToken.KW_ALL: return("ALL"); case MySQLToken.KW_ALTER: return("ALTER"); case MySQLToken.KW_ANALYZE: return("ANALYZE"); case MySQLToken.KW_AND: return("AND"); case MySQLToken.KW_AS: return("AS"); case MySQLToken.KW_ASC: return("ASC"); case MySQLToken.KW_ASENSITIVE: return("ASENSITIVE"); case MySQLToken.KW_BEFORE: return("BEFORE"); case MySQLToken.KW_BETWEEN: return("BETWEEN"); case MySQLToken.KW_BIGINT: return("BIGINT"); case MySQLToken.KW_BINARY: return("BINARY"); case MySQLToken.KW_BLOB: return("BLOB"); case MySQLToken.KW_BOTH: return("BOTH"); case MySQLToken.KW_BY: return("BY"); case MySQLToken.KW_CALL: return("CALL"); case MySQLToken.KW_CASCADE: return("CASCADE"); case MySQLToken.KW_CASE: return("CASE"); case MySQLToken.KW_CHANGE: return("CHANGE"); case MySQLToken.KW_CHAR: return("CHAR"); case MySQLToken.KW_CHARACTER: return("CHARACTER"); case MySQLToken.KW_CHECK: return("CHECK"); case MySQLToken.KW_COLLATE: return("COLLATE"); case MySQLToken.KW_COLUMN: return("COLUMN"); case MySQLToken.KW_CONDITION: return("CONDITION"); case MySQLToken.KW_CONSTRAINT: return("CONSTRAINT"); case MySQLToken.KW_CONTINUE: return("CONTINUE"); case MySQLToken.KW_CONVERT: return("CONVERT"); case MySQLToken.KW_CREATE: return("CREATE"); case MySQLToken.KW_CROSS: return("CROSS"); case MySQLToken.KW_CURRENT_DATE: return("CURRENT_DATE"); case MySQLToken.KW_CURRENT_TIME: return("CURRENT_TIME"); case MySQLToken.KW_CURRENT_TIMESTAMP: return("CURRENT_TIMESTAMP"); case MySQLToken.KW_CURRENT_USER: return("CURRENT_USER"); case MySQLToken.KW_CURSOR: return("CURSOR"); case MySQLToken.KW_DATABASE: return("DATABASE"); case MySQLToken.KW_DATABASES: return("DATABASES"); case MySQLToken.KW_DAY_HOUR: return("DAY_HOUR"); case MySQLToken.KW_DAY_MICROSECOND: return("DAY_MICROSECOND"); case MySQLToken.KW_DAY_MINUTE: return("DAY_MINUTE"); case MySQLToken.KW_DAY_SECOND: return("DAY_SECOND"); case MySQLToken.KW_DEC: return("DEC"); case MySQLToken.KW_DECIMAL: return("DECIMAL"); case MySQLToken.KW_DECLARE: return("DECLARE"); case MySQLToken.KW_DEFAULT: return("DEFAULT"); case MySQLToken.KW_DELAYED: return("DELAYED"); case MySQLToken.KW_DELETE: return("DELETE"); case MySQLToken.KW_DESC: return("DESC"); case MySQLToken.KW_DESCRIBE: return("DESCRIBE"); case MySQLToken.KW_DETERMINISTIC: return("DETERMINISTIC"); case MySQLToken.KW_DISTINCT: return("DISTINCT"); case MySQLToken.KW_DISTINCTROW: return("DISTINCTROW"); case MySQLToken.KW_DIV: return("DIV"); case MySQLToken.KW_DOUBLE: return("DOUBLE"); case MySQLToken.KW_DROP: return("DROP"); case MySQLToken.KW_DUAL: return("DUAL"); case MySQLToken.KW_EACH: return("EACH"); case MySQLToken.KW_ELSE: return("ELSE"); case MySQLToken.KW_ELSEIF: return("ELSEIF"); case MySQLToken.KW_ENCLOSED: return("ENCLOSED"); case MySQLToken.KW_ESCAPED: return("ESCAPED"); case MySQLToken.KW_EXISTS: return("EXISTS"); case MySQLToken.KW_EXIT: return("EXIT"); case MySQLToken.KW_EXPLAIN: return("EXPLAIN"); case MySQLToken.KW_FETCH: return("FETCH"); case MySQLToken.KW_FLOAT: return("FLOAT"); case MySQLToken.KW_FLOAT4: return("FLOAT4"); case MySQLToken.KW_FLOAT8: return("FLOAT8"); case MySQLToken.KW_FOR: return("FOR"); case MySQLToken.KW_FORCE: return("FORCE"); case MySQLToken.KW_FOREIGN: return("FOREIGN"); case MySQLToken.KW_FROM: return("FROM"); case MySQLToken.KW_FULLTEXT: return("FULLTEXT"); case MySQLToken.KW_GENERAL: return("GENERAL"); case MySQLToken.KW_GRANT: return("GRANT"); case MySQLToken.KW_GROUP: return("GROUP"); case MySQLToken.KW_HAVING: return("HAVING"); case MySQLToken.KW_HIGH_PRIORITY: return("HIGH_PRIORITY"); case MySQLToken.KW_HOUR_MICROSECOND: return("HOUR_MICROSECOND"); case MySQLToken.KW_HOUR_MINUTE: return("HOUR_MINUTE"); case MySQLToken.KW_HOUR_SECOND: return("HOUR_SECOND"); case MySQLToken.KW_IF: return("IF"); case MySQLToken.KW_IGNORE: return("IGNORE"); case MySQLToken.KW_IGNORE_SERVER_IDS: return("IGNORE_SERVER_IDS"); case MySQLToken.KW_IN: return("IN"); case MySQLToken.KW_INDEX: return("INDEX"); case MySQLToken.KW_INFILE: return("INFILE"); case MySQLToken.KW_INNER: return("INNER"); case MySQLToken.KW_INOUT: return("INOUT"); case MySQLToken.KW_INSENSITIVE: return("INSENSITIVE"); case MySQLToken.KW_INSERT: return("INSERT"); case MySQLToken.KW_INT: return("INT"); case MySQLToken.KW_INT1: return("INT1"); case MySQLToken.KW_INT2: return("INT2"); case MySQLToken.KW_INT3: return("INT3"); case MySQLToken.KW_INT4: return("INT4"); case MySQLToken.KW_INT8: return("INT8"); case MySQLToken.KW_INTEGER: return("INTEGER"); case MySQLToken.KW_INTERVAL: return("INTERVAL"); case MySQLToken.KW_INTO: return("INTO"); case MySQLToken.KW_IS: return("IS"); case MySQLToken.KW_ITERATE: return("ITERATE"); case MySQLToken.KW_JOIN: return("JOIN"); case MySQLToken.KW_KEY: return("KEY"); case MySQLToken.KW_KEYS: return("KEYS"); case MySQLToken.KW_KILL: return("KILL"); case MySQLToken.KW_LEADING: return("LEADING"); case MySQLToken.KW_LEAVE: return("LEAVE"); case MySQLToken.KW_LEFT: return("LEFT"); case MySQLToken.KW_LIKE: return("LIKE"); case MySQLToken.KW_LIMIT: return("LIMIT"); case MySQLToken.KW_LINEAR: return("LINEAR"); case MySQLToken.KW_LINES: return("LINES"); case MySQLToken.KW_LOAD: return("LOAD"); case MySQLToken.KW_LOCALTIME: return("LOCALTIME"); case MySQLToken.KW_LOCALTIMESTAMP: return("LOCALTIMESTAMP"); case MySQLToken.KW_LOCK: return("LOCK"); case MySQLToken.KW_LONG: return("LONG"); case MySQLToken.KW_LONGBLOB: return("LONGBLOB"); case MySQLToken.KW_LONGTEXT: return("LONGTEXT"); case MySQLToken.KW_LOOP: return("LOOP"); case MySQLToken.KW_LOW_PRIORITY: return("LOW_PRIORITY"); case MySQLToken.KW_MASTER_HEARTBEAT_PERIOD: return("MASTER_HEARTBEAT_PERIOD"); case MySQLToken.KW_MASTER_SSL_VERIFY_SERVER_CERT: return("MASTER_SSL_VERIFY_SERVER_CERT"); case MySQLToken.KW_MATCH: return("MATCH"); case MySQLToken.KW_MAXVALUE: return("MAXVALUE"); case MySQLToken.KW_MEDIUMBLOB: return("MEDIUMBLOB"); case MySQLToken.KW_MEDIUMINT: return("MEDIUMINT"); case MySQLToken.KW_MEDIUMTEXT: return("MEDIUMTEXT"); case MySQLToken.KW_MIDDLEINT: return("MIDDLEINT"); case MySQLToken.KW_MINUTE_MICROSECOND: return("MINUTE_MICROSECOND"); case MySQLToken.KW_MINUTE_SECOND: return("MINUTE_SECOND"); case MySQLToken.KW_MOD: return("MOD"); case MySQLToken.KW_MODIFIES: return("MODIFIES"); case MySQLToken.KW_NATURAL: return("NATURAL"); case MySQLToken.KW_NOT: return("NOT"); case MySQLToken.KW_NO_WRITE_TO_BINLOG: return("NO_WRITE_TO_BINLOG"); case MySQLToken.KW_NUMERIC: return("NUMERIC"); case MySQLToken.KW_ON: return("ON"); case MySQLToken.KW_OPTIMIZE: return("OPTIMIZE"); case MySQLToken.KW_OPTION: return("OPTION"); case MySQLToken.KW_OPTIONALLY: return("OPTIONALLY"); case MySQLToken.KW_OR: return("OR"); case MySQLToken.KW_ORDER: return("ORDER"); case MySQLToken.KW_OUT: return("OUT"); case MySQLToken.KW_OUTER: return("OUTER"); case MySQLToken.KW_OUTFILE: return("OUTFILE"); case MySQLToken.KW_PRECISION: return("PRECISION"); case MySQLToken.KW_PRIMARY: return("PRIMARY"); case MySQLToken.KW_PROCEDURE: return("PROCEDURE"); case MySQLToken.KW_PURGE: return("PURGE"); case MySQLToken.KW_RANGE: return("RANGE"); case MySQLToken.KW_READ: return("READ"); case MySQLToken.KW_READS: return("READS"); case MySQLToken.KW_READ_WRITE: return("READ_WRITE"); case MySQLToken.KW_REAL: return("REAL"); case MySQLToken.KW_REFERENCES: return("REFERENCES"); case MySQLToken.KW_REGEXP: return("REGEXP"); case MySQLToken.KW_RELEASE: return("RELEASE"); case MySQLToken.KW_RENAME: return("RENAME"); case MySQLToken.KW_REPEAT: return("REPEAT"); case MySQLToken.KW_REPLACE: return("REPLACE"); case MySQLToken.KW_REQUIRE: return("REQUIRE"); case MySQLToken.KW_RESIGNAL: return("RESIGNAL"); case MySQLToken.KW_RESTRICT: return("RESTRICT"); case MySQLToken.KW_RETURN: return("RETURN"); case MySQLToken.KW_REVOKE: return("REVOKE"); case MySQLToken.KW_RIGHT: return("RIGHT"); case MySQLToken.KW_RLIKE: return("RLIKE"); case MySQLToken.KW_SCHEMA: return("SCHEMA"); case MySQLToken.KW_SCHEMAS: return("SCHEMAS"); case MySQLToken.KW_SECOND_MICROSECOND: return("SECOND_MICROSECOND"); case MySQLToken.KW_SELECT: return("SELECT"); case MySQLToken.KW_SENSITIVE: return("SENSITIVE"); case MySQLToken.KW_SEPARATOR: return("SEPARATOR"); case MySQLToken.KW_SET: return("SET"); case MySQLToken.KW_SHOW: return("SHOW"); case MySQLToken.KW_SIGNAL: return("SIGNAL"); case MySQLToken.KW_SLOW: return("SLOW"); case MySQLToken.KW_SMALLINT: return("SMALLINT"); case MySQLToken.KW_SPATIAL: return("SPATIAL"); case MySQLToken.KW_SPECIFIC: return("SPECIFIC"); case MySQLToken.KW_SQL: return("SQL"); case MySQLToken.KW_SQLEXCEPTION: return("SQLEXCEPTION"); case MySQLToken.KW_SQLSTATE: return("SQLSTATE"); case MySQLToken.KW_SQLWARNING: return("SQLWARNING"); case MySQLToken.KW_SQL_BIG_RESULT: return("SQL_BIG_RESULT"); case MySQLToken.KW_SQL_CALC_FOUND_ROWS: return("SQL_CALC_FOUND_ROWS"); case MySQLToken.KW_SQL_SMALL_RESULT: return("SQL_SMALL_RESULT"); case MySQLToken.KW_SSL: return("SSL"); case MySQLToken.KW_STARTING: return("STARTING"); case MySQLToken.KW_STRAIGHT_JOIN: return("STRAIGHT_JOIN"); case MySQLToken.KW_TABLE: return("TABLE"); case MySQLToken.KW_TERMINATED: return("TERMINATED"); case MySQLToken.KW_THEN: return("THEN"); case MySQLToken.KW_TINYBLOB: return("TINYBLOB"); case MySQLToken.KW_TINYINT: return("TINYINT"); case MySQLToken.KW_TINYTEXT: return("TINYTEXT"); case MySQLToken.KW_TO: return("TO"); case MySQLToken.KW_TRAILING: return("TRAILING"); case MySQLToken.KW_TRIGGER: return("TRIGGER"); case MySQLToken.KW_UNDO: return("UNDO"); case MySQLToken.KW_UNION: return("UNION"); case MySQLToken.KW_UNIQUE: return("UNIQUE"); case MySQLToken.KW_UNLOCK: return("UNLOCK"); case MySQLToken.KW_UNSIGNED: return("UNSIGNED"); case MySQLToken.KW_UPDATE: return("UPDATE"); case MySQLToken.KW_USAGE: return("USAGE"); case MySQLToken.KW_USE: return("USE"); case MySQLToken.KW_USING: return("USING"); case MySQLToken.KW_UTC_DATE: return("UTC_DATE"); case MySQLToken.KW_UTC_TIME: return("UTC_TIME"); case MySQLToken.KW_UTC_TIMESTAMP: return("UTC_TIMESTAMP"); case MySQLToken.KW_VALUES: return("VALUES"); case MySQLToken.KW_VARBINARY: return("VARBINARY"); case MySQLToken.KW_VARCHAR: return("VARCHAR"); case MySQLToken.KW_VARCHARACTER: return("VARCHARACTER"); case MySQLToken.KW_VARYING: return("VARYING"); case MySQLToken.KW_WHEN: return("WHEN"); case MySQLToken.KW_WHERE: return("WHERE"); case MySQLToken.KW_WHILE: return("WHILE"); case MySQLToken.KW_WITH: return("WITH"); case MySQLToken.KW_WRITE: return("WRITE"); case MySQLToken.KW_XOR: return("XOR"); case MySQLToken.KW_YEAR_MONTH: return("YEAR_MONTH"); case MySQLToken.KW_ZEROFILL: return("ZEROFILL"); default: throw new ArgumentException("token is not keyword: " + token); } }
private SelectStatement.SelectOption SelectOption() { SelectStatement.SelectOption option = new SelectStatement.SelectOption(); MySQLToken token = MySQLToken.NONE; for (; ; lexer.NextToken()) { token = lexer.Token(); if (token == MySQLToken.KW_ALL) { option.resultDup = SelectStatement.SelectDuplicationStrategy.All; } else if (token == MySQLToken.KW_DISTINCT) { option.resultDup = SelectStatement.SelectDuplicationStrategy.Distinct; } else if (token == MySQLToken.KW_DISTINCTROW) { option.resultDup = SelectStatement.SelectDuplicationStrategy.DistinctRow; } else if (token == MySQLToken.KW_HIGH_PRIORITY) { option.highPriority = true; } else if (token == MySQLToken.KW_STRAIGHT_JOIN) { option.straightJoin = true; } else if (token == MySQLToken.KW_SQL_SMALL_RESULT) { option.resultSize = SelectStatement.SmallOrBigResult.SqlSmallResult; } else if (token == MySQLToken.KW_SQL_BIG_RESULT) { option.resultSize = SelectStatement.SmallOrBigResult.SqlBigResult; } else if (token == MySQLToken.KW_SQL_CALC_FOUND_ROWS) { option.sqlCalcFoundRows = true; } else if (token == MySQLToken.IDENTIFIER) { string optionStringUp = lexer.StringValueUppercase; SpecialIdentifier specialId = SpecialIdentifier.SqlBufferResult; if (Enum.TryParse <SpecialIdentifier>(optionStringUp, out specialId)) { switch (specialId) { case SpecialIdentifier.SqlBufferResult: if (option.sqlBufferResult) { return(option); } option.sqlBufferResult = true; break; case SpecialIdentifier.SqlCache: if (option.queryCache != SelectStatement.QueryCacheStrategy.Undefine) { return(option); } option.queryCache = SelectStatement.QueryCacheStrategy.SqlCache; break; case SpecialIdentifier.SqlNoCache: if (option.queryCache != SelectStatement.QueryCacheStrategy.Undefine) { return(option); } option.queryCache = SelectStatement.QueryCacheStrategy.SqlNoCache; break; } } } else { return(option); } } }