Fails to rename column when alter renames + re-adds new column with prev name

Abierto
#1,273 0 comentarios 1 reacción 0 asignados Ver en GitHub

Los mantenedores suelen responder en 10 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
45/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
go, mysql
Área
database

Línea de trabajo

Comienza reproduciendo la sentencia ALTER reportada en MySQL y compara su resultado con el resultado de gh-ost. Después, sigue el manejo que hace gh-ost de las sentencias ALTER que renombran y vuelven a añadir columnas. Se considera terminado cuando la columna n1 renombrada conserva los valores originales, mientras que la columna c1 recién añadida es NULL, coincidiendo con el comportamiento normal de MySQL.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

When renaming a column and then re-creating it within the same ALTER statement, gh-ost deletes the entiretity of the name-changed column.

Example:

-- regular alter table (expected behaviour)
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY auto_increment, c1 VARCHAR(100), c2 VARCHAR(100));
INSERT INTO t1 (c1, c2) VALUES ('a', 'b'), ('c', 'd'), ('e', 'f');
ALTER TABLE t1 RENAME COLUMN c1 TO n1, ADD COLUMN c1 varchar(100);
SELECT * FROM t1;
+----+------+------+------+
| id | n1   | c2   | c1   |
+----+------+------+------+
|  1 | a    | b    | NULL |
|  2 | c    | d    | NULL |
|  3 | e    | f    | NULL |
+----+------+------+------+

Using gh-ost:

go run . \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--user="[REDACTED]" \
--password="[REDACTED]" \
--host="127.0.0.1" \
--port=8030 \
--allow-on-master \
--database="test" \
--table="t1" \
--verbose \
--initially-drop-old-table \
--ok-to-drop-table \
--execute  --initially-drop-ghost-table --alter="RENAME COLUMN c1 TO n1, ADD COLUMN c1 varchar(100)"

Result:

+----+------+------+------+
| id | n1   | c2   | c1   |
+----+------+------+------+
|  1 | NULL | b    | a    |
|  2 | NULL | d    | c    |
|  3 | NULL | f    | e    |
+----+------+------+------+
Lenguaje dominante
Go
Estrellas
13.6k
Forks
1.4k
Merge medio
9 d 19 h
PR fusionados (30 d)
1

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de github/gh-ost

Todos los issues de github/gh-ost

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.