alasql 4.1.11 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/alasql-worker.js +1 -1
- package/dist/alasql.fs.js +119 -88
- package/dist/alasql.js +119 -88
- package/dist/alasql.min.js +23 -23
- package/package.json +4 -4
package/dist/alasql.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//! AlaSQL v4.1.11 build: develop-
|
|
1
|
+
//! AlaSQL v4.1.11 build: develop-6870c00d | © 2014-2023 Andrey Gershun & Mathias Wulff | License: MIT
|
|
2
2
|
/*
|
|
3
3
|
@module alasql
|
|
4
4
|
@version 4.1.11
|
|
@@ -142,7 +142,7 @@ var alasql = function(sql, params, cb, scope) {
|
|
|
142
142
|
@constant {string}
|
|
143
143
|
*/
|
|
144
144
|
alasql.version = '4.1.11';
|
|
145
|
-
alasql.build = 'develop-
|
|
145
|
+
alasql.build = 'develop-6870c00d';
|
|
146
146
|
|
|
147
147
|
/**
|
|
148
148
|
Debug flag
|
|
@@ -3168,10 +3168,10 @@ alasql.pretty = function (sql, flag) {
|
|
|
3168
3168
|
|
|
3169
3169
|
/*jshint unused:false*/
|
|
3170
3170
|
/*
|
|
3171
|
-
|
|
3171
|
+
Utilities for Alasql.js
|
|
3172
3172
|
|
|
3173
|
-
|
|
3174
|
-
|
|
3173
|
+
@todo Review the list of utilities
|
|
3174
|
+
@todo Find more effective utilities
|
|
3175
3175
|
*/
|
|
3176
3176
|
|
|
3177
3177
|
/**
|
|
@@ -3227,7 +3227,7 @@ function returnTrue() {
|
|
|
3227
3227
|
@function
|
|
3228
3228
|
@return {undefined} Always undefined
|
|
3229
3229
|
*/
|
|
3230
|
-
function returnUndefined() {}
|
|
3230
|
+
function returnUndefined() { }
|
|
3231
3231
|
|
|
3232
3232
|
/**
|
|
3233
3233
|
Escape string
|
|
@@ -3522,7 +3522,7 @@ var loadFile = (utils.loadFile = function (path, asy, success, error) {
|
|
|
3522
3522
|
} else if (utils.isCordova) {
|
|
3523
3523
|
/* If Cordova */
|
|
3524
3524
|
utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
|
|
3525
|
-
fileSystem.root.getFile(path, {create: false}, function (fileEntry) {
|
|
3525
|
+
fileSystem.root.getFile(path, { create: false }, function (fileEntry) {
|
|
3526
3526
|
fileEntry.file(function (file) {
|
|
3527
3527
|
var fileReader = new FileReader();
|
|
3528
3528
|
fileReader.onloadend = function (e) {
|
|
@@ -3711,7 +3711,7 @@ var removeFile = (utils.removeFile = function (path, cb) {
|
|
|
3711
3711
|
utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
|
|
3712
3712
|
fileSystem.root.getFile(
|
|
3713
3713
|
path,
|
|
3714
|
-
{create: false},
|
|
3714
|
+
{ create: false },
|
|
3715
3715
|
function (fileEntry) {
|
|
3716
3716
|
fileEntry.remove(cb);
|
|
3717
3717
|
cb && cb(); // jshint ignore:line
|
|
@@ -3779,7 +3779,7 @@ var fileExists = (utils.fileExists = function (path, cb) {
|
|
|
3779
3779
|
utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
|
|
3780
3780
|
fileSystem.root.getFile(
|
|
3781
3781
|
path,
|
|
3782
|
-
{create: false},
|
|
3782
|
+
{ create: false },
|
|
3783
3783
|
function (fileEntry) {
|
|
3784
3784
|
cb(true);
|
|
3785
3785
|
},
|
|
@@ -3845,7 +3845,7 @@ var saveFile = (utils.saveFile = function (path, data, cb, opts) {
|
|
|
3845
3845
|
} else if (utils.isCordova) {
|
|
3846
3846
|
utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
|
|
3847
3847
|
// alasql.utils.removeFile(path,function(){
|
|
3848
|
-
fileSystem.root.getFile(path, {create: true}, function (fileEntry) {
|
|
3848
|
+
fileSystem.root.getFile(path, { create: true }, function (fileEntry) {
|
|
3849
3849
|
fileEntry.createWriter(function (fileWriter) {
|
|
3850
3850
|
fileWriter.onwriteend = function () {
|
|
3851
3851
|
if (cb) {
|
|
@@ -3866,7 +3866,7 @@ var saveFile = (utils.saveFile = function (path, data, cb, opts) {
|
|
|
3866
3866
|
disableAutoBom: false,
|
|
3867
3867
|
};
|
|
3868
3868
|
alasql.utils.extend(opt, opts);
|
|
3869
|
-
var blob = new Blob([data], {type: 'text/plain;charset=utf-8'});
|
|
3869
|
+
var blob = new Blob([data], { type: 'text/plain;charset=utf-8' });
|
|
3870
3870
|
saveAs(blob, path, opt.disableAutoBom);
|
|
3871
3871
|
if (cb) {
|
|
3872
3872
|
res = cb(res);
|
|
@@ -4210,43 +4210,46 @@ var domEmptyChildren = (utils.domEmptyChildren = function (container) {
|
|
|
4210
4210
|
@parameter {string} escape Escape character (optional)
|
|
4211
4211
|
@return {boolean} If value LIKE pattern ESCAPE escape
|
|
4212
4212
|
*/
|
|
4213
|
-
|
|
4213
|
+
var patternCache = {};
|
|
4214
4214
|
var like = (utils.like = function (pattern, value, escape) {
|
|
4215
|
-
|
|
4216
|
-
|
|
4215
|
+
if (!patternCache[pattern]) {
|
|
4216
|
+
// Verify escape character
|
|
4217
|
+
if (!escape) escape = '';
|
|
4217
4218
|
|
|
4218
|
-
|
|
4219
|
-
|
|
4219
|
+
var i = 0;
|
|
4220
|
+
var s = '^';
|
|
4220
4221
|
|
|
4221
|
-
|
|
4222
|
-
|
|
4223
|
-
|
|
4224
|
-
|
|
4222
|
+
while (i < pattern.length) {
|
|
4223
|
+
var c = pattern[i],
|
|
4224
|
+
c1 = '';
|
|
4225
|
+
if (i < pattern.length - 1) c1 = pattern[i + 1];
|
|
4225
4226
|
|
|
4226
|
-
|
|
4227
|
-
|
|
4228
|
-
|
|
4229
|
-
|
|
4230
|
-
|
|
4227
|
+
if (c === escape) {
|
|
4228
|
+
s += '\\' + c1;
|
|
4229
|
+
i++;
|
|
4230
|
+
} else if (c === '[' && c1 === '^') {
|
|
4231
|
+
s += '[^';
|
|
4232
|
+
i++;
|
|
4233
|
+
} else if (c === '[' || c === ']') {
|
|
4234
|
+
s += c;
|
|
4235
|
+
} else if (c === '%') {
|
|
4236
|
+
s += '[\\s\\S]*';
|
|
4237
|
+
} else if (c === '_') {
|
|
4238
|
+
s += '.';
|
|
4239
|
+
} else if ('/.*+?|(){}'.indexOf(c) > -1) {
|
|
4240
|
+
s += '\\' + c;
|
|
4241
|
+
} else {
|
|
4242
|
+
s += c;
|
|
4243
|
+
}
|
|
4231
4244
|
i++;
|
|
4232
|
-
} else if (c === '[' || c === ']') {
|
|
4233
|
-
s += c;
|
|
4234
|
-
} else if (c === '%') {
|
|
4235
|
-
s += '[\\s\\S]*';
|
|
4236
|
-
} else if (c === '_') {
|
|
4237
|
-
s += '.';
|
|
4238
|
-
} else if ('/.*+?|(){}'.indexOf(c) > -1) {
|
|
4239
|
-
s += '\\' + c;
|
|
4240
|
-
} else {
|
|
4241
|
-
s += c;
|
|
4242
4245
|
}
|
|
4243
|
-
i++;
|
|
4244
|
-
}
|
|
4245
4246
|
|
|
4246
|
-
|
|
4247
|
-
|
|
4247
|
+
s += '$';
|
|
4248
|
+
// if(value == undefined) return false;
|
|
4248
4249
|
|
|
4249
|
-
|
|
4250
|
+
patternCache[pattern] = RegExp(s, 'i');
|
|
4251
|
+
}
|
|
4252
|
+
return ('' + (value ?? '')).search(patternCache[pattern]) > -1;
|
|
4250
4253
|
});
|
|
4251
4254
|
|
|
4252
4255
|
utils.glob = function (value, pattern) {
|
|
@@ -4436,32 +4439,32 @@ alasql.parser.parseError = function (str, hash) {
|
|
|
4436
4439
|
};
|
|
4437
4440
|
|
|
4438
4441
|
/**
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
+
Jison parser
|
|
4443
|
+
@param {string} sql SQL statement
|
|
4444
|
+
@return {object} AST (Abstract Syntax Tree)
|
|
4442
4445
|
|
|
4443
|
-
|
|
4444
|
-
|
|
4446
|
+
@todo Create class AST
|
|
4447
|
+
@todo Add other parsers
|
|
4445
4448
|
|
|
4446
|
-
|
|
4447
|
-
|
|
4449
|
+
@example
|
|
4450
|
+
alasql.parse = function(sql) {
|
|
4448
4451
|
// My own parser here
|
|
4449
|
-
|
|
4452
|
+
}
|
|
4450
4453
|
*/
|
|
4451
4454
|
alasql.parse = function (sql) {
|
|
4452
4455
|
return alasqlparser.parse(alasql.utils.uncomment(sql));
|
|
4453
4456
|
};
|
|
4454
4457
|
|
|
4455
4458
|
/**
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
+
List of engines of external databases
|
|
4460
|
+
@type {object}
|
|
4461
|
+
@todo Create collection type
|
|
4459
4462
|
*/
|
|
4460
4463
|
alasql.engines = {};
|
|
4461
4464
|
|
|
4462
4465
|
/**
|
|
4463
|
-
|
|
4464
|
-
|
|
4466
|
+
List of databases
|
|
4467
|
+
@type {object}
|
|
4465
4468
|
*/
|
|
4466
4469
|
alasql.databases = {};
|
|
4467
4470
|
|
|
@@ -4472,7 +4475,7 @@ alasql.databases = {};
|
|
|
4472
4475
|
alasql.databasenum = 0;
|
|
4473
4476
|
|
|
4474
4477
|
/**
|
|
4475
|
-
|
|
4478
|
+
Alasql options object
|
|
4476
4479
|
*/
|
|
4477
4480
|
alasql.options = {
|
|
4478
4481
|
/** Log or throw error */
|
|
@@ -4540,12 +4543,15 @@ alasql.options = {
|
|
|
4540
4543
|
/** Check for NaN and convert it to undefined */
|
|
4541
4544
|
nan: false,
|
|
4542
4545
|
|
|
4543
|
-
excel: {cellDates: true},
|
|
4546
|
+
excel: { cellDates: true },
|
|
4544
4547
|
|
|
4545
4548
|
/** Option for SELECT * FROM a,b */
|
|
4546
4549
|
joinstar: 'overwrite',
|
|
4547
4550
|
|
|
4548
4551
|
loopbreak: 100000,
|
|
4552
|
+
|
|
4553
|
+
/** Whether GETDATE() and NOW() return dates as string. If false, then a Date object is returned */
|
|
4554
|
+
dateAsString: true,
|
|
4549
4555
|
};
|
|
4550
4556
|
|
|
4551
4557
|
//alasql.options.worker = false;
|
|
@@ -4628,7 +4634,7 @@ alasql.autoval = function (tablename, colname, getNext, databaseid) {
|
|
|
4628
4634
|
|
|
4629
4635
|
return (
|
|
4630
4636
|
db.tables[tablename].identities[colname].value -
|
|
4631
|
-
|
|
4637
|
+
db.tables[tablename].identities[colname].step || null
|
|
4632
4638
|
);
|
|
4633
4639
|
};
|
|
4634
4640
|
|
|
@@ -4666,10 +4672,10 @@ alasql.dexec = function (databaseid, sql, params, cb, scope) {
|
|
|
4666
4672
|
var db = alasql.databases[databaseid];
|
|
4667
4673
|
// if(db.databaseid != databaseid) console.trace('got!');
|
|
4668
4674
|
|
|
4669
|
-
var hh;
|
|
4675
|
+
var hh = hash(sql);
|
|
4676
|
+
|
|
4670
4677
|
// Create hash
|
|
4671
4678
|
if (alasql.options.cache) {
|
|
4672
|
-
hh = hash(sql);
|
|
4673
4679
|
var statement = db.sqlCache[hh];
|
|
4674
4680
|
// If database structure was not changed since last time return cache
|
|
4675
4681
|
if (statement && db.dbversion === statement.dbversion) {
|
|
@@ -4677,8 +4683,17 @@ alasql.dexec = function (databaseid, sql, params, cb, scope) {
|
|
|
4677
4683
|
}
|
|
4678
4684
|
}
|
|
4679
4685
|
|
|
4680
|
-
|
|
4681
|
-
|
|
4686
|
+
var ast = db.astCache[hh];
|
|
4687
|
+
if (alasql.options.cache && !ast) {
|
|
4688
|
+
// Create AST cache
|
|
4689
|
+
ast = alasql.parse(sql);
|
|
4690
|
+
if (ast) {
|
|
4691
|
+
// add to AST cache
|
|
4692
|
+
db.astCache[hh] = ast;
|
|
4693
|
+
}
|
|
4694
|
+
} else {
|
|
4695
|
+
ast = alasql.parse(sql);
|
|
4696
|
+
}
|
|
4682
4697
|
if (!ast.statements) {
|
|
4683
4698
|
return;
|
|
4684
4699
|
}
|
|
@@ -4991,6 +5006,7 @@ var Database = (alasql.Database = function (databaseid) {
|
|
|
4991
5006
|
Database.prototype.resetSqlCache = function () {
|
|
4992
5007
|
this.sqlCache = {}; // Cache for compiled SQL statements
|
|
4993
5008
|
this.sqlCacheSize = 0;
|
|
5009
|
+
this.astCache = {}; // Cache for AST objects
|
|
4994
5010
|
};
|
|
4995
5011
|
|
|
4996
5012
|
// Main SQL function
|
|
@@ -10689,14 +10705,17 @@ yy.Over = class Over {
|
|
|
10689
10705
|
s += '.indexOf(';
|
|
10690
10706
|
s += 'alasql.utils.getValueOf(' + leftJS() + '))>-1)';
|
|
10691
10707
|
} else if (Array.isArray(this.right)) {
|
|
10692
|
-
//
|
|
10693
|
-
|
|
10694
|
-
|
|
10695
|
-
|
|
10696
|
-
|
|
10697
|
-
|
|
10698
|
-
|
|
10699
|
-
|
|
10708
|
+
// Added patch to have a better performance for when you have a lot of entries in an IN statement
|
|
10709
|
+
if (!alasql.sets) {
|
|
10710
|
+
alasql.sets = {};
|
|
10711
|
+
}
|
|
10712
|
+
const allValues = this.right.map((value) => value.value);
|
|
10713
|
+
const allValuesStr = allValues.join(",");
|
|
10714
|
+
if (!alasql.sets[allValuesStr]) {
|
|
10715
|
+
// leverage JS Set, which is faster for lookups than arrays
|
|
10716
|
+
alasql.sets[allValuesStr] = new Set(allValues);
|
|
10717
|
+
}
|
|
10718
|
+
s = 'alasql.sets["' + allValuesStr + '"].has(alasql.utils.getValueOf(' + leftJS() + '))';
|
|
10700
10719
|
} else {
|
|
10701
10720
|
s = '(' + rightJS() + '.indexOf(' + leftJS() + ')>-1)';
|
|
10702
10721
|
|
|
@@ -10712,8 +10731,17 @@ yy.Over = class Over {
|
|
|
10712
10731
|
s += '.indexOf(';
|
|
10713
10732
|
s += 'alasql.utils.getValueOf(' + leftJS() + '))<0)';
|
|
10714
10733
|
} else if (Array.isArray(this.right)) {
|
|
10715
|
-
|
|
10716
|
-
|
|
10734
|
+
// Added patch to have a better performance for when you have a lot of entries in a NOT IN statement
|
|
10735
|
+
if (!alasql.sets) {
|
|
10736
|
+
alasql.sets = {};
|
|
10737
|
+
}
|
|
10738
|
+
const allValues = this.right.map((value) => value.value);
|
|
10739
|
+
const allValuesStr = allValues.join(",");
|
|
10740
|
+
if (!alasql.sets[allValuesStr]) {
|
|
10741
|
+
// leverage JS Set, which is faster for lookups than arrays
|
|
10742
|
+
alasql.sets[allValuesStr] = new Set(allValues);
|
|
10743
|
+
}
|
|
10744
|
+
s = '!alasql.sets["' + allValuesStr + '"].has(alasql.utils.getValueOf(' + leftJS() + '))';
|
|
10717
10745
|
} else {
|
|
10718
10746
|
s = '(' + rightJS() + '.indexOf(';
|
|
10719
10747
|
s += leftJS() + ')==-1)';
|
|
@@ -10956,7 +10984,7 @@ yy.Over = class Over {
|
|
|
10956
10984
|
|
|
10957
10985
|
toString() {
|
|
10958
10986
|
var s;
|
|
10959
|
-
const {op, right} = this;
|
|
10987
|
+
const { op, right } = this;
|
|
10960
10988
|
const res = right.toString();
|
|
10961
10989
|
|
|
10962
10990
|
if (op === '~') {
|
|
@@ -12991,27 +13019,30 @@ stdfn.OBJECT_ID = function (objid) {
|
|
|
12991
13019
|
};
|
|
12992
13020
|
|
|
12993
13021
|
stdfn.DATE = function (d) {
|
|
12994
|
-
if (
|
|
13022
|
+
if (!isNaN(d) && d.length === 8) return new Date(+d.substr(0, 4), +d.substr(4, 2) - 1, +d.substr(6, 2));
|
|
12995
13023
|
return newDate(d);
|
|
12996
13024
|
};
|
|
12997
13025
|
|
|
12998
13026
|
stdfn.NOW = function () {
|
|
12999
|
-
|
|
13000
|
-
|
|
13001
|
-
|
|
13002
|
-
|
|
13003
|
-
|
|
13004
|
-
|
|
13005
|
-
|
|
13006
|
-
|
|
13007
|
-
|
|
13008
|
-
|
|
13009
|
-
|
|
13010
|
-
|
|
13011
|
-
|
|
13012
|
-
|
|
13013
|
-
|
|
13014
|
-
|
|
13027
|
+
if (alasql.options.dateAsString) {
|
|
13028
|
+
var d = new Date();
|
|
13029
|
+
var s =
|
|
13030
|
+
d.getFullYear() +
|
|
13031
|
+
'-' +
|
|
13032
|
+
('0' + (d.getMonth() + 1)).substr(-2) +
|
|
13033
|
+
'-' +
|
|
13034
|
+
('0' + d.getDate()).substr(-2);
|
|
13035
|
+
s +=
|
|
13036
|
+
' ' +
|
|
13037
|
+
('0' + d.getHours()).substr(-2) +
|
|
13038
|
+
':' +
|
|
13039
|
+
('0' + d.getMinutes()).substr(-2) +
|
|
13040
|
+
':' +
|
|
13041
|
+
('0' + d.getSeconds()).substr(-2);
|
|
13042
|
+
s += '.' + ('00' + d.getMilliseconds()).substr(-3);
|
|
13043
|
+
return s;
|
|
13044
|
+
}
|
|
13045
|
+
return new Date();
|
|
13015
13046
|
};
|
|
13016
13047
|
|
|
13017
13048
|
stdfn.GETDATE = stdfn.NOW;
|