Bug #93834 Unexpected results with shift operators

Submitted: 7 Jan 2019 12:21 Modified: 18 Aug 2022 22:27
Reporter: Rui Quelhas Email Updates:
Status: Closed Impact on me:
None 
Category:Connector for Node.js Severity:S3 (Non-critical)
Version:8.0.13 OS:Any
Assigned to: Rui Quelhas CPU Architecture:Any

[7 Jan 2019 12:21] Rui Quelhas
Description:
As a user, I expect an expression like "8 >> 1 >> 1" to yield the same results both in a CRUD context (such as in a field projection) or in plain SQL.

In this case, the following should happen:

session.sql('SELECT 8 >> 1 >> 1 AS shifting')
  .execute(console.log) // [2]

collection.find()
  .fields('8 >> 1 >> 1 AS shifting')
  .execute(console.log) { shifting: 2 }

The plain SQL example seems to yield the expected the result but the CRUD example does not.

How to repeat:
Assuming the existence of a `mySchema.myCollection` collection which contains a single document.

mysqxl.getSession(config)
  .then(session => {
    var collection = session.getSchema('mySchema').getCollection('myCollection')
    return collection.find()
      .fields('8 >> 1 >> 1 AS shifting')
      .execute(console.log) // { shifting: 8 }
  })

Suggested fix:
The expression parser seems to be using right associativity.

> mysqlx.expr('8 >> 1 >> 1')
{
    "type": 5,
    "operator": {
        "name": ">>",
        "paramList": [
            {
                "type": 2,
                "literal": {
                    "type": 2,
                    "vUnsignedInt": 8
                }
            },
            {
                "type": 5,
                "operator": {
                    "name": ">>",
                    "paramList": [
                        {
                            "type": 2,
                            "literal": {
                                "type": 2,
                                "vUnsignedInt": 1
                            }
                        },
                        {
                            "type": 2,
                            "literal": {
                                "type": 2,
                                "vUnsignedInt": 1
                            }
                        }
                    ]
                }
            }
        ]
    }
}

It can be changed to use left associativity instead.

> mysqlx.expr('8 >> 1 >> 1')
{
    "type": 5,
    "operator": {
        "name": ">>",
        "paramList": [
            {
                "operator": {
                    "name": ">>",
                    "paramList": [
                        {
                            "type": 2,
                            "literal": {
                                "type": 2,
                                "vUnsignedInt": 8
                            }
                        },
                        {
                            "type": 2,
                            "literal": {
                                "type": 2,
                                "vUnsignedInt": 1
                            }
                        }
                    ]
                }
            },
            {
                "type": 2,
                "literal": {
                    "type": 2,
                    "vUnsignedInt": 1
                }
            }
        ]
    }
}
[18 Aug 2022 22:27] Philip Olson
Posted by developer:
 
Fixed as of the upcoming MySQL Connector/Node.js 8.0.31 release, and here's the proposed changelog entry from the documentation team:

Shift operator usage could return different results between CRUD and
plain SQL contexts.

Thank you for the bug report.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.038 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.