@l-v-yonsama/multi-platform-database-drivers 0.14.4 → 1.1.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.
Files changed (114) hide show
  1. package/README.md +13 -3
  2. package/built/src/drivers/Auth0Driver.d.ts +3 -3
  3. package/built/src/drivers/Auth0Driver.js +10 -10
  4. package/built/src/drivers/Auth0Driver.js.map +1 -1
  5. package/built/src/drivers/AwsDriver.d.ts +2 -2
  6. package/built/src/drivers/AwsDriver.js +2 -2
  7. package/built/src/drivers/AwsDriver.js.map +1 -1
  8. package/built/src/drivers/BaseDriver.d.ts +2 -2
  9. package/built/src/drivers/BaseSQLSupportDriver.d.ts +2 -2
  10. package/built/src/drivers/DBDriverResolver.js +4 -0
  11. package/built/src/drivers/DBDriverResolver.js.map +1 -1
  12. package/built/src/drivers/KeycloakDriver.d.ts +3 -3
  13. package/built/src/drivers/KeycloakDriver.js +8 -8
  14. package/built/src/drivers/KeycloakDriver.js.map +1 -1
  15. package/built/src/drivers/MemcacheDriver.d.ts +3 -3
  16. package/built/src/drivers/MemcacheDriver.js +10 -9
  17. package/built/src/drivers/MemcacheDriver.js.map +1 -1
  18. package/built/src/drivers/MqttDriver.d.ts +5 -3
  19. package/built/src/drivers/MqttDriver.js +56 -5
  20. package/built/src/drivers/MqttDriver.js.map +1 -1
  21. package/built/src/drivers/MySQLDriver.d.ts +2 -2
  22. package/built/src/drivers/MySQLDriver.js +7 -3
  23. package/built/src/drivers/MySQLDriver.js.map +1 -1
  24. package/built/src/drivers/OracleDriver.d.ts +54 -0
  25. package/built/src/drivers/OracleDriver.js +566 -0
  26. package/built/src/drivers/OracleDriver.js.map +1 -0
  27. package/built/src/drivers/PostgresDriver.d.ts +2 -2
  28. package/built/src/drivers/PostgresDriver.js +5 -2
  29. package/built/src/drivers/PostgresDriver.js.map +1 -1
  30. package/built/src/drivers/RDSBaseDriver.js +1 -1
  31. package/built/src/drivers/RDSBaseDriver.js.map +1 -1
  32. package/built/src/drivers/RedisDriver.d.ts +4 -4
  33. package/built/src/drivers/RedisDriver.js +4 -4
  34. package/built/src/drivers/RedisDriver.js.map +1 -1
  35. package/built/src/drivers/SQLServerDriver.d.ts +2 -2
  36. package/built/src/drivers/SQLServerDriver.js +5 -4
  37. package/built/src/drivers/SQLServerDriver.js.map +1 -1
  38. package/built/src/drivers/SQLiteDriver.d.ts +2 -2
  39. package/built/src/drivers/SQLiteDriver.js +9 -2
  40. package/built/src/drivers/SQLiteDriver.js.map +1 -1
  41. package/built/src/drivers/aws/AwsCloudwatchServiceClient.d.ts +7 -5
  42. package/built/src/drivers/aws/AwsCloudwatchServiceClient.js +14 -15
  43. package/built/src/drivers/aws/AwsCloudwatchServiceClient.js.map +1 -1
  44. package/built/src/drivers/aws/AwsDynamoServiceClient.d.ts +2 -4
  45. package/built/src/drivers/aws/AwsDynamoServiceClient.js +0 -5
  46. package/built/src/drivers/aws/AwsDynamoServiceClient.js.map +1 -1
  47. package/built/src/drivers/aws/AwsS3ServiceClient.d.ts +3 -3
  48. package/built/src/drivers/aws/AwsS3ServiceClient.js +6 -6
  49. package/built/src/drivers/aws/AwsS3ServiceClient.js.map +1 -1
  50. package/built/src/drivers/aws/AwsSQSServiceClient.d.ts +3 -3
  51. package/built/src/drivers/aws/AwsSQSServiceClient.js +5 -4
  52. package/built/src/drivers/aws/AwsSQSServiceClient.js.map +1 -1
  53. package/built/src/drivers/index.d.ts +1 -0
  54. package/built/src/drivers/index.js +1 -0
  55. package/built/src/drivers/index.js.map +1 -1
  56. package/built/src/helpers/ProposalHelper.d.ts +5 -0
  57. package/built/src/helpers/ProposalHelper.js +275 -0
  58. package/built/src/helpers/ProposalHelper.js.map +1 -0
  59. package/built/src/helpers/SQLHelper.d.ts +5 -10
  60. package/built/src/helpers/SQLHelper.js +37 -397
  61. package/built/src/helpers/SQLHelper.js.map +1 -1
  62. package/built/src/helpers/index.d.ts +2 -0
  63. package/built/src/helpers/index.js +2 -0
  64. package/built/src/helpers/index.js.map +1 -1
  65. package/built/src/helpers/prompts/Auth0PromptHelper.d.ts +2 -0
  66. package/built/src/helpers/prompts/Auth0PromptHelper.js +45 -0
  67. package/built/src/helpers/prompts/Auth0PromptHelper.js.map +1 -0
  68. package/built/src/helpers/prompts/AwsPromptHelper.d.ts +6 -0
  69. package/built/src/helpers/prompts/AwsPromptHelper.js +200 -0
  70. package/built/src/helpers/prompts/AwsPromptHelper.js.map +1 -0
  71. package/built/src/helpers/prompts/KeycloakPromptHelper.d.ts +2 -0
  72. package/built/src/helpers/prompts/KeycloakPromptHelper.js +38 -0
  73. package/built/src/helpers/prompts/KeycloakPromptHelper.js.map +1 -0
  74. package/built/src/helpers/prompts/MemcachePromptHelper.d.ts +2 -0
  75. package/built/src/helpers/prompts/MemcachePromptHelper.js +31 -0
  76. package/built/src/helpers/prompts/MemcachePromptHelper.js.map +1 -0
  77. package/built/src/helpers/prompts/MqttPromptHelper.d.ts +2 -0
  78. package/built/src/helpers/prompts/MqttPromptHelper.js +31 -0
  79. package/built/src/helpers/prompts/MqttPromptHelper.js.map +1 -0
  80. package/built/src/helpers/prompts/RdsPromptHelper.d.ts +7 -0
  81. package/built/src/helpers/prompts/RdsPromptHelper.js +164 -0
  82. package/built/src/helpers/prompts/RdsPromptHelper.js.map +1 -0
  83. package/built/src/helpers/prompts/RedisPromptHelper.d.ts +2 -0
  84. package/built/src/helpers/prompts/RedisPromptHelper.js +22 -0
  85. package/built/src/helpers/prompts/RedisPromptHelper.js.map +1 -0
  86. package/built/src/helpers/prompts/SchemaPromptHelper.d.ts +2 -0
  87. package/built/src/helpers/prompts/SchemaPromptHelper.js +82 -0
  88. package/built/src/helpers/prompts/SchemaPromptHelper.js.map +1 -0
  89. package/built/src/helpers/prompts/index.d.ts +8 -0
  90. package/built/src/helpers/prompts/index.js +12 -0
  91. package/built/src/helpers/prompts/index.js.map +1 -0
  92. package/built/src/helpers/prompts/promptFormatUtils.d.ts +1 -0
  93. package/built/src/helpers/prompts/promptFormatUtils.js +8 -0
  94. package/built/src/helpers/prompts/promptFormatUtils.js.map +1 -0
  95. package/built/src/resource/DbResource.d.ts +3 -1
  96. package/built/src/resource/DbResource.js +3 -0
  97. package/built/src/resource/DbResource.js.map +1 -1
  98. package/built/src/types/drivers/ScanParams.d.ts +66 -8
  99. package/built/src/types/helpers/index.d.ts +40 -2
  100. package/built/src/types/helpers/index.js.map +1 -1
  101. package/built/src/types/resource/AwsDynamoTableAttributes.d.ts +1 -0
  102. package/built/src/types/resource/ConnectionSetting.d.ts +22 -0
  103. package/built/src/types/resource/ConnectionSetting.js +13 -0
  104. package/built/src/types/resource/ConnectionSetting.js.map +1 -1
  105. package/built/src/types/resource/DBType.d.ts +2 -1
  106. package/built/src/types/resource/DBType.js +1 -0
  107. package/built/src/types/resource/DBType.js.map +1 -1
  108. package/built/src/types/resource/OracleColumnType.d.ts +30 -0
  109. package/built/src/types/resource/OracleColumnType.js +74 -0
  110. package/built/src/types/resource/OracleColumnType.js.map +1 -0
  111. package/built/src/utils/dbType.d.ts +1 -0
  112. package/built/src/utils/dbType.js +12 -1
  113. package/built/src/utils/dbType.js.map +1 -1
  114. package/package.json +8 -7
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.separateMultipleQueries = exports.toCreateTableDDL = exports.needsQuoting = exports.wrapQuote = exports.wrapBackQuote = exports.wrapDoubleQuote = exports.wrapSingleQuote = exports.resolveLastOrderByColumn = exports.getResourcePositions = exports.getProposals = exports.createTableDefinisionsForPrompt = exports.normalizeSimpleParametersQuery = exports.normalizePositionedParametersQuery = exports.normalizeQuery = exports.parseQuery = exports.hasSetVariableClause = exports.toSafeQueryForPgsqlAst = exports.toViewDataNormalizedQuery = exports.toViewDataQuery = exports.createColumnNames = exports.createTableNames = exports.toCountRecordsQuery = exports.toViewRecordsQuery = exports.toDeleteStatement = exports.toUpdateStatement = exports.toInsertStatement = exports.createUndoChangeSQL = exports.formatQuery = exports.getSqlLanguage = void 0;
3
+ exports.toRdsDatabase = exports.separateMultipleQueries = exports.needsQuoting = exports.wrapQuote = exports.wrapBackQuote = exports.wrapDoubleQuote = exports.wrapSingleQuote = exports.normalizeSimpleParametersQuery = exports.normalizePositionedParametersQuery = exports.normalizeQuery = exports.isReadOnlyQuery = exports.parseQuery = exports.hasSetVariableClause = exports.toSafeQueryForPgsqlAst = exports.toViewDataNormalizedQuery = exports.toViewDataQuery = exports.createColumnNames = exports.createTableNames = exports.toCountRecordsQuery = exports.toViewRecordsQuery = exports.toDeleteStatement = exports.toUpdateStatement = exports.toInsertStatement = exports.createUndoChangeSQL = exports.formatQuery = exports.getSqlLanguage = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const rdh_1 = require("@l-v-yonsama/rdh");
6
6
  const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
