Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-15412

For any non-existing transaction ID, AS OF provides the current table contents without a warning

Details

    • Bug
    • Status: Closed (View Workflow)
    • Major
    • Resolution: Fixed
    • 10.3(EOL)
    • 10.3.14, 10.4.4
    • Versioned Tables
    • None
    • bb-10.3-release 9b59f78d16fb000

    Description

      I couldn't find it in the current tests, so don't know if it's intentional.

      create or replace table t1 (i int, s bigint unsigned as row start, e bigint unsigned as row end, period for system_time(s,e)) with system versioning;
      insert into t1 (i) values (1),(2);
      update t1 set i = 3;
      

      MariaDB [test]> select * from t1 for system_time all;
      +------+-----+----------------------+
      | i    | s   | e                    |
      +------+-----+----------------------+
      |    3 | 229 | 18446744073709551615 |
      |    3 | 229 | 18446744073709551615 |
      |    1 | 222 |                  229 |
      |    2 | 222 |                  229 |
      +------+-----+----------------------+
      4 rows in set (0.00 sec)
      

      Existing transaction, old snapshot - OK

      MariaDB [test]> select * from t1 for system_time as of transaction 222;
      +------+-----+-----+
      | i    | s   | e   |
      +------+-----+-----+
      |    1 | 222 | 229 |
      |    2 | 222 | 229 |
      +------+-----+-----+
      2 rows in set (0.00 sec)
      

      Existing transaction, current snapshot - OK

      MariaDB [test]> select * from t1 for system_time as of transaction 229;
      +------+-----+----------------------+
      | i    | s   | e                    |
      +------+-----+----------------------+
      |    3 | 229 | 18446744073709551615 |
      |    3 | 229 | 18446744073709551615 |
      +------+-----+----------------------+
      2 rows in set (0.00 sec)
      

      Non existing transaction (greater than latest) -- questionable

      MariaDB [test]> select * from t1 for system_time as of transaction 230;
      +------+-----+----------------------+
      | i    | s   | e                    |
      +------+-----+----------------------+
      |    3 | 229 | 18446744073709551615 |
      |    3 | 229 | 18446744073709551615 |
      +------+-----+----------------------+
      2 rows in set (0.00 sec)
      

      Non existing transaction (less than minimal) -- not good

      MariaDB [test]> select * from t1 for system_time as of transaction 1;
      +------+-----+----------------------+
      | i    | s   | e                    |
      +------+-----+----------------------+
      |    3 | 229 | 18446744073709551615 |
      |    3 | 229 | 18446744073709551615 |
      +------+-----+----------------------+
      2 rows in set (0.00 sec)
      

      Non existing transaction (intermediate value) -- not good

      MariaDB [test]> select * from t1 for system_time as of transaction 227;
      +------+-----+----------------------+
      | i    | s   | e                    |
      +------+-----+----------------------+
      |    3 | 229 | 18446744073709551615 |
      |    3 | 229 | 18446744073709551615 |
      +------+-----+----------------------+
      2 rows in set (0.00 sec)
      

      Attachments

        Issue Links

          Activity

            Question is about TR_table::query_sees() algorithm.

            Here is my opinion. as of transaction 1 will see nothing. as of transaction big_number will see current rows. And here is the patch:

            diff --git a/sql/table.cc b/sql/table.cc
            index 4f90d429ce5..d235f37f312 100644
            --- a/sql/table.cc
            +++ b/sql/table.cc
            @@ -8751,11 +8751,18 @@ bool TR_table::query_sees(bool &result, ulonglong trx_id1, ulonglong trx_id0,
             
               if (!commit_id1)
               {
            -    if (!query(trx_id1))
            -      return true;
            -
            -    commit_id1= (*this)[FLD_COMMIT_ID]->val_int();
            -    iso_level1= iso_level();
            +    if (query(trx_id1))
            +    {
            +      commit_id1= (*this)[FLD_COMMIT_ID]->val_int();
            +      iso_level1= iso_level();
            +    }
            +    else
            +    {
            +      // User specified some random transaction id.
            +      // Make it instant and use default isolation level for computation.
            +      commit_id1= trx_id1;
            +      iso_level1= static_cast<enum_tx_isolation>(thd->variables.tx_isolation);
            +    }
               }
             
               if (!commit_id0)
            

            Alexey(midenok) has different opinion. He says as of unknown_trx_id should be an error.

            We don't know how it should work and ask you what is the correct behaviour.

            kevg Eugene Kosov (Inactive) added a comment - Question is about TR_table::query_sees() algorithm. Here is my opinion. as of transaction 1 will see nothing. as of transaction big_number will see current rows. And here is the patch: diff --git a/sql/table.cc b/sql/table.cc index 4f90d429ce5..d235f37f312 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8751,11 +8751,18 @@ bool TR_table::query_sees(bool &result, ulonglong trx_id1, ulonglong trx_id0, if (!commit_id1) { - if (!query(trx_id1)) - return true; - - commit_id1= (*this)[FLD_COMMIT_ID]->val_int(); - iso_level1= iso_level(); + if (query(trx_id1)) + { + commit_id1= (*this)[FLD_COMMIT_ID]->val_int(); + iso_level1= iso_level(); + } + else + { + // User specified some random transaction id. + // Make it instant and use default isolation level for computation. + commit_id1= trx_id1; + iso_level1= static_cast<enum_tx_isolation>(thd->variables.tx_isolation); + } } if (!commit_id0) Alexey(midenok) has different opinion. He says as of unknown_trx_id should be an error. We don't know how it should work and ask you what is the correct behaviour.

            TRX_ID is something material. If there was a transaction, there was some TRX_ID. But unknown TRX_ID means there was no such transaction. We must not use unknown TRX_ID therefore and cannot link it to some point in time.

            midenok Aleksey Midenkov added a comment - TRX_ID is something material. If there was a transaction, there was some TRX_ID. But unknown TRX_ID means there was no such transaction. We must not use unknown TRX_ID therefore and cannot link it to some point in time.

            I tend to agree with midenok. A transaction id means there was a transaction with this id. If there was no such a transaction, you cannot show a view as of nonexistent transaction.

            serg Sergei Golubchik added a comment - I tend to agree with midenok . A transaction id means there was a transaction with this id. If there was no such a transaction, you cannot show a view as of nonexistent transaction.

            People

              serg Sergei Golubchik
              elenst Elena Stepanova
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.