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: | |
| Category: | Connector for Node.js | Severity: | S3 (Non-critical) |
| Version: | 8.0.13 | OS: | Any |
| Assigned to: | Rui Quelhas | CPU Architecture: | Any |
[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.
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 } } ] } }