@@ -32,6 +32,7 @@ const DBTypeToSqlLanguageMap = {
32
32
  Postgres: 'postgresql',
33
33
  SQLServer: 'transactsql',
34
34
  SQLite: 'sqlite',
35
+ Oracle: 'plsql',
35
36
  Redis: 'mysql',
36
37
  Memcache: 'mysql',
37
38
  Keycloak: 'mysql',
@@ -292,7 +293,7 @@ const toDeleteStatement = ({ schemaName, tableName, columns, conditions, bindOpt
292
293
  };
293
294
  };
294
295
  exports.toDeleteStatement = toDeleteStatement;
295
- function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, limit, limitAsTop, limitMode, limitLastColumn, }) {
296
+ function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, limit, limitClauseStyle, limitMode, limitLastColumn, }) {
296
297
  const tableNameWithSchema = createTableNameWithSchema({
297
298
  schema: schemaName,
298
299
  table: tableRes.name,
@@ -300,7 +301,7 @@ function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, l
300
301
  sqlLang,
301
302
  });
302
303
  let query = '';
303
- if (limitAsTop && limit) {
304
+ if (limitClauseStyle === 'top' && limit) {
304
305
  query = `SELECT TOP ${limit} * FROM ${tableNameWithSchema}`;
305
306
  }
306
307
  else {
@@ -315,9 +316,12 @@ function toViewRecordsQuery({ tableRes, schemaName, idQuoteCharacter, sqlLang, l
315
316
  : limitLastColumn;
316
317
  query += ` ORDER BY ${quotedColumn} DESC`;
317
318
  }
318
- if (!limitAsTop && limit) {
319
+ if (limitClauseStyle === 'trailing' && limit) {
319
320
  query += ` LIMIT ${limit}`;
320
321
  }
322
+ else if (limitClauseStyle === 'fetchFirst' && limit) {
323
+ query += ` FETCH FIRST ${limit} ROWS ONLY`;
324
+ }
321
325
  return query;
322
326
  }
323
327
  exports.toViewRecordsQuery = toViewRecordsQuery;
@@ -601,6 +605,26 @@ const parseQuery = (sql) => {
601
605
  return undefined;
602
606
  };
603
607
  exports.parseQuery = parseQuery;
608
+ const READ_ONLY_STATEMENT_TYPES = new Set([
609
+ 'select',
610
+ 'show',
611
+ 'union',
612
+ 'union all',
613
+ 'values',
614
+ ]);
615
+ const isReadOnlyQuery = (sql) => {
616
+ var _a;
617
+ const qst = (0, exports.parseQuery)(sql);
618
+ const type = (_a = qst === null || qst === void 0 ? void 0 : qst.ast) === null || _a === void 0 ? void 0 : _a.type;
619
+ if (!type) {
620
+ return false;
621
+ }
622
+ if (type === 'pragma') {
623
+ return !/\bpragma\s+[a-zA-Z0-9\-_.()]+\s*=\s*.+/i.test(sql);
624
+ }
625
+ return READ_ONLY_STATEMENT_TYPES.has(type);
626
+ };
627
+ exports.isReadOnlyQuery = isReadOnlyQuery;
604
628
  const normalizeQuery = ({ query, toPositionedParameter, toPositionalCharacter, bindParams, }) => {
605
629
  if (toPositionedParameter) {
606
630
  return (0, exports.normalizePositionedParametersQuery)(query, bindParams, toPositionalCharacter);
@@ -756,355 +780,11 @@ const normalizeSimpleParametersQuery = (query, bindParams) => {
756
780
  return { query: newLines.join('\n'), binds };
757
781
  };
758
782
  exports.normalizeSimpleParametersQuery = normalizeSimpleParametersQuery;
759
- const createTableDefinisionsForPrompt = (params) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
760
- const { db: idb, sql, rdsDriver } = params;
761
- const db = idb instanceof DbResource_1.RdsDatabase ? idb : toRdsDatabase(idb);
762
- try {
763
- if (db) {
764
- const qst = (0, exports.parseQuery)(sql);
765
- if (qst === undefined || qst.names === undefined) {
766
- return undefined;
767
- }
768
- const dbTableWithSchemas = [];
769
- const qnameList = [qst.names];
770
- if (qst.additionalNames) {
771
- qnameList.push(...qst.additionalNames);
772
- }
773
- qnameList.forEach(({ schemaName, tableName }) => {
774
- var _a, _b;
775
- const schemas = db.children.filter((it) => schemaName ? (0, rdh_1.equalsIgnoreCase)(it.name, schemaName) : true);
776
- for (const schema of schemas) {
777
- const tbl = schema.children.find((it) => (0, rdh_1.equalsIgnoreCase)(it.name, tableName));
778
- if (tbl) {
779
- dbTableWithSchemas.push({ table: tbl, schemaName: schema.name });
780
- if ((_a = tbl.foreignKeys) === null || _a === void 0 ? void 0 : _a.referenceTo) {
781
- Object.values(tbl.foreignKeys.referenceTo).forEach((refTo) => {
782
- const tblTo = schema.children.find((it) => (0, rdh_1.equalsIgnoreCase)(it.name, refTo.tableName));
783
- if (tblTo &&
784
- dbTableWithSchemas.find((it) => it.table.name === tblTo.name) === undefined) {
785
- dbTableWithSchemas.push({
786
- table: tblTo,
787
- schemaName: schema.name,
788
- });
789
- }
790
- });
791
- }
792
- if ((_b = tbl.foreignKeys) === null || _b === void 0 ? void 0 : _b.referencedFrom) {
793
- Object.values(tbl.foreignKeys.referencedFrom).forEach((refFrom) => {
794
- const tblFrom = schema.children.find((it) => (0, rdh_1.equalsIgnoreCase)(it.name, refFrom.tableName));
795
- if (tblFrom &&
796
- dbTableWithSchemas.find((it) => it.table.name === tblFrom.name) === undefined) {
797
- dbTableWithSchemas.push({
798
- table: tblFrom,
799
- schemaName: schema.name,
800
- });
801
- }
802
- });
803
- }
804
- break;
805
- }
806
- }
807
- });
808
- if (dbTableWithSchemas.length === 0) {
809
- return undefined;
810
- }
811
- const lines = [];
812
- for (const dbTable of dbTableWithSchemas) {
813
- let tableDDL = '';
814
- if (rdsDriver && rdsDriver.supportsShowCreate()) {
815
- tableDDL = yield rdsDriver.getTableDDL({
816
- schemaName: dbTable.schemaName,
817
- tableName: dbTable.table.name,
818
- });
819
- }
820
- if (tableDDL) {
821
- lines.push(tableDDL);
822
- }
823
- else {
824
- const tableDef = (0, exports.toCreateTableDDL)({ dbTable: dbTable.table });
825
- lines.push(tableDef);
826
- }
827
- lines.push('');
828
- }
829
- return lines.join('\n');
830
- }
831
- }
832
- catch (_) {
833
- console.error(_);
834
- }
835
- return undefined;
836
- });
837
- exports.createTableDefinisionsForPrompt = createTableDefinisionsForPrompt;
838
- const getProposals = (params) => {
839
- const { db: idb, sql, lastChar, keyword, parentWord } = params;
840
- const upperKeyword = keyword.toUpperCase();
841
- const upperParentWord = parentWord === null || parentWord === void 0 ? void 0 : parentWord.toUpperCase();
842
- let ast;
843
- const retList = [];
844
- const db = idb instanceof DbResource_1.RdsDatabase ? idb : toRdsDatabase(idb);
845
- try {
846
- if (db) {
847
- try {
848
- [ast] = (0, pgsql_ast_parser_1.parse)(sql, { locationTracking: true });
849
- }
850
- catch (_) {
851
- }
852
- if (parentWord) {
853
- let list = getProposalsByKeywordWithParent(db, ast, upperKeyword, upperParentWord, lastChar);
854
- if (list.length === 0) {
855
- list = getProposalsByKeyword(db, upperKeyword, lastChar);
856
- }
857
- retList.push(...list);
858
- }
859
- else {
860
- if (keyword) {
861
- const list = getProposalsByKeyword(db, upperKeyword, lastChar);
862
- retList.push(...list);
863
- }
864
- else {
865
- retList.push(...getAllProposals(db));
866
- }
867
- }
868
- }
869
- if (lastChar !== '.' && !parentWord) {
870
- constant_1.RESERVED_WORDS.filter((s) => s.startsWith(upperKeyword)).forEach((s) => {
871
- retList.push({
872
- label: s,
873
- kind: types_1.ProposalKind.ReservedWord,
874
- });
875
- });
876
- }
877
- }
878
- catch (_) {
879
- }
880
- const uniqueRetList = Array.from(retList
881
- .reduce((map, p) => {
882
- const key = `${p.kind}:${p.label}`;
883
- const existing = map.get(key);
884
- if (!existing || (!existing.detail && p.detail)) {
885
- map.set(key, p);
886
- }
887
- return map;
888
- }, new Map())
889
- .values());
890
- return uniqueRetList;
891
- };
892
- exports.getProposals = getProposals;
893
- const getResourcePositions = (params) => {
894
- const { db: idb, sql } = params;
895
- const sqlLowerCase = sql.toLocaleLowerCase();
896
- const retList = [];
897
- if (idb === undefined) {
898
- return retList;
899
- }
900
- const schema = idb instanceof DbResource_1.RdsDatabase
901
- ? idb.getSchema({ isDefault: true })
902
- : toRdsDatabase(idb).getSchema({ isDefault: true });
903
- const tableNames = schema.children
904
- .map((it) => it.name.toLocaleLowerCase())
905
- .join('|');
906
- const reg = new RegExp('\\b(' + tableNames + ')\\b', 'g');
907
- let m;
908
- const tableResList = [];
909
- const columnNameSet = new Set();
910
- while ((m = reg.exec(sqlLowerCase)) !== null) {
911
- const name = m[0];
912
- let comment = undefined;
913
- const tableRes = schema.children.find((it) => it.name.toLocaleLowerCase() === name);
914
- if (tableRes) {
915
- tableResList.push(tableRes);
916
- comment = tableRes.comment;
917
- tableRes.children.forEach((it) => {
918
- columnNameSet.add(it.name.toLowerCase());
919
- });
920
- }
921
- retList.push({
922
- kind: types_1.ProposalKind.Table,
923
- name: tableRes.name,
924
- comment,
925
- offset: m.index,
926
- length: name.length,
927
- });
928
- }
929
- if (columnNameSet.size > 0) {
930
- const reg2 = new RegExp('\\b(' + Array.from(columnNameSet).join('|') + ')\\b', 'g');
931
- let m2;
932
- while ((m2 = reg2.exec(sqlLowerCase)) !== null) {
933
- const name = m2[0];
934
- const columnRes = tableResList
935
- .flatMap((table) => table.children)
936
- .find((column) => column.name.toLocaleLowerCase() === name);
937
- if (!columnRes) {
938
- continue;
939
- }
940
- retList.push({
941
- kind: types_1.ProposalKind.Column,
942
- name: columnRes.name,
943
- comment: columnRes.comment,
944
- offset: m2.index,
945
- length: name.length,
946
- });
947
- }
948
- }
949
- return retList;
950
- };
951
- exports.getResourcePositions = getResourcePositions;
952
- const resolveAlias = (ast, alias) => {
953
- if (!ast || !alias) {
954
- return undefined;
955
- }
956
- if (ast.type === 'select') {
957
- for (const tbl of ast.from) {
958
- if (tbl.type === 'table') {
959
- if (tbl.name.alias.toUpperCase() === alias) {
960
- return tbl.name.name;
961
- }
962
- }
963
- }
964
- }
965
- return undefined;
966
- };
967
- const matchKeyword = (list, keyword) => {
968
- return list.some((it) => it.toUpperCase().startsWith(keyword));
969
- };
970
- function resolveLastOrderByColumn(table) {
971
- const columns = table.children;
972
- if (!(columns === null || columns === void 0 ? void 0 : columns.length)) {
973
- return undefined;
974
- }
975
- const dateColumn = columns.find((col) => {
976
- const name = col.name.toLowerCase();
977
- const looksLikeCreated = /created(_at)?$/.test(name) ||
978
- /create(d)?date$/.test(name) ||
979
- /insert(ed)?(_at)?$/.test(name);
980
- return (0, rdh_1.isDateTimeOrDate)(col.colType) && looksLikeCreated;
981
- });
982
- if (dateColumn) {
983
- return dateColumn.name;
984
- }
985
- const pks = table.getPrimaryColumnNames();
986
- if (pks.length === 1) {
987
- const pkCol = columns.find((c) => c.name === pks[0]);
988
- if (pkCol && (0, rdh_1.isNumericLike)(pkCol.colType)) {
989
- return pkCol.name;
990
- }
991
- }
992
- return undefined;
993
- }
994
- exports.resolveLastOrderByColumn = resolveLastOrderByColumn;
995
- const getProposalsByKeywordWithParent = (db, ast, keyword, parentWord, lastChar) => {
996
- var _a;
997
- const retList = [];
998
- const schema = db.children.find((it) => it.name.toUpperCase() === parentWord);
999
- if (schema) {
1000
- schema.children.forEach((table) => {
1001
- var _a;
1002
- const table_comment = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
1003
- if (keyword === '' ||
1004
- matchKeyword([table.name, table_comment], keyword)) {
1005
- retList.push(createTableProposal(schema, table));
1006
- }
1007
- });
1008
- }
1009
- const defaultSchema = db.getSchema({ isDefault: true });
1010
- let table = defaultSchema.children.find((it) => it.name.toUpperCase() === parentWord);
1011
- if (!table) {
1012
- const resolvedName = resolveAlias(ast, parentWord);
1013
- if (resolvedName) {
1014
- table = defaultSchema.children.find((it) => it.name.toUpperCase() === resolvedName.toUpperCase());
1015
- }
1016
- }
1017
- if (table) {
1018
- const table_comment = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
1019
- if (matchKeyword([table.name, table_comment], keyword)) {
1020
- retList.push(createTableProposal(schema, table));
1021
- }
1022
- table.children.forEach((column) => {
1023
- var _a;
1024
- const columnComment = (_a = column.comment) !== null && _a !== void 0 ? _a : '';
1025
- if (keyword === '' ||
1026
- matchKeyword([column.name, columnComment], keyword)) {
1027
- retList.push(createColumnProposal(table, column));
1028
- }
1029
- });
1030
- }
1031
- return retList;
1032
- };
1033
- const getProposalsByKeyword = (db, keyword, lastChar) => {
1034
- const retList = [];
1035
- const schema = db.getSchema({ isDefault: true });
1036
- if (lastChar === ' ') {
1037
- if (['INTO', 'UPDATE', 'FROM'].includes(keyword)) {
1038
- schema.children.forEach((table) => {
1039
- retList.push(createTableProposal(schema, table));
1040
- });
1041
- return retList;
1042
- }
1043
- if ('DELETE' === keyword) {
1044
- retList.push(createReservedWordProposal('FROM'));
1045
- }
1046
- }
1047
- schema.children.forEach((table) => {
1048
- var _a;
1049
- const table_comment = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
1050
- if (matchKeyword([table.name, table_comment], keyword)) {
1051
- retList.push(createTableProposal(schema, table));
1052
- }
1053
- table.children.forEach((column) => {
1054
- var _a;
1055
- const columnComment = (_a = column.comment) !== null && _a !== void 0 ? _a : '';
1056
- if (matchKeyword([column.name, columnComment], keyword)) {
1057
- retList.push(createColumnProposal(table, column));
1058
- }
1059
- });
1060
- });
1061
- return retList;
1062
- };
1063
- const getAllProposals = (db) => {
1064
- const retList = [];
1065
- const schema = db.getSchema({ isDefault: true });
1066
- schema.children.forEach((table) => {
1067
- retList.push(createTableProposal(schema, table));
1068
- });
1069
- schema.getUniqColumnNameWithComments().forEach((it) => {
1070
- var _a;
1071
- retList.push({
1072
- label: it.name,
1073
- kind: types_1.ProposalKind.Column,
1074
- detail: (_a = it.comment) !== null && _a !== void 0 ? _a : '',
1075
- });
1076
- });
1077
- return retList;
1078
- };
1079
- const createTableProposal = (schema, table) => {
1080
- var _a;
1081
- const detail = (_a = table.comment) !== null && _a !== void 0 ? _a : '';
1082
- return {
1083
- label: table.name,
1084
- kind: types_1.ProposalKind.Table,
1085
- detail,
1086
- };
1087
- };
1088
- const createColumnProposal = (table, column) => {
1089
- var _a;
1090
- const detail = (_a = column.comment) !== null && _a !== void 0 ? _a : '';
1091
- return {
1092
- label: column.name,
1093
- kind: types_1.ProposalKind.Column,
1094
- detail,
1095
- };
1096
- };
1097
783
  const stripComment = (query) => {
1098
784
  return query
1099
785
  .replace(/\/\*[^*]*\*\//gm, '')
1100
786
  .replace(/(\s)?(#|--)\s+.*$/gm, '$1');
1101
787
  };
1102
- const createReservedWordProposal = (word) => {
1103
- return {
1104
- label: word,
1105
- kind: types_1.ProposalKind.ReservedWord,
1106
- };
1107
- };
1108
788
  const wrapSingleQuote = (input) => (0, exports.wrapQuote)(input, "'");
1109
789
  exports.wrapSingleQuote = wrapSingleQuote;
1110
790
  const wrapDoubleQuote = (input) => (0, exports.wrapQuote)(input, '"');
@@ -1202,7 +882,8 @@ const toEmbeddedStringValue = (colType, value) => {
1202
882
  return (0, exports.wrapSingleQuote)(value);
1203
883
  }
1204
884
  if ((0, rdh_1.isJsonLike)(colType)) {
1205
- return (0, exports.wrapSingleQuote)(JSON.stringify(value));
885
+ const text = typeof value === 'string' ? value : JSON.stringify(value);
886
+ return (0, exports.wrapSingleQuote)(text);
1206
887
  }
1207
888
  if (value.length === 0) {
1208
889
  return 'NULL';
@@ -1315,52 +996,7 @@ const createQNamesUsingLocation = ({ tableName, schemaName, location, sql, }) =>
1315
996
  schemaName,
1316
997
  };
1317
998
  };
1318
- const toCreateTableDDL = ({ dbTable }) => {
1319
- var _a;
1320
- const columns = dbTable.children;
1321
- const colDefs = [];
1322
- columns.forEach((col) => {
1323
- let line = ` ${col.name} ${col.colType}`;
1324
- if (col.primaryKey) {
1325
- line += ' PRIMARY KEY';
1326
- }
1327
- else {
1328
- if (col.nullable === false) {
1329
- line += ' NOT NULL';
1330
- }
1331
- }
1332
- if (col.uniqKey) {
1333
- line += ' UNIQUE';
1334
- }
1335
- if (col.extra) {
1336
- if (col.extra.toLocaleLowerCase() === 'auto_increment') {
1337
- line += ' AUTO_INCREMENT';
1338
- }
1339
- }
1340
- if (col.default) {
1341
- line += ` DEFAULT ${col.default}`;
1342
- }
1343
- if (col.comment) {
1344
- line += ` COMMENT '${col.comment}'`;
1345
- }
1346
- colDefs.push(line);
1347
- });
1348
- if ((_a = dbTable.foreignKeys) === null || _a === void 0 ? void 0 : _a.referenceTo) {
1349
- Object.entries(dbTable.foreignKeys.referenceTo).forEach(([colName, refTo]) => {
1350
- colDefs.push(` FOREIGN KEY ${refTo.constraintName}(${colName}) REFERENCES ${refTo.tableName}(${refTo.columnName})`);
1351
- });
1352
- }
1353
- let tableDef = `CREATE TABLE ${dbTable.name} (\n${colDefs.join(',\n')}\n)`;
1354
- if (dbTable.comment) {
1355
- tableDef += ` COMMENT '${dbTable.comment}';`;
1356
- }
1357
- else {
1358
- tableDef += `;`;
1359
- }
1360
- return tableDef;
1361
- };
1362
- exports.toCreateTableDDL = toCreateTableDDL;
1363
- const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote, idQuoteCharacter, sqlLang, limit, limitAsTop, }) => {
999
+ const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote, idQuoteCharacter, sqlLang, limit, limitClauseStyle, }) => {
1364
1000
  const tableNameWithSchema = createTableNameWithSchema({
1365
1001
  schema: schemaName,
1366
1002
  table: tableRes.name,
@@ -1372,7 +1008,7 @@ const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote,
1372
1008
  bindParams: {},
1373
1009
  };
1374
1010
  let top = '';
1375
- if (limitAsTop === true) {
1011
+ if (limitClauseStyle === 'top' && limit !== undefined) {
1376
1012
  top = `TOP ${limit} `;
1377
1013
  }
1378
1014
  let query = `SELECT ${top}${selectClause} ${os.EOL}FROM ${tableNameWithSchema} `;
@@ -1389,9 +1025,12 @@ const toGeneralQuery = ({ selectClause, tableRes, schemaName, conditions, quote,
1389
1025
  query += os.EOL + 'WHERE' + os.EOL + q;
1390
1026
  }
1391
1027
  }
1392
- if (limitAsTop !== true && limit !== undefined) {
1028
+ if (limitClauseStyle === 'trailing' && limit !== undefined) {
1393
1029
  query += os.EOL + 'LIMIT ' + limit;
1394
1030
  }
1031
+ else if (limitClauseStyle === 'fetchFirst' && limit !== undefined) {
1032
+ query += os.EOL + 'FETCH FIRST ' + limit + ' ROWS ONLY';
1033
+ }
1395
1034
  return {
1396
1035
  query: query.trim(),
1397
1036
  binds: params.bindParams,
@@ -1443,4 +1082,5 @@ const toRdsDatabase = (awsDb) => {
1443
1082
  });
1444
1083
  return db;
1445
1084
  };
1085
+ exports.toRdsDatabase = toRdsDatabase;
1446
1086
  //# sourceMappingURL=SQLHelper.js.map