vitess.io/vitess@v0.16.2/go/vt/vttablet/onlineddl/vrepl/parser_test.go (about)

     1  /*
     2     Copyright 2016 GitHub Inc.
     3  	 See https://github.com/github/gh-ost/blob/master/LICENSE
     4  */
     5  /*
     6  Copyright 2021 The Vitess Authors.
     7  
     8  Licensed under the Apache License, Version 2.0 (the "License");
     9  you may not use this file except in compliance with the License.
    10  You may obtain a copy of the License at
    11  
    12      http://www.apache.org/licenses/LICENSE-2.0
    13  
    14  Unless required by applicable law or agreed to in writing, software
    15  distributed under the License is distributed on an "AS IS" BASIS,
    16  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    17  See the License for the specific language governing permissions and
    18  limitations under the License.
    19  */
    20  
    21  package vrepl
    22  
    23  import (
    24  	"testing"
    25  
    26  	"github.com/stretchr/testify/assert"
    27  )
    28  
    29  func TestParseAlterStatement(t *testing.T) {
    30  	statement := "alter table t add column t int, engine=innodb"
    31  	parser := NewAlterTableParser()
    32  	err := parser.ParseAlterStatement(statement)
    33  	assert.NoError(t, err)
    34  	assert.False(t, parser.HasNonTrivialRenames())
    35  	assert.False(t, parser.IsAutoIncrementDefined())
    36  }
    37  
    38  func TestParseAlterStatementTrivialRename(t *testing.T) {
    39  	statement := "alter table t add column t int, change ts ts timestamp, engine=innodb"
    40  	parser := NewAlterTableParser()
    41  	err := parser.ParseAlterStatement(statement)
    42  	assert.NoError(t, err)
    43  	assert.False(t, parser.HasNonTrivialRenames())
    44  	assert.False(t, parser.IsAutoIncrementDefined())
    45  	assert.Equal(t, len(parser.columnRenameMap), 1)
    46  	assert.Equal(t, parser.columnRenameMap["ts"], "ts")
    47  }
    48  
    49  func TestParseAlterStatementWithAutoIncrement(t *testing.T) {
    50  
    51  	statements := []string{
    52  		"auto_increment=7",
    53  		"auto_increment = 7",
    54  		"AUTO_INCREMENT = 71",
    55  		"AUTO_INCREMENT   23",
    56  		"AUTO_INCREMENT 23",
    57  		"add column t int, change ts ts timestamp, auto_increment=7 engine=innodb",
    58  		"add column t int, change ts ts timestamp, auto_increment =7 engine=innodb",
    59  		"add column t int, change ts ts timestamp, AUTO_INCREMENT = 7 engine=innodb",
    60  		"add column t int, change ts ts timestamp, engine=innodb auto_increment=73425",
    61  		"add column t int, change ts ts timestamp, engine=innodb, auto_increment=73425",
    62  		"add column t int, change ts ts timestamp, engine=innodb, auto_increment 73425",
    63  		"add column t int, change ts ts timestamp, engine innodb, auto_increment 73425",
    64  		"add column t int, change ts ts timestamp, engine innodb auto_increment 73425",
    65  	}
    66  	for _, statement := range statements {
    67  		parser := NewAlterTableParser()
    68  		statement := "alter table t " + statement
    69  		err := parser.ParseAlterStatement(statement)
    70  		assert.NoError(t, err)
    71  		assert.True(t, parser.IsAutoIncrementDefined())
    72  	}
    73  }
    74  
    75  func TestParseAlterStatementTrivialRenames(t *testing.T) {
    76  	statement := "alter table t  add column t int, change ts ts timestamp, CHANGE f `f` float, engine=innodb"
    77  	parser := NewAlterTableParser()
    78  	err := parser.ParseAlterStatement(statement)
    79  	assert.NoError(t, err)
    80  	assert.False(t, parser.HasNonTrivialRenames())
    81  	assert.False(t, parser.IsAutoIncrementDefined())
    82  	assert.Equal(t, len(parser.columnRenameMap), 2)
    83  	assert.Equal(t, parser.columnRenameMap["ts"], "ts")
    84  	assert.Equal(t, parser.columnRenameMap["f"], "f")
    85  }
    86  
    87  func TestParseAlterStatementNonTrivial(t *testing.T) {
    88  	statements := []string{
    89  		`add column b bigint, change f fl float, change i count int, engine=innodb`,
    90  		"add column b bigint, change column `f` fl float, change `i` `count` int, engine=innodb",
    91  		"add column b bigint, change column `f` fl float, change `i` `count` int, change ts ts timestamp, engine=innodb",
    92  		`change
    93  		  f fl float,
    94  			CHANGE COLUMN i
    95  			  count int, engine=innodb`,
    96  	}
    97  
    98  	for _, statement := range statements {
    99  		statement := "alter table t " + statement
   100  		parser := NewAlterTableParser()
   101  		err := parser.ParseAlterStatement(statement)
   102  		assert.NoError(t, err)
   103  		assert.False(t, parser.IsAutoIncrementDefined())
   104  		renames := parser.GetNonTrivialRenames()
   105  		assert.Equal(t, len(renames), 2)
   106  		assert.Equal(t, renames["i"], "count")
   107  		assert.Equal(t, renames["f"], "fl")
   108  	}
   109  }
   110  
   111  func TestParseAlterStatementDroppedColumns(t *testing.T) {
   112  
   113  	{
   114  		parser := NewAlterTableParser()
   115  		statement := "alter table t drop column b"
   116  		err := parser.ParseAlterStatement(statement)
   117  		assert.NoError(t, err)
   118  		assert.Equal(t, len(parser.droppedColumns), 1)
   119  		assert.True(t, parser.droppedColumns["b"])
   120  	}
   121  	{
   122  		parser := NewAlterTableParser()
   123  		statement := "alter table t drop column b, drop key c_idx, drop column `d`"
   124  		err := parser.ParseAlterStatement(statement)
   125  		assert.NoError(t, err)
   126  		assert.Equal(t, len(parser.droppedColumns), 2)
   127  		assert.True(t, parser.droppedColumns["b"])
   128  		assert.True(t, parser.droppedColumns["d"])
   129  	}
   130  	{
   131  		parser := NewAlterTableParser()
   132  		statement := "alter table t drop column b, drop key c_idx, drop column `d`, drop `e`, drop primary key, drop foreign key fk_1"
   133  		err := parser.ParseAlterStatement(statement)
   134  		assert.NoError(t, err)
   135  		assert.Equal(t, len(parser.droppedColumns), 3)
   136  		assert.True(t, parser.droppedColumns["b"])
   137  		assert.True(t, parser.droppedColumns["d"])
   138  		assert.True(t, parser.droppedColumns["e"])
   139  	}
   140  	{
   141  		parser := NewAlterTableParser()
   142  		statement := "alter table t drop column b, drop bad statement, add column i int"
   143  		err := parser.ParseAlterStatement(statement)
   144  		assert.Error(t, err)
   145  	}
   146  }
   147  
   148  func TestParseAlterStatementRenameTable(t *testing.T) {
   149  	tt := []struct {
   150  		alter    string
   151  		isRename bool
   152  	}{
   153  		{
   154  			alter: "alter table t drop column b",
   155  		},
   156  		{
   157  			alter:    "alter table t rename as something_else",
   158  			isRename: true,
   159  		},
   160  		{
   161  			alter:    "alter table t rename to something_else",
   162  			isRename: true,
   163  		},
   164  		{
   165  			alter:    "alter table t drop column b, rename as something_else",
   166  			isRename: true,
   167  		},
   168  		{
   169  			alter:    "alter table t engine=innodb, rename as something_else",
   170  			isRename: true,
   171  		},
   172  		{
   173  			alter:    "alter table t rename as something_else, engine=innodb",
   174  			isRename: true,
   175  		},
   176  	}
   177  	for _, tc := range tt {
   178  		t.Run(tc.alter, func(t *testing.T) {
   179  			parser := NewAlterTableParser()
   180  			err := parser.ParseAlterStatement(tc.alter)
   181  			assert.NoError(t, err)
   182  			assert.Equal(t, tc.isRename, parser.isRenameTable)
   183  		})
   184  	}
   185  }