sequelize-sscce icon indicating copy to clipboard operation
sequelize-sscce copied to clipboard

[Bug] top level where clause with limit

Open martinboulais opened this issue 3 years ago • 0 comments

When using a relation's field in a top level where clause AND a limit, the generated SQL is invalid because the inner querries do not have the join:

text: "Unknown column 'Bar.name' in 'where clause'",
sql: "SELECT `Foo`.*, `Bar`.`id` AS `Bar.id`, `Bar`.`name` AS `Bar.name`, `Baz`.`id` AS `Baz.id`, `Baz->BarBaz`.`FooId` AS `Baz.BarBaz.FooId`, `Baz->BarBaz`.`BazId` AS `Baz.BarBaz.BazId` FROM (SELECT `Foo`.`id`, `Foo`.`BarId` FROM `Foos` AS `Foo` WHERE `Bar`.`name` = 'first' LIMIT 2) AS `Foo` LEFT OUTER JOIN `Bars` AS `Bar` ON `Foo`.`BarId` = `Bar`.`id` LEFT OUTER JOIN ( `BarBazs` AS `Baz->BarBaz` INNER JOIN `Bazs` AS `Baz` ON `Baz`.`id` = `Baz->BarBaz`.`BazId`) ON `Foo`.`id` = `Baz->BarBaz`.`FooId`;",
fatal: false,
errno: 1054,
sqlState: '42S22',
code: 'ER_BAD_FIELD_ERROR',
parameters: undefined,

The formatted SQL generated:

SELECT `Foo`.*,
       `Bar`.`id`            AS `Bar.id`,
       `Bar`.`name`          AS `Bar.name`,
       `Baz`.`id`            AS `Baz.id`,
       `Baz->BarBaz`.`FooId` AS `Baz.BarBaz.FooId`,
       `Baz->BarBaz`.`BazId` AS `Baz.BarBaz.BazId`
--                                                    here, Bar do not exists 
--                                                                v
FROM (SELECT `Foo`.`id`, `Foo`.`BarId` FROM `Foos` AS `Foo` WHERE `Bar`.`name` = 'first' LIMIT 2) AS `Foo`
         LEFT OUTER JOIN `Bars` AS `Bar` ON `Foo`.`BarId` = `Bar`.`id`
         LEFT OUTER JOIN (`BarBazs` AS `Baz->BarBaz` INNER JOIN `Bazs` AS `Baz` ON `Baz`.`id` = `Baz->BarBaz`.`BazId`)
                         ON `Foo`.`id` = `Baz->BarBaz`.`FooId`

martinboulais avatar Oct 12 '22 17:10 martinboulais