DiegoEmilio01 / IIC3413

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

[Lab 5] Duda de funcionamiento de las tablas en LEFT OUTER JOIN #39

Open sebaterrazas opened 3 days ago

sebaterrazas commented 3 days ago

Hola! Le he estado dando vuelta a un tema y todavía no logro entender la lógica que tengo que implementar. Para una consulta del tipo:

SELECT *
FROM (R LEFT OUTER JOIN S ON R.a = S.x) AS LOJ

Entiendo que hay que tratarla como si (R LEFT OUTER JOIN S ON R.a = S.x) AS LOJ fuera un table AS identifier (Parser). Mi tema es que más adelante, en el código base se hace esto en query_preprocessor.cc:

if (!from_tables.insert({alias, table_name}).second) {
  throw QueryException("Table " + alias + " should only appear once in the FROM clause");
}

En general, entiendo que alias sería el identifier después del AS y que table_name es la tabla que ya está en el catálogo. Pero en este caso, no entiendo cual sería el table_name. Osea, debería usar la tabla R y modificarla respecto a la consulta? Debería crear una nueva tabla en el catálogo con el nombre de alias del LEFT OUTER JOIN? O debería insertar ambas tablas (R y S) sin utilizar el alias?

cirojas commented 3 days ago

No deberías tocar el catálogo, deberías insertar R y S sin utilizar el alias.

Y es posible (depende de como modificas la gramática) que el visitor visitTableList sea modificado para que haga otras cosas en los casos nuevos. En particular al visitar tu consulta de ejemplo no debería evaluarse el if que mencionas

if (!from_tables.insert({alias, table_name}).second) {
  throw QueryException("Table " + alias + " should only appear once in the FROM clause");
}