Skip to content

Commit bc1444d

Browse files
committed
add concat statement
1 parent 6fd584b commit bc1444d

File tree

6 files changed

+70
-43
lines changed

6 files changed

+70
-43
lines changed

htdocs/lib/sql.js/sql-wasm-debug.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,8 @@ Module["onRuntimeInitialized"] = function onRuntimeInitialized() {
12791279
this.handleError(sqlite3_create_function_v2(
12801280
this.db,
12811281
name,
1282-
func.length,
1282+
// M. Pabst, 17.02.2023
1283+
name == "concat" ? -1 : func.length,
12831284
SQLITE_UTF8,
12841285
0,
12851286
func_ptr,

src/client/compiler/parser/SQLMethods.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class SQLMethodStore {
4545
this.pushOneParameterMethod("avg" ,"float", "float");
4646
this.pushOneParameterMethod("sum" ,"float", "float");
4747
this.pushOneParameterMethod("sum" ,"integer", "integer");
48+
this.pushOneParameterMethod("concat" ,"text", "text");
4849

4950
let countMethod = new SQLMethod("count", true, "integer", [new SQLMethodParameter("spalte", "text")]);
5051
countMethod.acceptsStarParameter = true;

src/client/compiler/parser/StatementCleaner.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export class StatementCleaner {
2424
}
2525
}
2626

27+
2728
cleanInsertStatement(ast: InsertNode): string {
2829
let statementHeader: string = `insert into ${ast.table.identifier}`;
2930

src/client/compiler/parser/SymbolResolver.ts

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -567,43 +567,56 @@ export class SymbolResolver {
567567
let methodStore = SQLMethodStore.getInstance();
568568
let methods = methodStore.getMethods(node.identifier);
569569

570-
methods = methods.filter(m => m.parameters.length == node.operands.length);
571-
if (node.operands.length == 1 && node.operands[0].type == TokenType.allColumns) {
572-
methods = methods.filter(m => m.acceptsStarParameter);
573-
node.sqlType = methods[0].returnType;
574-
return node.sqlType;
575-
}
570+
if (node.identifier.toLocaleLowerCase() == 'concat') {
571+
if(node.operands.length == 0){
572+
this.pushError("Die Methode concat benötigt mindestens einen Parameter.", "error", node.position);
573+
return null;
574+
}
575+
let method = methods[0];
576+
node.sqlType = method.returnType;
576577

577-
if (methods.length == 0) {
578-
this.pushError("Es gibt keine passende Methode mit dem Bezeichner '" + node.identifier + "'.", "error", node.position);
579-
return null;
580-
}
578+
return node.sqlType;
579+
} else {
581580

582-
for (let operand of node.operands) {
583-
if (this.resolveTerm(operand) == null) {
581+
methods = methods.filter(m => m.parameters.length == node.operands.length);
582+
if (node.operands.length == 1 && node.operands[0].type == TokenType.allColumns) {
583+
methods = methods.filter(m => m.acceptsStarParameter);
584584
node.sqlType = methods[0].returnType;
585585
return node.sqlType;
586586
}
587-
}
588587

589-
for (let method of methods) {
590-
let found = true;
591-
for (let i = 0; i < method.parameters.length; i++) {
592-
let methodParameter = method.parameters[i];
593-
let operand = node.operands[i];
594-
if (!operand.sqlType.canCastTo(methodParameter.type)) {
595-
found = false;
596-
break;
588+
if (methods.length == 0) {
589+
this.pushError("Es gibt keine passende Methode mit dem Bezeichner '" + node.identifier + "'.", "error", node.position);
590+
return null;
591+
}
592+
593+
for (let operand of node.operands) {
594+
if (this.resolveTerm(operand) == null) {
595+
node.sqlType = methods[0].returnType;
596+
return node.sqlType;
597597
}
598598
}
599-
if (found) {
600-
node.sqlType = method.returnType;
601-
return node.sqlType;
599+
600+
for (let method of methods) {
601+
let found = true;
602+
for (let i = 0; i < method.parameters.length; i++) {
603+
let methodParameter = method.parameters[i];
604+
let operand = node.operands[i];
605+
if (!operand.sqlType.canCastTo(methodParameter.type)) {
606+
found = false;
607+
break;
608+
}
609+
}
610+
if (found) {
611+
node.sqlType = method.returnType;
612+
return node.sqlType;
613+
}
602614
}
615+
616+
this.pushError("Es gibt keine passende Methode mit dem Bezeichner '" + node.identifier + "'.", "error", node.position);
617+
return null;
603618
}
604619

605-
this.pushError("Es gibt keine passende Methode mit dem Bezeichner '" + node.identifier + "'.", "error", node.position);
606-
return null;
607620

608621
}
609622

@@ -693,18 +706,18 @@ export class SymbolResolver {
693706
if (columns.length > 0) {
694707
if (astNode.select != null) {
695708
let table = this.resolveSelect(astNode.select);
696-
if(table?.columns != null){
697-
if(columns.length != table.columns.length){
709+
if (table?.columns != null) {
710+
if (columns.length != table.columns.length) {
698711
this.pushError("Die insert-Anweisung erwartet " + columns.length + " Werte je Datensatz, die select-Anweisung liefert aber " + table.columns.length + ".", "error", astNode.position);
699712
} else {
700-
for(let i = 0; i < columns.length; i++){
713+
for (let i = 0; i < columns.length; i++) {
701714
let insertColumn = columns[i];
702715
let selectColumn = table.columns[i];
703-
if(insertColumn.type != null && selectColumn.type != null){
704-
if(!selectColumn.type.canCastTo(insertColumn.type)){
705-
this.pushError("Der Datentyp " + selectColumn.type.toString() + " der "
706-
+ (i+1) + "-ten Spalte des select-Terms kann nicht in den Datentyp " +
707-
insertColumn.type.toString() + " der entsprechenden Spalte der insert-Anweisung umgewandelt werden.", "error", astNode.position );
716+
if (insertColumn.type != null && selectColumn.type != null) {
717+
if (!selectColumn.type.canCastTo(insertColumn.type)) {
718+
this.pushError("Der Datentyp " + selectColumn.type.toString() + " der "
719+
+ (i + 1) + "-ten Spalte des select-Terms kann nicht in den Datentyp " +
720+
insertColumn.type.toString() + " der entsprechenden Spalte der insert-Anweisung umgewandelt werden.", "error", astNode.position);
708721
}
709722
}
710723
}

src/client/sqljs-worker/sqljsWorker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
importScripts('../../lib/sql.js/sql-wasm.js', 'sqljsWorkerTools.js');
1+
importScripts('../../lib/sql.js/sql-wasm-debug.js', 'sqljsWorkerTools.js');
22

33
//@ts-ignore
44
var initsql = initSqlJs({

src/client/sqljs-worker/sqljsWorkerTools.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ function createDb(SQL, buffer) {
44

55
db.create_function("isDate", function (inputText) {
66

7-
if(inputText == null) return true;
7+
if (inputText == null) return true;
88
if (typeof inputText != 'string') return false;
99

1010
// var dateformat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
@@ -57,8 +57,8 @@ function createDb(SQL, buffer) {
5757
});
5858

5959
db.create_function("isDateTime", function (inputText) {
60-
if(inputText == null) return true;
61-
60+
if (inputText == null) return true;
61+
6262
if (typeof inputText != 'string') return false;
6363

6464
// var dateformat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/;
@@ -74,10 +74,10 @@ function createDb(SQL, buffer) {
7474
// var mm = parseInt(dateStr[1]);
7575
// var yy = parseInt(dateStr[0]);
7676
if (dateStr.length != 10) return false;
77-
var dd = parseInt(dateStr.substring(8,10));
77+
var dd = parseInt(dateStr.substring(8, 10));
7878
var mm = parseInt(dateStr.substring(5, 7));
7979
var yy = parseInt(dateStr.substring(0, 4));
80-
// Create list of days of a month [assume there is no leap year by default]
80+
// Create list of days of a month [assume there is no leap year by default]
8181
var ListofDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
8282
if (mm == 1 || mm > 2) {
8383
if (dd > ListofDays[mm - 1]) {
@@ -107,14 +107,25 @@ function createDb(SQL, buffer) {
107107
});
108108

109109
db.create_function("isTime", function (inputText) {
110-
if(inputText == null) return true;
111-
110+
if (inputText == null) return true;
111+
112112
if (typeof inputText != 'string') return false;
113113

114114
var timeformat = /^([01][0-9]|2[0123]):([0-5][0-9]):([0-5][0-9])$/;
115115
// Match the date format through regular expression
116116
return inputText.match(timeformat) != null;
117117
});
118+
119+
db.create_function("concat", function () {
120+
console.log("Hier!");
121+
if (arguments == null) return "";
122+
let erg = "";
123+
for(let i = 0; i < arguments.length; i++){
124+
erg += ("" + arguments[i]);
125+
}
126+
return erg;
127+
})
128+
118129
return db;
119130
}
120131

0 commit comments

Comments
 (0)