DiegoEmilio01 / IIC3413

Repositorio del curso Implementación de Sistemas de Bases de Datos
16 stars 2 forks source link

Columnas en iterador de proyección #43

Open TomasAlcalde opened 1 week ago

TomasAlcalde commented 1 week ago

Hola, estuve revisando los iteradores que venían como base y creo que encontré un pequeño error. En especifico es como se asignan las columnas de la proyección:

auto child_cols = child->get_columns();
auto& child_out = child->get_output();
for (size_t i = 0; i < projected_columns.size(); i++) {
    for (auto& child_col : child_cols) {
        if (child_col == projected_columns[i]) {
            out.values[i] = child_out.values[i];
        }
    }
    assert(out.values[i] != nullptr);
}

Pero esto implica que la columna que se le asigna al out en las proyecciones tiene el mismo índice que las columnas del iterador hijo. Esto genera errores cuando por ejemplo hago un join y quiero proyectar la primera y cuarta columna. En ese caso se retornaría supuestamente la primera y cuarta columna del join, pero con los valores de la primera y segunda.

TomasAlcalde commented 1 week ago

Una forma de solucionarlo sería usar un índice para recorrer las columnas del iterador hijo. Quedaría como sigue:

auto child_cols = child->get_columns();
auto& child_out = child->get_output();
for (size_t i = 0; i < projected_columns.size(); i++) {
    for (size_t j = 0; j < child_cols.size(); j++) {
        if (child_cols[j] == projected_columns[i]) {
            out.values[i] = child_out.values[j];
        }
    }
    assert(out.values[i] != nullptr);
}
cirojas commented 1 week ago

tienes razón, gracias por encontrar un bug y proponer la solución, si hablas con @DiegoEmilio01 deberías tener algún bonus de nota.