Uploaded image for project: 'eZ Publish / Platform'
  1. eZ Publish / Platform
  2. EZP-20824

ezoracle: db driver - $db->generateSQLINStatement - not working correctly for items > 1000

    Details

      Description

      The restriction for oracle database, which only allows a total amount of 1000 elements in an IN statement is generating a where clause that is not safely encapsulated in braces *( ... )*

      In consequence, when the return value of this method is combined in other *and* clauses on query construction (such as the one in kernel/classes/notification/handler/ezsubtree/ezsubtreenotificationrule.php) the result set won't be the desired one.

      Steps to reproduce:
      • On an environment with eZOracle and over 1000 user accounts, all of them set up to be notified on changes to an object,
      • perform the changes
      • run the notification cronjob (active in *frequent*, by default)
      • The outcome may vary into a fatal error, if your data is large enough to provoke it or an undesired list of users being notified.

        Activity

        Show
        Yannick Roger (Inactive) added a comment - ezoracle 5.0: https://github.com/ezsystems/ezoracle/commit/efdc116d98bdadc91505428402fd129c8c617859 ezoracle 2.4: https://github.com/ezsystems/ezoracle/commit/ad835853dcc464f38ec8ec02bb6a0db6a3f022b4
        Show
        Yannick Roger (Inactive) added a comment - I merged the pull request : https://github.com/ezsystems/ezoracle/commit/3fff95005cf911cef7d3a2c4d151115ed06fb1c8
        Hide
        Felix Woldt added a comment - - edited

        An outher example. If you create a custom sql query with an instatement

        $db = eZDB::instance();
        $idList = array( 1,2,3,4 .... 2000 );
        $sqlINString = $db->generateSQLINStatement( $idList, ' table_name.id', false, false, 'int' );

        Select * From table_name
        where $sqlINString
        AND table_name.id < 900;

        => wrong result

        Select * From table_name
        where table_name.id IN (1...,1000) OR table_name.id IN ( 1001, ...2000 )
        AND table_name.id < 900;

        after patch => correct result:

        Select * From table_name
        where ( table_name.id IN (1...,1000) OR table_name.id IN ( 1001, ...2000 ) )
        AND table_name.id < 900;

        To find this out took me some hours

        Cheers Felix

        Show
        Felix Woldt added a comment - - edited An outher example. If you create a custom sql query with an instatement $db = eZDB::instance(); $idList = array( 1,2,3,4 .... 2000 ); $sqlINString = $db->generateSQLINStatement( $idList, ' table_name.id', false, false, 'int' ); Select * From table_name where $sqlINString AND table_name.id < 900; => wrong result Select * From table_name where table_name.id IN (1...,1000) OR table_name.id IN ( 1001, ...2000 ) AND table_name.id < 900; after patch => correct result: Select * From table_name where ( table_name.id IN (1...,1000) OR table_name.id IN ( 1001, ...2000 ) ) AND table_name.id < 900; To find this out took me some hours Cheers Felix

          People

          • Assignee:
            Unassigned
            Reporter:
            Joaquim Cavalleri (Inactive)
          • Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Time Tracking

              Estimated:
              Original Estimate - Not Specified
              Not Specified
              Remaining:
              Remaining Estimate - 0 minutes
              0m
              Logged:
              Time Spent - 1 hour
              1h