Skip to content

Commit b891e4f

Browse files
Copilotmathiasrw
andauthored
Let quoted column names sort via ORDER BY to fix #2039 (#2275)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: mathiasrw <[email protected]> Co-authored-by: Mathias Wulff <[email protected]>
1 parent 09a1ce4 commit b891e4f

File tree

2 files changed

+70
-20
lines changed

2 files changed

+70
-20
lines changed

src/426orderby.js

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,35 +65,27 @@ yy.Select.prototype.compileOrder = function (query, params) {
6565
v = {_useColumnIndex: true, columnIndex: ord.expression.value - 1};
6666
}
6767
}
68+
} else if (ord.expression instanceof yy.StringValue) {
69+
// Treat quoted strings in ORDER BY as column references
70+
var v = new yy.Column({columnid: ord.expression.value});
6871
} else {
6972
var v = ord.expression;
7073
}
7174
self.orderColumns.push(v);
7275

7376
var key = '$$$' + idx;
7477

75-
// Date conversion
78+
// Date conversion - get columnid based on expression type
7679
var dg = '';
77-
//if(alasql.options.valueof)
80+
var columnid;
7881
if (ord.expression instanceof yy.Column) {
79-
var columnid = ord.expression.columnid;
80-
if (alasql.options.valueof) {
81-
dg = '.valueOf()';
82-
} else if (query.xcolumns[columnid]) {
83-
var dbtypeid = query.xcolumns[columnid].dbtypeid;
84-
if (
85-
dbtypeid == 'DATE' ||
86-
dbtypeid == 'DATETIME' ||
87-
dbtypeid == 'DATETIME2' ||
88-
dbtypeid == 'STRING' ||
89-
dbtypeid == 'NUMBER'
90-
)
91-
dg = '.valueOf()';
92-
// TODO Add other types mapping
93-
}
82+
columnid = ord.expression.columnid;
83+
} else if (ord.expression instanceof yy.ParamValue) {
84+
columnid = params[ord.expression.param];
85+
} else if (ord.expression instanceof yy.StringValue) {
86+
columnid = ord.expression.value;
9487
}
95-
if (ord.expression instanceof yy.ParamValue) {
96-
var columnid = params[ord.expression.param];
88+
if (columnid) {
9789
if (alasql.options.valueof) {
9890
dg = '.valueOf()';
9991
} else if (query.xcolumns[columnid]) {
@@ -106,7 +98,6 @@ yy.Select.prototype.compileOrder = function (query, params) {
10698
dbtypeid == 'NUMBER'
10799
)
108100
dg = '.valueOf()';
109-
// TODO Add other types mapping
110101
}
111102
}
112103
// COLLATE NOCASE

test/test2039.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
if (typeof exports === 'object') {
2+
var assert = require('assert');
3+
var alasql = require('..');
4+
}
5+
6+
describe('Test 2039 - Sorting does not occur for field names in quotation marks', function () {
7+
const test = '2039';
8+
9+
before(function () {
10+
alasql('create database test' + test);
11+
alasql('use test' + test);
12+
});
13+
14+
after(function () {
15+
alasql('drop database test' + test);
16+
});
17+
18+
it('A) Order by quoted column name should sort correctly', function () {
19+
var data = [{Поле: 3}, {Поле: 1}, {Поле: 2}];
20+
var res = alasql("select * from ? order by 'Поле'", [data]);
21+
assert.deepEqual(res, [{Поле: 1}, {Поле: 2}, {Поле: 3}]);
22+
});
23+
24+
it('B) Order by double-quoted column name should sort correctly', function () {
25+
var data = [{Поле: 3}, {Поле: 1}, {Поле: 2}];
26+
var res = alasql('select * from ? order by "Поле"', [data]);
27+
assert.deepEqual(res, [{Поле: 1}, {Поле: 2}, {Поле: 3}]);
28+
});
29+
30+
it('C) Order by quoted ASCII column name should sort correctly', function () {
31+
var data = [{name: 'Charlie'}, {name: 'Alice'}, {name: 'Bob'}];
32+
var res = alasql("select * from ? order by 'name'", [data]);
33+
assert.deepEqual(res, [{name: 'Alice'}, {name: 'Bob'}, {name: 'Charlie'}]);
34+
});
35+
36+
it('D) Order by quoted column name with DESC should sort correctly', function () {
37+
var data = [{Поле: 1}, {Поле: 3}, {Поле: 2}];
38+
var res = alasql("select * from ? order by 'Поле' DESC", [data]);
39+
assert.deepEqual(res, [{Поле: 3}, {Поле: 2}, {Поле: 1}]);
40+
});
41+
42+
it('E) Order by backtick-quoted column name should work (existing behavior)', function () {
43+
var data = [{Поле: 3}, {Поле: 1}, {Поле: 2}];
44+
var res = alasql('select * from ? order by `Поле`', [data]);
45+
assert.deepEqual(res, [{Поле: 1}, {Поле: 2}, {Поле: 3}]);
46+
});
47+
48+
it('F) Order by bracket-quoted column name should work (existing behavior)', function () {
49+
var data = [{'Primary column': 3}, {'Primary column': 1}, {'Primary column': 2}];
50+
var res = alasql('select * from ? order by [Primary column]', [data]);
51+
assert.deepEqual(res, [{'Primary column': 1}, {'Primary column': 2}, {'Primary column': 3}]);
52+
});
53+
54+
it('G) Order by quoted column name with spaces should sort correctly', function () {
55+
var data = [{'my field': 3}, {'my field': 1}, {'my field': 2}];
56+
var res = alasql("select * from ? order by 'my field'", [data]);
57+
assert.deepEqual(res, [{'my field': 1}, {'my field': 2}, {'my field': 3}]);
58+
});
59+
});

0 commit comments

Comments
 (0)