Skip to content
  • epriestley's avatar
    When paging by Ferret "rank", page using "HAVING rank > ...", not "WHERE rank > ..." · 7f905706
    epriestley authored
    Summary:
    Ref T13091. The Ferret "rank" column is a function of the query text and looks something like `SELECT ..., 2 + 2 AS rank, ...`.
    
    You can't apply conditions to this kind of dynamic column with a WHERE clause: you get a slightly unhelpful error like "column rank unknown in where clause". You must use HAVING:
    
    ```
    mysql> SELECT 2 + 2 AS x WHERE x = 4;
    ERROR 1054 (42S22): Unknown column 'x' in 'where clause'
    mysql> SELECT 2 + 2 AS x HAVING x = 4;
    +---+
    | x |
    +---+
    | 4 |
    +---+
    1 row in set (0.00 sec)
    ```
    
    Add a flag to paging column definitions to let them specify that they must be applied with HAVING, then apply the whole paging clause with HAVING if any column requires HAVING.
    
    Test Plan:
      - In Maniphest, ran a fulltext search matching more than 100 results, ordered by "Relevance", then clicked "Next Page".
      - Before patch: query with `... WHERE rank > 123 OR ...` caused MySQL error because `rank` is not a WHERE-able column.
      - After patch: query builds as `... HAVING rank > 123 OR ...`, pages properly, no MySQL error.
    
    Reviewers: amckinley
    
    Reviewed By: amckinley
    
    Maniphest Tasks: T13091
    
    Differential Revision: https://secure.phabricator.com/D20298
    7f905706