diff --git a/package-lock.json b/package-lock.json index f9b450ab4..2003216d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,13 +10,13 @@ "hasInstallScript": true, "license": "MIT", "devDependencies": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "@eslint/compat": "^2.1.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^9.39.4", "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "@types/sql.js": "^1.4.11", "@typescript-eslint/eslint-plugin": "^8.62.1", "@typescript-eslint/parser": "^8.62.1", @@ -36,9 +36,9 @@ } }, "node_modules/@abaplint/core": { - "version": "2.120.6", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.6.tgz", - "integrity": "sha512-2JFbMa9tlfYHdSHufgjhhiCbTDq4wA5K69sFRCHT31+LHaFIs8XkoF7VCR/ckW+nd5U66GWdskVD4OHeJE0fQw==", + "version": "2.120.9", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.9.tgz", + "integrity": "sha512-Zbs2gZT+vieNnegsTEPR8Afh5KDTKKCeVguEB1GgAj6ca8j+CFTpKvqMi9XnCj94cXmWMT+FkOI4MM4klVKLug==", "dev": true, "license": "MIT", "dependencies": { @@ -1439,9 +1439,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1665,16 +1665,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", - "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { @@ -2173,9 +2173,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", "dev": true, "license": "MIT", "dependencies": { @@ -3848,9 +3848,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", "dev": true, "license": "MIT", "dependencies": { @@ -5107,9 +5107,9 @@ } }, "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index faa2890fc..47156d3c1 100644 --- a/package.json +++ b/package.json @@ -42,13 +42,13 @@ }, "homepage": "https://github.com/abaplint/transpiler_poc#readme", "devDependencies": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "@eslint/compat": "^2.1.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^9.39.4", "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "@types/sql.js": "^1.4.11", "@typescript-eslint/eslint-plugin": "^8.62.1", "@typescript-eslint/parser": "^8.62.1", diff --git a/packages/cli/package-lock.json b/packages/cli/package-lock.json index 89276197d..3b18cb51f 100644 --- a/packages/cli/package-lock.json +++ b/packages/cli/package-lock.json @@ -1,21 +1,21 @@ { "name": "@abaplint/transpiler-cli", - "version": "2.13.47", + "version": "2.13.48", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@abaplint/transpiler-cli", - "version": "2.13.47", + "version": "2.13.48", "license": "MIT", "bin": { "abap_transpile": "abap_transpile" }, "devDependencies": { - "@abaplint/core": "^2.120.6", - "@abaplint/transpiler": "^2.13.47", + "@abaplint/core": "^2.120.9", + "@abaplint/transpiler": "^2.13.48", "@types/glob": "^8.1.0", - "@types/node": "^24.12.2", + "@types/node": "^24.13.3", "@types/progress": "^2.0.7", "glob": "=7.2.0", "p-limit": "^3.1.0", @@ -30,9 +30,9 @@ } }, "node_modules/@abaplint/core": { - "version": "2.120.6", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.6.tgz", - "integrity": "sha512-2JFbMa9tlfYHdSHufgjhhiCbTDq4wA5K69sFRCHT31+LHaFIs8XkoF7VCR/ckW+nd5U66GWdskVD4OHeJE0fQw==", + "version": "2.120.9", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.9.tgz", + "integrity": "sha512-Zbs2gZT+vieNnegsTEPR8Afh5KDTKKCeVguEB1GgAj6ca8j+CFTpKvqMi9XnCj94cXmWMT+FkOI4MM4klVKLug==", "dev": true, "license": "MIT", "dependencies": { @@ -48,13 +48,13 @@ } }, "node_modules/@abaplint/transpiler": { - "version": "2.13.47", - "resolved": "https://registry.npmjs.org/@abaplint/transpiler/-/transpiler-2.13.47.tgz", - "integrity": "sha512-JcvXphDqLy1zwPtXeWp4jEqepR7NGymkuKPMKWwzb92xxOTqFMfWuVhRUJSyVdctdVK7V/tmnFck9S3Tqoc7qw==", + "version": "2.13.48", + "resolved": "https://registry.npmjs.org/@abaplint/transpiler/-/transpiler-2.13.48.tgz", + "integrity": "sha512-UeHkd8AP/X3X9Ad00nUlbxeOxFaZlhGbFsj7vLJPLBVs9dHixFaMZFJn2aU86qbwJzsft3fO0ruFjy/LXjrpTg==", "dev": true, "license": "MIT", "dependencies": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "source-map": "^0.7.6" }, "funding": { @@ -167,13 +167,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", - "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/progress": { @@ -1713,9 +1713,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -1945,9 +1945,9 @@ }, "dependencies": { "@abaplint/core": { - "version": "2.120.6", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.6.tgz", - "integrity": "sha512-2JFbMa9tlfYHdSHufgjhhiCbTDq4wA5K69sFRCHT31+LHaFIs8XkoF7VCR/ckW+nd5U66GWdskVD4OHeJE0fQw==", + "version": "2.120.9", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.9.tgz", + "integrity": "sha512-Zbs2gZT+vieNnegsTEPR8Afh5KDTKKCeVguEB1GgAj6ca8j+CFTpKvqMi9XnCj94cXmWMT+FkOI4MM4klVKLug==", "dev": true, "requires": { "fast-xml-parser": "^5.9.3", @@ -1956,12 +1956,12 @@ } }, "@abaplint/transpiler": { - "version": "2.13.47", - "resolved": "https://registry.npmjs.org/@abaplint/transpiler/-/transpiler-2.13.47.tgz", - "integrity": "sha512-JcvXphDqLy1zwPtXeWp4jEqepR7NGymkuKPMKWwzb92xxOTqFMfWuVhRUJSyVdctdVK7V/tmnFck9S3Tqoc7qw==", + "version": "2.13.48", + "resolved": "https://registry.npmjs.org/@abaplint/transpiler/-/transpiler-2.13.48.tgz", + "integrity": "sha512-UeHkd8AP/X3X9Ad00nUlbxeOxFaZlhGbFsj7vLJPLBVs9dHixFaMZFJn2aU86qbwJzsft3fO0ruFjy/LXjrpTg==", "dev": true, "requires": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "source-map": "^0.7.6" } }, @@ -2048,12 +2048,12 @@ "dev": true }, "@types/node": { - "version": "24.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", - "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "requires": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "@types/progress": { @@ -3046,9 +3046,9 @@ "dev": true }, "undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true }, "update-browserslist-db": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 07aea68c2..dbeee147c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@abaplint/transpiler-cli", - "version": "2.13.47", + "version": "2.13.48", "description": "Transpiler - Command Line Interface", "funding": "https://github.com/sponsors/larshp", "bin": { @@ -27,10 +27,10 @@ "author": "abaplint", "license": "MIT", "devDependencies": { - "@abaplint/core": "^2.120.6", - "@abaplint/transpiler": "^2.13.47", + "@abaplint/core": "^2.120.9", + "@abaplint/transpiler": "^2.13.48", "@types/glob": "^8.1.0", - "@types/node": "^24.12.2", + "@types/node": "^24.13.3", "@types/progress": "^2.0.7", "glob": "=7.2.0", "p-limit": "^3.1.0", diff --git a/packages/extras/package-lock.json b/packages/extras/package-lock.json index c0be48c77..6df283528 100644 --- a/packages/extras/package-lock.json +++ b/packages/extras/package-lock.json @@ -9,25 +9,25 @@ "version": "0.1.2", "license": "PolyForm-Noncommercial-1.0.0", "devDependencies": { - "@abaplint/core": "^2.120.6", - "@abaplint/transpiler": "^2.13.47", + "@abaplint/core": "^2.120.9", + "@abaplint/transpiler": "^2.13.48", "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "chai": "^4.5.0", "mocha": "^11.7.6", "source-map-support": "^0.5.21", "typescript": "^6.0.3" }, "peerDependencies": { - "@abaplint/core": "^2.120.6", - "@abaplint/transpiler": "^2.13.47" + "@abaplint/core": "^2.120.9", + "@abaplint/transpiler": "^2.13.48" } }, "node_modules/@abaplint/core": { - "version": "2.120.6", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.6.tgz", - "integrity": "sha512-2JFbMa9tlfYHdSHufgjhhiCbTDq4wA5K69sFRCHT31+LHaFIs8XkoF7VCR/ckW+nd5U66GWdskVD4OHeJE0fQw==", + "version": "2.120.9", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.9.tgz", + "integrity": "sha512-Zbs2gZT+vieNnegsTEPR8Afh5KDTKKCeVguEB1GgAj6ca8j+CFTpKvqMi9XnCj94cXmWMT+FkOI4MM4klVKLug==", "dev": true, "license": "MIT", "dependencies": { @@ -43,13 +43,13 @@ } }, "node_modules/@abaplint/transpiler": { - "version": "2.13.47", - "resolved": "https://registry.npmjs.org/@abaplint/transpiler/-/transpiler-2.13.47.tgz", - "integrity": "sha512-JcvXphDqLy1zwPtXeWp4jEqepR7NGymkuKPMKWwzb92xxOTqFMfWuVhRUJSyVdctdVK7V/tmnFck9S3Tqoc7qw==", + "version": "2.13.48", + "resolved": "https://registry.npmjs.org/@abaplint/transpiler/-/transpiler-2.13.48.tgz", + "integrity": "sha512-UeHkd8AP/X3X9Ad00nUlbxeOxFaZlhGbFsj7vLJPLBVs9dHixFaMZFJn2aU86qbwJzsft3fO0ruFjy/LXjrpTg==", "dev": true, "license": "MIT", "dependencies": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "source-map": "^0.7.6" }, "funding": { @@ -113,9 +113,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { diff --git a/packages/extras/package.json b/packages/extras/package.json index 0331fa25e..82c1d917c 100644 --- a/packages/extras/package.json +++ b/packages/extras/package.json @@ -28,15 +28,15 @@ "author": "Heliconia Labs ApS", "license": "PolyForm-Noncommercial-1.0.0", "peerDependencies": { - "@abaplint/core": "^2.120.6", - "@abaplint/transpiler": "^2.13.47" + "@abaplint/core": "^2.120.9", + "@abaplint/transpiler": "^2.13.48" }, "devDependencies": { - "@abaplint/core": "^2.120.6", - "@abaplint/transpiler": "^2.13.47", + "@abaplint/core": "^2.120.9", + "@abaplint/transpiler": "^2.13.48", "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "chai": "^4.5.0", "mocha": "^11.7.6", "source-map-support": "^0.5.21", diff --git a/packages/runtime/package-lock.json b/packages/runtime/package-lock.json index c92b3e9c9..3d5703984 100644 --- a/packages/runtime/package-lock.json +++ b/packages/runtime/package-lock.json @@ -1,12 +1,12 @@ { "name": "@abaplint/runtime", - "version": "2.13.47", + "version": "2.13.48", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@abaplint/runtime", - "version": "2.13.47", + "version": "2.13.48", "license": "MIT", "dependencies": { "temporal-polyfill": "^0.3.2" @@ -14,7 +14,7 @@ "devDependencies": { "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "chai": "^4.5.0", "mocha": "^11.7.6", "source-map-support": "^0.5.21", @@ -144,9 +144,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1280,9 +1280,9 @@ "dev": true }, "@types/node": { - "version": "24.13.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", - "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "requires": { "undici-types": "~7.18.0" diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 5a7d381e3..93e5dd77e 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@abaplint/runtime", - "version": "2.13.47", + "version": "2.13.48", "description": "Transpiler - Runtime", "main": "build/src/index.js", "typings": "build/src/index.d.ts", @@ -31,7 +31,7 @@ "devDependencies": { "@types/chai": "^4.3.20", "@types/mocha": "^10.0.10", - "@types/node": "^24.13.2", + "@types/node": "^24.13.3", "chai": "^4.5.0", "mocha": "^11.7.6", "source-map-support": "^0.5.21", diff --git a/packages/runtime/src/statements/modify_database.ts b/packages/runtime/src/statements/modify_database.ts index d52a07b46..4c4c90742 100644 --- a/packages/runtime/src/statements/modify_database.ts +++ b/packages/runtime/src/statements/modify_database.ts @@ -3,6 +3,9 @@ import {FieldSymbol, Structure, Table} from "../types"; import {ICharacter} from "../types/_character"; import {insertDatabase} from "./insert_database"; import {updateDatabase} from "./update_database"; +import {ABAP} from ".."; + +declare const abap: ABAP; export interface IModifyDatabaseOptions { values?: Structure | FieldSymbol, @@ -18,12 +21,18 @@ export async function modifyDatabase(table: string | ICharacter, options: IModif } if (options.table) { + let subrc = 0; + let dbcnt = 0; for (const row of options.table.array()) { - const subrc = await insertDatabase(table, {values: row}, context); - if (subrc !== 0) { + const insertSubrc = await insertDatabase(table, {values: row}, context); + if (insertSubrc !== 0) { await updateDatabase(table, {from: row}, context); } + subrc = Math.max(subrc, abap.builtin.sy.get().subrc.get()); + dbcnt += abap.builtin.sy.get().dbcnt.get(); } + abap.builtin.sy.get().subrc.set(subrc); + abap.builtin.sy.get().dbcnt.set(dbcnt); } else if (options.values) { const subrc = await insertDatabase(table, {values: options.values}, context); if (subrc !== 0) { @@ -32,4 +41,4 @@ export async function modifyDatabase(table: string | ICharacter, options: IModif } else { throw new Error("modifyDatabase todo"); } -} \ No newline at end of file +} diff --git a/packages/runtime/src/statements/select.ts b/packages/runtime/src/statements/select.ts index 2791d4441..aa2e572df 100644 --- a/packages/runtime/src/statements/select.ts +++ b/packages/runtime/src/statements/select.ts @@ -66,7 +66,11 @@ export function rowsToTarget(target: Structure | Table | HashedTable | FieldSymb } } else { const columnName = Object.keys(row)[0]; - targetRow.set(row[columnName]); + if (row[columnName] === null) { + targetRow.clear(); + } else { + targetRow.set(row[columnName]); + } } abap.statements.insertInternal({table: target, data: targetRow, noClone: true}); @@ -74,10 +78,20 @@ export function rowsToTarget(target: Structure | Table | HashedTable | FieldSymb } else if (Array.isArray(target)) { for (let index = 0; index < target.length; index++) { const element = target[index]; - element.set(rows[0][Object.keys(rows[0])[index]]); + const value = rows[0][Object.keys(rows[0])[index]]; + if (value === null) { + element.clear(); + } else { + element.set(value); + } } } else if (target !== undefined) { - // its a simple type - target.set(rows[0][Object.keys(rows[0])[0]]); + // its a simple type + const value = rows[0][Object.keys(rows[0])[0]]; + if (value === null) { + target.clear(); + } else { + target.set(value); + } } -} \ No newline at end of file +} diff --git a/packages/runtime/src/types/decfloat34.ts b/packages/runtime/src/types/decfloat34.ts index c8398677e..a2d4235e3 100644 --- a/packages/runtime/src/types/decfloat34.ts +++ b/packages/runtime/src/types/decfloat34.ts @@ -17,13 +17,15 @@ export class DecFloat34 { return n; } - public set(value: INumeric | ICharacter | Hex | string | number) { + public set(value: INumeric | ICharacter | Hex | string | number | DecFloat34) { if (typeof value === "number") { this.value = value; } else if (typeof value === "string" && value.trim().length === 0) { this.value = 0; } else if (typeof value === "string") { this.value = parseFloat(value); + } else if (value instanceof DecFloat34) { + this.value = value.getRaw(); } else if (value instanceof Float) { this.value = value.getRaw(); } else if (value instanceof Hex || value instanceof XString) { @@ -48,4 +50,4 @@ export class DecFloat34 { text = text.replace(".", ","); return text; } -} \ No newline at end of file +} diff --git a/packages/runtime/src/types/float.ts b/packages/runtime/src/types/float.ts index 77db912df..3fcfcde7b 100644 --- a/packages/runtime/src/types/float.ts +++ b/packages/runtime/src/types/float.ts @@ -3,6 +3,7 @@ import {XString} from "./xstring"; import {ICharacter} from "./_character"; import {INumeric} from "./_numeric"; import {Integer8} from "./integer8"; +import {DecFloat34} from "./decfloat34"; /* function getNumberParts(x: number) { @@ -66,7 +67,7 @@ export class Float { this.value = parseFloat(value); } else if (value instanceof Integer8) { this.value = Number(value.get()); - } else if (value instanceof Float) { + } else if (value instanceof Float || value instanceof DecFloat34) { this.value = value.getRaw(); } else if (value instanceof Hex || value instanceof XString) { // todo, how/if should this work? @@ -100,4 +101,4 @@ export class Float { return mantissa + "E-" + exponent; } } -} \ No newline at end of file +} diff --git a/packages/runtime/src/types/integer.ts b/packages/runtime/src/types/integer.ts index 8e2f27183..674e5884d 100644 --- a/packages/runtime/src/types/integer.ts +++ b/packages/runtime/src/types/integer.ts @@ -8,6 +8,7 @@ import {Integer8} from "./integer8"; import {HexUInt8} from "./hex_uint8"; import {Character} from "./character"; import {String} from "./string"; +import {DecFloat34} from "./decfloat34"; export const DIGITS = new RegExp(/^\s*-?\+?\d+\.?\d* *$/i); @@ -69,7 +70,7 @@ export class Integer implements INumeric { return this; } - public set(value: INumeric | ICharacter | Hex | string | number | Integer | Float) { + public set(value: INumeric | ICharacter | Hex | string | number | Integer | Float | DecFloat34) { if (this.constant === true) { throw new Error("Changing constant"); } @@ -84,7 +85,7 @@ export class Integer implements INumeric { this.value = toInteger(value.get()); } else if (value instanceof Integer8) { this.set(Number(value.get())); - } else if (value instanceof Float) { + } else if (value instanceof Float || value instanceof DecFloat34) { this.set(Math.round(value.getRaw())); } else if (value instanceof Hex || value instanceof XString || value instanceof HexUInt8) { let num = parseInt(value.get(), 16); @@ -117,4 +118,4 @@ export class Integer implements INumeric { public get(): number { return this.value; } -} \ No newline at end of file +} diff --git a/packages/runtime/src/types/integer8.ts b/packages/runtime/src/types/integer8.ts index cb8fdd2ae..75e38438c 100644 --- a/packages/runtime/src/types/integer8.ts +++ b/packages/runtime/src/types/integer8.ts @@ -8,6 +8,7 @@ import {Integer} from "./integer"; import {getBit} from "../statements/get_bit"; import {Character} from "./character"; import {HexUInt8} from "./hex_uint8"; +import {DecFloat34} from "./decfloat34"; const digits = new RegExp(/^\s*-?\+?\d+\.?\d* *$/i); @@ -31,7 +32,7 @@ export class Integer8 { return this.qualifiedName; } - public set(value: INumeric | ICharacter | Hex | string | number | bigint | Integer8 | Integer | Float) { + public set(value: INumeric | ICharacter | Hex | string | number | bigint | Integer8 | Integer | Float | DecFloat34) { if (typeof value === "number") { this.value = BigInt(value); } else if (typeof value === "bigint") { @@ -46,7 +47,7 @@ export class Integer8 { throwError("CX_SY_CONVERSION_NO_NUMBER"); } this.value = BigInt(value); - } else if (value instanceof Float) { + } else if (value instanceof Float || value instanceof DecFloat34) { this.set(Math.round(value.getRaw())); } else if (value instanceof Hex || value instanceof XString || value instanceof HexUInt8) { if (value.get().length === 16) { @@ -75,4 +76,4 @@ export class Integer8 { public get(): bigint { return this.value; } -} \ No newline at end of file +} diff --git a/packages/runtime/src/types/packed.ts b/packages/runtime/src/types/packed.ts index ea86678bf..5fc3df8c7 100644 --- a/packages/runtime/src/types/packed.ts +++ b/packages/runtime/src/types/packed.ts @@ -2,6 +2,7 @@ import {Float} from "./float"; import {INumeric} from "./_numeric"; import {throwError} from "../throw_error"; import {Integer8} from "./integer8"; +import {DecFloat34} from "./decfloat34"; const digits = new RegExp(/^\s*-?\+?\d*\.?\d*(?:E[+-]?\d+)? *$/i); @@ -124,7 +125,7 @@ export class Packed implements INumeric { this.value = this.stringToScaled(value); } else if (value instanceof Integer8) { this.value = (value.get() as unknown as bigint) * pow10(this.decimals); - } else if (value instanceof Float) { + } else if (value instanceof Float || value instanceof DecFloat34) { this.value = this.numberToScaled(value.getRaw()); } else { this.set(value.get()); diff --git a/packages/transpiler/package-lock.json b/packages/transpiler/package-lock.json index 740dc5ea7..0a9a38303 100644 --- a/packages/transpiler/package-lock.json +++ b/packages/transpiler/package-lock.json @@ -1,15 +1,15 @@ { "name": "@abaplint/transpiler", - "version": "2.13.47", + "version": "2.13.48", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@abaplint/transpiler", - "version": "2.13.47", + "version": "2.13.48", "license": "MIT", "dependencies": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "source-map": "^0.7.6" }, "devDependencies": { @@ -25,9 +25,9 @@ } }, "node_modules/@abaplint/core": { - "version": "2.120.6", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.6.tgz", - "integrity": "sha512-2JFbMa9tlfYHdSHufgjhhiCbTDq4wA5K69sFRCHT31+LHaFIs8XkoF7VCR/ckW+nd5U66GWdskVD4OHeJE0fQw==", + "version": "2.120.9", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.9.tgz", + "integrity": "sha512-Zbs2gZT+vieNnegsTEPR8Afh5KDTKKCeVguEB1GgAj6ca8j+CFTpKvqMi9XnCj94cXmWMT+FkOI4MM4klVKLug==", "license": "MIT", "dependencies": { "fast-xml-parser": "^5.9.3", @@ -1327,9 +1327,9 @@ }, "dependencies": { "@abaplint/core": { - "version": "2.120.6", - "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.6.tgz", - "integrity": "sha512-2JFbMa9tlfYHdSHufgjhhiCbTDq4wA5K69sFRCHT31+LHaFIs8XkoF7VCR/ckW+nd5U66GWdskVD4OHeJE0fQw==", + "version": "2.120.9", + "resolved": "https://registry.npmjs.org/@abaplint/core/-/core-2.120.9.tgz", + "integrity": "sha512-Zbs2gZT+vieNnegsTEPR8Afh5KDTKKCeVguEB1GgAj6ca8j+CFTpKvqMi9XnCj94cXmWMT+FkOI4MM4klVKLug==", "requires": { "fast-xml-parser": "^5.9.3", "json5": "^2.2.3", diff --git a/packages/transpiler/package.json b/packages/transpiler/package.json index 2c6faad00..9487a291e 100644 --- a/packages/transpiler/package.json +++ b/packages/transpiler/package.json @@ -1,6 +1,6 @@ { "name": "@abaplint/transpiler", - "version": "2.13.47", + "version": "2.13.48", "description": "Transpiler", "main": "build/src/index.js", "typings": "build/src/index.d.ts", @@ -29,7 +29,7 @@ "author": "abaplint", "license": "MIT", "dependencies": { - "@abaplint/core": "^2.120.6", + "@abaplint/core": "^2.120.9", "source-map": "^0.7.6" }, "devDependencies": { diff --git a/packages/transpiler/src/expressions/sql_cond.ts b/packages/transpiler/src/expressions/sql_cond.ts index 96a96d1e1..cefa830e3 100644 --- a/packages/transpiler/src/expressions/sql_cond.ts +++ b/packages/transpiler/src/expressions/sql_cond.ts @@ -164,14 +164,32 @@ export class SQLCondTranspiler implements IExpressionTranspiler { } let ret = ""; + let hostExpression = false; for (const child of node.getChildren()) { + if (!(child instanceof abaplint.Nodes.ExpressionNode) && child.getFirstToken().getStr() === "@") { + hostExpression = true; + continue; + } if (ret !== "") { ret += " "; } - if ((child.get() instanceof abaplint.Expressions.SQLFieldName + if (hostExpression + && child instanceof abaplint.Nodes.ExpressionNode + && child.get() instanceof abaplint.Expressions.SimpleSource3) { + const code = new SimpleSource3Transpiler(true).transpile(child, traversal).getCode(); + ret += `'" + ${code} + "'`; + hostExpression = false; + } else if ((child.get() instanceof abaplint.Expressions.SQLFieldName || child.get() instanceof abaplint.Expressions.SQLAliasField) && child instanceof abaplint.Nodes.ExpressionNode) { - ret += new SQLFieldNameTranspiler().transpile(child, traversal).getCode(); + if (hostExpression) { + let name = traversal.prefixAndName(child.getFirstToken(), filename).replace("~", "$"); + name = Traversal.prefixVariable(Traversal.escapeNamespace(name)!); + ret += `'" + ${name}.get() + "'`; + hostExpression = false; + } else { + ret += new SQLFieldNameTranspiler().transpile(child, traversal).getCode(); + } } else if (child.get() instanceof abaplint.Expressions.SQLSource && child instanceof abaplint.Nodes.ExpressionNode) { ret += this.sqlSource(child, traversal, filename, table); diff --git a/packages/transpiler/src/statements/perform.ts b/packages/transpiler/src/statements/perform.ts index 5e91add69..679897cc1 100644 --- a/packages/transpiler/src/statements/perform.ts +++ b/packages/transpiler/src/statements/perform.ts @@ -62,7 +62,7 @@ export class PerformTranspiler implements IStatementTranspiler { } index = 0; - for (const u of node.findDirectExpression(abaplint.Expressions.PerformUsing)?.findDirectExpressions(abaplint.Expressions.Source) || []) { + for (const u of node.findDirectExpression(abaplint.Expressions.PerformUsing)?.findDirectExpressions(abaplint.Expressions.SimpleSource3) || []) { const name = def?.getUsingParameters()[index].getName().toLowerCase(); if (name === undefined) { continue; @@ -85,4 +85,4 @@ export class PerformTranspiler implements IStatementTranspiler { } } -} \ No newline at end of file +} diff --git a/test/database.ts b/test/database.ts index 781651164..6a0b826a0 100644 --- a/test/database.ts +++ b/test/database.ts @@ -104,6 +104,28 @@ describe("Top level tests, Database", () => { }); }); + it("MODIFY FROM TABLE sets sy-dbcnt for all rows", async () => { + const code = ` + DATA tab TYPE STANDARD TABLE OF t100 WITH DEFAULT KEY. + DATA row LIKE LINE OF tab. + + row-arbgb = 'HELLO'. + row-msgnr = '001'. + APPEND row TO tab. + + row-msgnr = '002'. + APPEND row TO tab. + + MODIFY t100 FROM TABLE tab. + WRITE sy-dbcnt.`; + const files = [ + {filename: "zfoobar.prog.abap", contents: code}, + {filename: "t100.tabl.xml", contents: tabl_t100xml}]; + await runAllDatabases(abap, files, () => { + expect(abap.console.get()).to.equal("2"); + }, {postgres: false, snowflake: false}); + }); + it("MODIFY FROM, inserts and update", async () => { const code = ` DATA tab TYPE STANDARD TABLE OF t100 WITH DEFAULT KEY. @@ -763,6 +785,43 @@ ASSERT sy-subrc = 0.`; }); }); + it("SELECT WHERE compares two host boolean values", async () => { + const code = ` +DATA shortage_only TYPE abap_bool VALUE abap_true. +DATA lt_t100 TYPE STANDARD TABLE OF t100. +SELECT * FROM t100 + WHERE @shortage_only = @abap_false OR msgnr = '999' + INTO TABLE @lt_t100. +WRITE lines( lt_t100 ). +shortage_only = abap_false. +SELECT * FROM t100 + WHERE @shortage_only = @abap_false OR msgnr = '999' + INTO TABLE @lt_t100. +WRITE lines( lt_t100 ).`; + const files = [ + {filename: "zfoobar.prog.abap", contents: code}, + {filename: "t100.tabl.xml", contents: tabl_t100xml}, + {filename: "zag_unit_test.msag.xml", contents: msag_zag_unit_test}]; + await runAllDatabases(abap, files, () => { + expect(abap.console.get()).to.equal("02"); + }, {postgres: false, snowflake: false}); + }); + + it("SELECT aggregate over empty result into packed", async () => { + const code = ` + DATA lv_sum TYPE p LENGTH 7 DECIMALS 3. + SELECT SUM( valuefield ) FROM zquan INTO @lv_sum. + IF lv_sum = 0 AND sy-subrc = 0. + WRITE 'okay'. + ENDIF.`; + const files = [ + {filename: "zfoobar.prog.abap", contents: code}, + {filename: "zquan.tabl.xml", contents: zquan}]; + await runAllDatabases(abap, files, () => { + expect(abap.console.get()).to.equal("okay"); + }, {postgres: false, snowflake: false}); + }); + it("MODIFY simple", async () => { const code = ` DATA ls_t100 TYPE t100. diff --git a/test/expressions/conv.ts b/test/expressions/conv.ts index 9334efd54..d74e48d62 100644 --- a/test/expressions/conv.ts +++ b/test/expressions/conv.ts @@ -48,7 +48,22 @@ WRITE / int.`; expect(abap.console.get()).to.equal("123"); }); + it("inline declaration in FORM", async () => { + const code = ` +FORM run. + DATA(sdf) = CONV decfloat34( 1 ). + WRITE / sdf. +ENDFORM. + +START-OF-SELECTION. + PERFORM run.`; + const js = await run(code); + const f = new AsyncFunction("abap", js); + await f(abap); + expect(abap.console.get()).to.equal("1"); + }); + // todo: LET // todo: test concat and arithmetics -}); \ No newline at end of file +}); diff --git a/test/expressions/value.ts b/test/expressions/value.ts index ed0ec852a..2a3b11969 100644 --- a/test/expressions/value.ts +++ b/test/expressions/value.ts @@ -505,4 +505,45 @@ START-OF-SELECTION. expect(abap.console.get()).to.equal("1\n2"); }); -}); \ No newline at end of file + it("VALUE FOR assigns derived decfloat34 fields", async () => { + const code = ` +CLASS lcl DEFINITION. + PUBLIC SECTION. + TYPES: BEGIN OF ty_source, + count TYPE i, + END OF ty_source, + BEGIN OF ty_result, + count TYPE i, + percentage TYPE decfloat34, + rounded TYPE p LENGTH 8 DECIMALS 2, + END OF ty_result. + TYPES ty_sources TYPE STANDARD TABLE OF ty_source WITH EMPTY KEY. + TYPES ty_results TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY. + CLASS-METHODS build RETURNING VALUE(result) TYPE ty_results. +ENDCLASS. +CLASS lcl IMPLEMENTATION. + METHOD build. + DATA sources TYPE ty_sources. + sources = VALUE #( ( count = 1 ) ( count = 2 ) ). + result = VALUE #( + FOR source IN sources + ( count = source-count + percentage = CONV decfloat34( source-count * 100 / 3 ) + rounded = CONV decfloat34( source-count * 100 / 3 ) ) ). + ENDMETHOD. +ENDCLASS. +START-OF-SELECTION. +DATA results TYPE lcl=>ty_results. +DATA row TYPE lcl=>ty_result. +results = lcl=>build( ). +LOOP AT results INTO row. + WRITE / row-percentage. + WRITE / row-rounded. +ENDLOOP.`; + const js = await run(code); + const f = new AsyncFunction("abap", js); + await f(abap); + expect(abap.console.get()).to.equal("33,333333333333336\n33,33\n66,66666666666667\n66,67"); + }); + +});