Tup.Cobar4Net.Parser.Recognizer.Mysql.Syntax.MySqlDdlParser.AlterTable C# (CSharp) Метод

AlterTable() приватный Метод

token of table name has been consumed
private AlterTable ( DdlAlterTableStatement stmt ) : DdlAlterTableStatement
stmt Tup.Cobar4Net.Parser.Ast.Stmt.Ddl.DdlAlterTableStatement
Результат Tup.Cobar4Net.Parser.Ast.Stmt.Ddl.DdlAlterTableStatement
        private DdlAlterTableStatement AlterTable(DdlAlterTableStatement stmt)
        {
            var options = new DdlTableOptions();
            stmt.TableOptions = options;
            Identifier id = null;
            Identifier id2 = null;
            Identifier id3 = null;
            DdlColumnDefinition colDef = null;
            IndexDefinition indexDef = null;
            IExpression expr = null;
            for (var i = 0; lexer.Token() != MySqlToken.Eof; ++i)
            {
                if (i > 0)
                {
                    Match(MySqlToken.PuncComma);
                }
                if (TableOptions(options))
                {
                    continue;
                }
                switch (lexer.Token())
                {
                    case MySqlToken.KwConvert:
                    {
                        // | CONVERT TO CHARACTER SET charset_name [COLLATE
                        // collation_name]
                        lexer.NextToken();
                        Match(MySqlToken.KwTo);
                        Match(MySqlToken.KwCharacter);
                        Match(MySqlToken.KwSet);
                        id = Identifier();
                        id2 = null;
                        if (lexer.Token() == MySqlToken.KwCollate)
                        {
                            lexer.NextToken();
                            id2 = Identifier();
                        }
                        stmt.ConvertCharset = new Pair<Identifier, Identifier>(id, id2);
                        goto main_switch_break;
                    }

                    case MySqlToken.KwRename:
                    {
                        // | RENAME [TO] new_tbl_name
                        if (lexer.NextToken() == MySqlToken.KwTo)
                        {
                            lexer.NextToken();
                        }
                        id = Identifier();
                        stmt.RenameTo = id;
                        goto main_switch_break;
                    }

                    case MySqlToken.KwDrop:
                    {
                        switch (lexer.NextToken())
                        {
                            case MySqlToken.KwIndex:
                            case MySqlToken.KwKey:
                            {
                                // | DROP {INDEX|KEY} index_name
                                lexer.NextToken();
                                id = Identifier();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.DropIndex(id));
                                goto drop_switch_break;
                            }

                            case MySqlToken.KwPrimary:
                            {
                                // | DROP PRIMARY KEY
                                lexer.NextToken();
                                Match(MySqlToken.KwKey);
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.DropPrimaryKey());
                                goto drop_switch_break;
                            }

                            case MySqlToken.Identifier:
                            {
                                // | DROP [COLUMN] col_name
                                id = Identifier();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.DropColumn(id));
                                goto drop_switch_break;
                            }

                            case MySqlToken.KwColumn:
                            {
                                // | DROP [COLUMN] col_name
                                lexer.NextToken();
                                id = Identifier();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.DropColumn(id));
                                goto drop_switch_break;
                            }

                            default:
                            {
                                throw new SqlSyntaxErrorException("ALTER TABLE error for DROP");
                            }
                        }
                        drop_switch_break:
                        ;
                        goto main_switch_break;
                    }

                    case MySqlToken.KwChange:
                    {
                        // | CHANGE [COLUMN] old_col_name new_col_name column_definition
                        // [FIRST|AFTER col_name]
                        if (lexer.NextToken() == MySqlToken.KwColumn)
                        {
                            lexer.NextToken();
                        }
                        id = Identifier();
                        id2 = Identifier();
                        colDef = ColumnDefinition();
                        if (lexer.Token() == MySqlToken.Identifier)
                        {
                            if ("FIRST".Equals(lexer.GetStringValueUppercase()))
                            {
                                lexer.NextToken();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.ChangeColumn(id, id2, colDef
                                    , null));
                            }
                            else
                            {
                                if ("AFTER".Equals(lexer.GetStringValueUppercase()))
                                {
                                    lexer.NextToken();
                                    id3 = Identifier();
                                    stmt.AddAlterSpecification(new DdlAlterTableStatement.ChangeColumn(id, id2, colDef
                                        , id3));
                                }
                                else
                                {
                                    stmt.AddAlterSpecification(new DdlAlterTableStatement.ChangeColumn(id, id2, colDef
                                        ));
                                }
                            }
                        }
                        else
                        {
                            stmt.AddAlterSpecification(new DdlAlterTableStatement.ChangeColumn(id, id2, colDef
                                ));
                        }
                        goto main_switch_break;
                    }

                    case MySqlToken.KwAlter:
                    {
                        // | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP
                        // DEFAULT}
                        if (lexer.NextToken() == MySqlToken.KwColumn)
                        {
                            lexer.NextToken();
                        }
                        id = Identifier();
                        switch (lexer.Token())
                        {
                            case MySqlToken.KwSet:
                            {
                                lexer.NextToken();
                                Match(MySqlToken.KwDefault);
                                expr = exprParser.Expression();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AlterColumnDefaultVal(id, expr
                                    ));
                                break;
                            }

                            case MySqlToken.KwDrop:
                            {
                                lexer.NextToken();
                                Match(MySqlToken.KwDefault);
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AlterColumnDefaultVal(id));
                                break;
                            }

                            default:
                            {
                                throw new SqlSyntaxErrorException("ALTER TABLE error for ALTER");
                            }
                        }
                        goto main_switch_break;
                    }

                    case MySqlToken.KwAdd:
                    {
                        switch (lexer.NextToken())
                        {
                            case MySqlToken.Identifier:
                            {
                                // | ADD [COLUMN] col_name column_definition [FIRST | AFTER
                                // col_name ]
                                id = Identifier();
                                colDef = ColumnDefinition();
                                if (lexer.Token() == MySqlToken.Identifier)
                                {
                                    if ("FIRST".Equals(lexer.GetStringValueUppercase()))
                                    {
                                        lexer.NextToken();
                                        stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef, null));
                                    }
                                    else
                                    {
                                        if ("AFTER".Equals(lexer.GetStringValueUppercase()))
                                        {
                                            lexer.NextToken();
                                            id2 = Identifier();
                                            stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef,
                                                id2));
                                        }
                                        else
                                        {
                                            stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef));
                                        }
                                    }
                                }
                                else
                                {
                                    stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef));
                                }
                                goto add_switch_break;
                            }

                            case MySqlToken.PuncLeftParen:
                            {
                                // | ADD [COLUMN] (col_name column_definition,...)
                                lexer.NextToken();
                                for (var j = 0; lexer.Token() != MySqlToken.PuncRightParen; ++j)
                                {
                                    var addColumns = new DdlAlterTableStatement.AddColumns();
                                    stmt.AddAlterSpecification(addColumns);
                                    if (j > 0)
                                    {
                                        Match(MySqlToken.PuncComma);
                                    }
                                    id = Identifier();
                                    colDef = ColumnDefinition();
                                    addColumns.AddColumn(id, colDef);
                                }
                                Match(MySqlToken.PuncRightParen);
                                goto add_switch_break;
                            }

                            case MySqlToken.KwColumn:
                            {
                                if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                                {
                                    // | ADD [COLUMN] (col_name column_definition,...)
                                    lexer.NextToken();
                                    for (var j_1 = 0; lexer.Token() != MySqlToken.PuncRightParen; ++j_1)
                                    {
                                        var addColumns = new DdlAlterTableStatement.AddColumns();
                                        stmt.AddAlterSpecification(addColumns);
                                        if (j_1 > 0)
                                        {
                                            Match(MySqlToken.PuncComma);
                                        }
                                        id = Identifier();
                                        colDef = ColumnDefinition();
                                        addColumns.AddColumn(id, colDef);
                                    }
                                    Match(MySqlToken.PuncRightParen);
                                }
                                else
                                {
                                    // | ADD [COLUMN] col_name column_definition [FIRST |
                                    // AFTER col_name ]
                                    id = Identifier();
                                    colDef = ColumnDefinition();
                                    if (lexer.Token() == MySqlToken.Identifier)
                                    {
                                        if ("FIRST".Equals(lexer.GetStringValueUppercase()))
                                        {
                                            lexer.NextToken();
                                            stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef,
                                                null));
                                        }
                                        else
                                        {
                                            if ("AFTER".Equals(lexer.GetStringValueUppercase()))
                                            {
                                                lexer.NextToken();
                                                id2 = Identifier();
                                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id,
                                                    colDef, id2));
                                            }
                                            else
                                            {
                                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id,
                                                    colDef));
                                            }
                                        }
                                    }
                                    else
                                    {
                                        stmt.AddAlterSpecification(new DdlAlterTableStatement.AddColumn(id, colDef));
                                    }
                                }
                                goto add_switch_break;
                            }

                            case MySqlToken.KwIndex:
                            case MySqlToken.KwKey:
                            {
                                // | ADD {INDEX|KEY} [index_name] [index_type]
                                // (index_col_name,...) [index_option] ...
                                id = null;
                                if (lexer.NextToken() == MySqlToken.Identifier)
                                {
                                    id = Identifier();
                                }
                                indexDef = IndexDefinition();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddIndex(id, indexDef));
                                goto add_switch_break;
                            }

                            case MySqlToken.KwPrimary:
                            {
                                // | ADD PRIMARY KEY [index_type] (index_col_name,...)
                                // [index_option] ...
                                lexer.NextToken();
                                Match(MySqlToken.KwKey);
                                indexDef = IndexDefinition();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddPrimaryKey(indexDef));
                                goto add_switch_break;
                            }

                            case MySqlToken.KwUnique:
                            {
                                switch (lexer.NextToken())
                                {
                                    case MySqlToken.KwIndex:
                                    case MySqlToken.KwKey:
                                    {
                                        // | ADD UNIQUE [INDEX|KEY] [index_name] [index_type]
                                        // (index_col_name,...) [index_option] ...
                                        lexer.NextToken();
                                        break;
                                    }
                                }
                                id = null;
                                if (lexer.Token() == MySqlToken.Identifier)
                                {
                                    id = Identifier();
                                }
                                indexDef = IndexDefinition();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddUniqueKey(id, indexDef));
                                goto add_switch_break;
                            }

                            case MySqlToken.KwFulltext:
                            {
                                switch (lexer.NextToken())
                                {
                                    case MySqlToken.KwIndex:
                                    case MySqlToken.KwKey:
                                    {
                                        // | ADD FULLTEXT [INDEX|KEY] [index_name]
                                        // (index_col_name,...) [index_option] ...
                                        lexer.NextToken();
                                        break;
                                    }
                                }
                                id = null;
                                if (lexer.Token() == MySqlToken.Identifier)
                                {
                                    id = Identifier();
                                }
                                indexDef = IndexDefinition();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddFullTextIndex(id, indexDef
                                    ));
                                goto add_switch_break;
                            }

                            case MySqlToken.KwSpatial:
                            {
                                switch (lexer.NextToken())
                                {
                                    case MySqlToken.KwIndex:
                                    case MySqlToken.KwKey:
                                    {
                                        // | ADD SPATIAL [INDEX|KEY] [index_name]
                                        // (index_col_name,...) [index_option] ...
                                        lexer.NextToken();
                                        break;
                                    }
                                }
                                id = null;
                                if (lexer.Token() == MySqlToken.Identifier)
                                {
                                    id = Identifier();
                                }
                                indexDef = IndexDefinition();
                                stmt.AddAlterSpecification(new DdlAlterTableStatement.AddSpatialIndex(id, indexDef
                                    ));
                                goto add_switch_break;
                            }

                            default:
                            {
                                throw new SqlSyntaxErrorException("ALTER TABLE error for ADD");
                            }
                        }
                        add_switch_break:
                        ;
                        goto main_switch_break;
                    }

                    case MySqlToken.Identifier:
                    {
                        var si = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
                        if (si != SpecialIdentifier.None)
                        {
                            switch (si)
                            {
                                case SpecialIdentifier.Import:
                                {
                                    // | IMPORT TABLESPACE
                                    lexer.NextToken();
                                    MatchIdentifier("TABLESPACE");
                                    stmt.IsImportTableSpace = true;
                                    goto main_switch_break;
                                }

                                case SpecialIdentifier.Discard:
                                {
                                    // | DISCARD TABLESPACE
                                    lexer.NextToken();
                                    MatchIdentifier("TABLESPACE");
                                    stmt.DiscardTableSpace = true;
                                    goto main_switch_break;
                                }

                                case SpecialIdentifier.Enable:
                                {
                                    // | ENABLE KEYS
                                    lexer.NextToken();
                                    Match(MySqlToken.KwKeys);
                                    stmt.EnableKeys = true;
                                    goto main_switch_break;
                                }

                                case SpecialIdentifier.Disable:
                                {
                                    // | DISABLE KEYS
                                    lexer.NextToken();
                                    Match(MySqlToken.KwKeys);
                                    stmt.DisableKeys = true;
                                    goto main_switch_break;
                                }

                                case SpecialIdentifier.Modify:
                                {
                                    // | MODIFY [COLUMN] col_name column_definition [FIRST |
                                    // AFTER col_name]
                                    if (lexer.NextToken() == MySqlToken.KwColumn)
                                    {
                                        lexer.NextToken();
                                    }
                                    id = Identifier();
                                    colDef = ColumnDefinition();
                                    if (lexer.Token() == MySqlToken.Identifier)
                                    {
                                        if ("FIRST".Equals(lexer.GetStringValueUppercase()))
                                        {
                                            lexer.NextToken();
                                            stmt.AddAlterSpecification(new DdlAlterTableStatement.ModifyColumn(id,
                                                colDef, null
                                                ));
                                        }
                                        else
                                        {
                                            if ("AFTER".Equals(lexer.GetStringValueUppercase()))
                                            {
                                                lexer.NextToken();
                                                id2 = Identifier();
                                                stmt.AddAlterSpecification(new DdlAlterTableStatement.ModifyColumn(id,
                                                    colDef, id2
                                                    ));
                                            }
                                            else
                                            {
                                                stmt.AddAlterSpecification(new DdlAlterTableStatement.ModifyColumn(id,
                                                    colDef));
                                            }
                                        }
                                    }
                                    else
                                    {
                                        stmt.AddAlterSpecification(new DdlAlterTableStatement.ModifyColumn(id, colDef));
                                    }
                                    goto main_switch_break;
                                }
                            }
                        }
                        goto default;
                    }

                    default:
                    {
                        throw new SqlSyntaxErrorException("unknown ALTER specification");
                    }
                }
                main_switch_break:
                ;
            }
            return stmt;
        }