@lix-js/sdk 0.6.0-preview.1 → 0.6.0-preview.3

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 (205) hide show
  1. package/SKILL.md +304 -320
  2. package/dist/engine-wasm/wasm/lix_engine.d.ts +5 -0
  3. package/dist/engine-wasm/wasm/lix_engine.js +9 -13
  4. package/dist/engine-wasm/wasm/lix_engine.wasm +0 -0
  5. package/dist/engine-wasm/wasm/lix_engine.wasm.d.ts +1 -0
  6. package/dist/generated/builtin-schemas.d.ts +87 -162
  7. package/dist/generated/builtin-schemas.js +139 -236
  8. package/dist/open-lix.d.ts +103 -14
  9. package/dist/open-lix.js +3 -0
  10. package/dist/sqlite/index.js +99 -22
  11. package/dist-engine-src/README.md +18 -0
  12. package/dist-engine-src/src/backend/kv.rs +358 -0
  13. package/dist-engine-src/src/backend/mod.rs +12 -0
  14. package/dist-engine-src/src/backend/testing.rs +658 -0
  15. package/dist-engine-src/src/backend/types.rs +96 -0
  16. package/dist-engine-src/src/binary_cas/chunking.rs +31 -0
  17. package/dist-engine-src/src/binary_cas/codec.rs +346 -0
  18. package/dist-engine-src/src/binary_cas/context.rs +139 -0
  19. package/dist-engine-src/src/binary_cas/kv.rs +1063 -0
  20. package/dist-engine-src/src/binary_cas/mod.rs +11 -0
  21. package/dist-engine-src/src/binary_cas/types.rs +121 -0
  22. package/dist-engine-src/src/catalog/context.rs +412 -0
  23. package/dist-engine-src/src/catalog/mod.rs +10 -0
  24. package/dist-engine-src/src/catalog/schema.rs +4 -0
  25. package/dist-engine-src/src/catalog/snapshot.rs +1114 -0
  26. package/dist-engine-src/src/cel/context.rs +86 -0
  27. package/dist-engine-src/src/cel/error.rs +19 -0
  28. package/dist-engine-src/src/cel/mod.rs +8 -0
  29. package/dist-engine-src/src/cel/provider.rs +9 -0
  30. package/dist-engine-src/src/cel/runtime.rs +167 -0
  31. package/dist-engine-src/src/cel/value.rs +50 -0
  32. package/dist-engine-src/src/commit_graph/context.rs +901 -0
  33. package/dist-engine-src/src/commit_graph/mod.rs +11 -0
  34. package/dist-engine-src/src/commit_graph/types.rs +109 -0
  35. package/dist-engine-src/src/commit_graph/walker.rs +756 -0
  36. package/dist-engine-src/src/commit_store/codec.rs +887 -0
  37. package/dist-engine-src/src/commit_store/context.rs +944 -0
  38. package/dist-engine-src/src/commit_store/materialization.rs +84 -0
  39. package/dist-engine-src/src/commit_store/mod.rs +16 -0
  40. package/dist-engine-src/src/commit_store/storage.rs +600 -0
  41. package/dist-engine-src/src/commit_store/types.rs +215 -0
  42. package/dist-engine-src/src/common/error.rs +313 -0
  43. package/dist-engine-src/src/common/fingerprint.rs +3 -0
  44. package/dist-engine-src/src/common/fs_path.rs +1336 -0
  45. package/dist-engine-src/src/common/identity.rs +145 -0
  46. package/dist-engine-src/src/common/json_pointer.rs +67 -0
  47. package/dist-engine-src/src/common/metadata.rs +40 -0
  48. package/dist-engine-src/src/common/mod.rs +23 -0
  49. package/dist-engine-src/src/common/types.rs +105 -0
  50. package/dist-engine-src/src/common/wire.rs +222 -0
  51. package/dist-engine-src/src/domain.rs +324 -0
  52. package/dist-engine-src/src/engine.rs +225 -0
  53. package/dist-engine-src/src/entity_identity.rs +405 -0
  54. package/dist-engine-src/src/functions/context.rs +292 -0
  55. package/dist-engine-src/src/functions/deterministic.rs +113 -0
  56. package/dist-engine-src/src/functions/mod.rs +18 -0
  57. package/dist-engine-src/src/functions/provider.rs +130 -0
  58. package/dist-engine-src/src/functions/state.rs +336 -0
  59. package/dist-engine-src/src/functions/types.rs +37 -0
  60. package/dist-engine-src/src/init.rs +558 -0
  61. package/dist-engine-src/src/json_store/compression.rs +77 -0
  62. package/dist-engine-src/src/json_store/context.rs +423 -0
  63. package/dist-engine-src/src/json_store/encoded.rs +15 -0
  64. package/dist-engine-src/src/json_store/mod.rs +12 -0
  65. package/dist-engine-src/src/json_store/store.rs +1109 -0
  66. package/dist-engine-src/src/json_store/types.rs +217 -0
  67. package/dist-engine-src/src/lib.rs +62 -0
  68. package/dist-engine-src/src/live_state/context.rs +2019 -0
  69. package/dist-engine-src/src/live_state/mod.rs +15 -0
  70. package/dist-engine-src/src/live_state/overlay.rs +75 -0
  71. package/dist-engine-src/src/live_state/reader.rs +23 -0
  72. package/dist-engine-src/src/live_state/types.rs +222 -0
  73. package/dist-engine-src/src/live_state/visibility.rs +223 -0
  74. package/dist-engine-src/src/plugin/archive.rs +438 -0
  75. package/dist-engine-src/src/plugin/component.rs +183 -0
  76. package/dist-engine-src/src/plugin/install.rs +619 -0
  77. package/dist-engine-src/src/plugin/manifest.rs +516 -0
  78. package/dist-engine-src/src/plugin/materializer.rs +477 -0
  79. package/dist-engine-src/src/plugin/mod.rs +33 -0
  80. package/dist-engine-src/src/plugin/plugin_manifest.json +118 -0
  81. package/dist-engine-src/src/plugin/storage.rs +74 -0
  82. package/dist-engine-src/src/schema/annotations/defaults.rs +275 -0
  83. package/dist-engine-src/src/schema/annotations/mod.rs +1 -0
  84. package/dist-engine-src/src/schema/builtin/lix_account.json +21 -0
  85. package/dist-engine-src/src/schema/builtin/lix_active_account.json +29 -0
  86. package/dist-engine-src/src/schema/builtin/lix_binary_blob_ref.json +29 -0
  87. package/dist-engine-src/src/schema/builtin/lix_change.json +63 -0
  88. package/dist-engine-src/src/schema/builtin/lix_change_author.json +45 -0
  89. package/dist-engine-src/src/schema/builtin/lix_commit.json +24 -0
  90. package/dist-engine-src/src/schema/builtin/lix_commit_edge.json +53 -0
  91. package/dist-engine-src/src/schema/builtin/lix_directory_descriptor.json +52 -0
  92. package/dist-engine-src/src/schema/builtin/lix_file_descriptor.json +52 -0
  93. package/dist-engine-src/src/schema/builtin/lix_key_value.json +40 -0
  94. package/dist-engine-src/src/schema/builtin/lix_label.json +29 -0
  95. package/dist-engine-src/src/schema/builtin/lix_label_assignment.json +74 -0
  96. package/dist-engine-src/src/schema/builtin/lix_registered_schema.json +25 -0
  97. package/dist-engine-src/src/schema/builtin/lix_version_descriptor.json +34 -0
  98. package/dist-engine-src/src/schema/builtin/lix_version_ref.json +48 -0
  99. package/dist-engine-src/src/schema/builtin/mod.rs +222 -0
  100. package/dist-engine-src/src/schema/compatibility.rs +787 -0
  101. package/dist-engine-src/src/schema/definition.json +187 -0
  102. package/dist-engine-src/src/schema/definition.rs +742 -0
  103. package/dist-engine-src/src/schema/key.rs +138 -0
  104. package/dist-engine-src/src/schema/mod.rs +20 -0
  105. package/dist-engine-src/src/schema/seed.rs +14 -0
  106. package/dist-engine-src/src/schema/tests.rs +780 -0
  107. package/dist-engine-src/src/session/context.rs +364 -0
  108. package/dist-engine-src/src/session/create_version.rs +88 -0
  109. package/dist-engine-src/src/session/execute.rs +478 -0
  110. package/dist-engine-src/src/session/merge/analysis.rs +102 -0
  111. package/dist-engine-src/src/session/merge/apply.rs +23 -0
  112. package/dist-engine-src/src/session/merge/conflicts.rs +63 -0
  113. package/dist-engine-src/src/session/merge/mod.rs +11 -0
  114. package/dist-engine-src/src/session/merge/stats.rs +65 -0
  115. package/dist-engine-src/src/session/merge/version.rs +427 -0
  116. package/dist-engine-src/src/session/mod.rs +27 -0
  117. package/dist-engine-src/src/session/optimization9_sql2_bench.rs +100 -0
  118. package/dist-engine-src/src/session/switch_version.rs +109 -0
  119. package/dist-engine-src/src/sql2/change_provider.rs +331 -0
  120. package/dist-engine-src/src/sql2/classify.rs +182 -0
  121. package/dist-engine-src/src/sql2/context.rs +311 -0
  122. package/dist-engine-src/src/sql2/directory_history_provider.rs +631 -0
  123. package/dist-engine-src/src/sql2/directory_provider.rs +2453 -0
  124. package/dist-engine-src/src/sql2/dml.rs +148 -0
  125. package/dist-engine-src/src/sql2/entity_history_provider.rs +440 -0
  126. package/dist-engine-src/src/sql2/entity_provider.rs +3211 -0
  127. package/dist-engine-src/src/sql2/error.rs +216 -0
  128. package/dist-engine-src/src/sql2/execute.rs +3440 -0
  129. package/dist-engine-src/src/sql2/file_history_provider.rs +910 -0
  130. package/dist-engine-src/src/sql2/file_provider.rs +3679 -0
  131. package/dist-engine-src/src/sql2/filesystem_planner.rs +1490 -0
  132. package/dist-engine-src/src/sql2/filesystem_predicates.rs +159 -0
  133. package/dist-engine-src/src/sql2/filesystem_visibility.rs +383 -0
  134. package/dist-engine-src/src/sql2/history_projection.rs +56 -0
  135. package/dist-engine-src/src/sql2/history_provider.rs +412 -0
  136. package/dist-engine-src/src/sql2/history_route.rs +657 -0
  137. package/dist-engine-src/src/sql2/lix_state_provider.rs +2512 -0
  138. package/dist-engine-src/src/sql2/mod.rs +46 -0
  139. package/dist-engine-src/src/sql2/predicate_typecheck.rs +246 -0
  140. package/dist-engine-src/src/sql2/public_bind/assignment.rs +46 -0
  141. package/dist-engine-src/src/sql2/public_bind/capability.rs +41 -0
  142. package/dist-engine-src/src/sql2/public_bind/dml.rs +166 -0
  143. package/dist-engine-src/src/sql2/public_bind/mod.rs +25 -0
  144. package/dist-engine-src/src/sql2/public_bind/table.rs +168 -0
  145. package/dist-engine-src/src/sql2/read_only.rs +63 -0
  146. package/dist-engine-src/src/sql2/record_batch.rs +17 -0
  147. package/dist-engine-src/src/sql2/result_metadata.rs +29 -0
  148. package/dist-engine-src/src/sql2/runtime.rs +60 -0
  149. package/dist-engine-src/src/sql2/session.rs +132 -0
  150. package/dist-engine-src/src/sql2/udfs/common.rs +295 -0
  151. package/dist-engine-src/src/sql2/udfs/lix_active_version_commit_id.rs +53 -0
  152. package/dist-engine-src/src/sql2/udfs/lix_empty_blob.rs +47 -0
  153. package/dist-engine-src/src/sql2/udfs/lix_json.rs +100 -0
  154. package/dist-engine-src/src/sql2/udfs/lix_json_get.rs +99 -0
  155. package/dist-engine-src/src/sql2/udfs/lix_json_get_text.rs +99 -0
  156. package/dist-engine-src/src/sql2/udfs/lix_text_decode.rs +82 -0
  157. package/dist-engine-src/src/sql2/udfs/lix_text_encode.rs +85 -0
  158. package/dist-engine-src/src/sql2/udfs/lix_timestamp.rs +76 -0
  159. package/dist-engine-src/src/sql2/udfs/lix_uuid_v7.rs +76 -0
  160. package/dist-engine-src/src/sql2/udfs/mod.rs +89 -0
  161. package/dist-engine-src/src/sql2/udfs/public_call.rs +211 -0
  162. package/dist-engine-src/src/sql2/version_provider.rs +1202 -0
  163. package/dist-engine-src/src/sql2/version_scope.rs +394 -0
  164. package/dist-engine-src/src/sql2/write_normalization.rs +345 -0
  165. package/dist-engine-src/src/storage/context.rs +356 -0
  166. package/dist-engine-src/src/storage/mod.rs +14 -0
  167. package/dist-engine-src/src/storage/read_scope.rs +88 -0
  168. package/dist-engine-src/src/storage/types.rs +501 -0
  169. package/dist-engine-src/src/storage_bench.rs +4863 -0
  170. package/dist-engine-src/src/test_support.rs +228 -0
  171. package/dist-engine-src/src/tracked_state/by_file_index.rs +98 -0
  172. package/dist-engine-src/src/tracked_state/codec.rs +2085 -0
  173. package/dist-engine-src/src/tracked_state/context.rs +1867 -0
  174. package/dist-engine-src/src/tracked_state/diff.rs +686 -0
  175. package/dist-engine-src/src/tracked_state/materialization.rs +403 -0
  176. package/dist-engine-src/src/tracked_state/materializer.rs +488 -0
  177. package/dist-engine-src/src/tracked_state/merge.rs +492 -0
  178. package/dist-engine-src/src/tracked_state/mod.rs +32 -0
  179. package/dist-engine-src/src/tracked_state/storage.rs +375 -0
  180. package/dist-engine-src/src/tracked_state/tree.rs +3187 -0
  181. package/dist-engine-src/src/tracked_state/types.rs +231 -0
  182. package/dist-engine-src/src/transaction/commit.rs +1484 -0
  183. package/dist-engine-src/src/transaction/context.rs +1548 -0
  184. package/dist-engine-src/src/transaction/live_state_overlay.rs +35 -0
  185. package/dist-engine-src/src/transaction/mod.rs +13 -0
  186. package/dist-engine-src/src/transaction/normalization.rs +890 -0
  187. package/dist-engine-src/src/transaction/prep.rs +37 -0
  188. package/dist-engine-src/src/transaction/schema_resolver.rs +149 -0
  189. package/dist-engine-src/src/transaction/staging.rs +1731 -0
  190. package/dist-engine-src/src/transaction/types.rs +460 -0
  191. package/dist-engine-src/src/transaction/validation.rs +5830 -0
  192. package/dist-engine-src/src/untracked_state/codec.rs +307 -0
  193. package/dist-engine-src/src/untracked_state/context.rs +98 -0
  194. package/dist-engine-src/src/untracked_state/materialization.rs +63 -0
  195. package/dist-engine-src/src/untracked_state/mod.rs +15 -0
  196. package/dist-engine-src/src/untracked_state/storage.rs +396 -0
  197. package/dist-engine-src/src/untracked_state/types.rs +146 -0
  198. package/dist-engine-src/src/version/context.rs +40 -0
  199. package/dist-engine-src/src/version/lifecycle.rs +221 -0
  200. package/dist-engine-src/src/version/mod.rs +13 -0
  201. package/dist-engine-src/src/version/refs.rs +330 -0
  202. package/dist-engine-src/src/version/stage_rows.rs +67 -0
  203. package/dist-engine-src/src/version/types.rs +21 -0
  204. package/dist-engine-src/src/wasm/mod.rs +60 -0
  205. package/package.json +68 -64
@@ -0,0 +1,216 @@
1
+ use datafusion::error::DataFusionError;
2
+
3
+ use crate::LixError;
4
+
5
+ pub(crate) fn datafusion_error_to_lix_error(error: DataFusionError) -> LixError {
6
+ if let Some(error) = lix_error_from_datafusion_error(&error) {
7
+ return error;
8
+ }
9
+
10
+ classify_datafusion_error(&error)
11
+ }
12
+
13
+ pub(crate) fn lix_error_to_datafusion_error(error: LixError) -> DataFusionError {
14
+ DataFusionError::External(Box::new(error))
15
+ }
16
+
17
+ fn lix_error_from_datafusion_error(error: &DataFusionError) -> Option<LixError> {
18
+ match error {
19
+ DataFusionError::External(error) => error
20
+ .downcast_ref::<LixError>()
21
+ .cloned()
22
+ .map(normalize_external_sql_error),
23
+ DataFusionError::Context(_, error) | DataFusionError::Diagnostic(_, error) => {
24
+ lix_error_from_datafusion_error(error)
25
+ }
26
+ DataFusionError::Shared(error) => lix_error_from_datafusion_error(error),
27
+ DataFusionError::Collection(errors) => {
28
+ errors.iter().find_map(lix_error_from_datafusion_error)
29
+ }
30
+ _ => None,
31
+ }
32
+ }
33
+
34
+ fn normalize_external_sql_error(error: LixError) -> LixError {
35
+ let lower = error.message.to_ascii_lowercase();
36
+ if (error.code.starts_with("LIX_ERROR_PATH_")
37
+ && error.code != "LIX_ERROR_PATH_INVALID_SEGMENT_CODE_POINT")
38
+ || error.code == LixError::CODE_INVALID_JSON_PATH
39
+ || (error.code == LixError::CODE_TYPE_MISMATCH
40
+ && lower.contains("cannot store blob values directly"))
41
+ || (error.code == LixError::CODE_SCHEMA_DEFINITION && lower.contains("system schema"))
42
+ {
43
+ return LixError {
44
+ code: LixError::CODE_INVALID_PARAM.to_string(),
45
+ ..error
46
+ };
47
+ }
48
+ error
49
+ }
50
+
51
+ fn classify_datafusion_error(error: &DataFusionError) -> LixError {
52
+ let message = format!("sql2 DataFusion error: {error}");
53
+ let lower = message.to_ascii_lowercase();
54
+
55
+ if looks_like_json_udf_miss(&lower) {
56
+ return LixError::new(LixError::CODE_UDF_NOT_FOUND, message)
57
+ .with_hint("Use lix_json_get(json, key_or_index, ...) for JSON values or lix_json_get_text(json, key_or_index, ...) for text.");
58
+ }
59
+
60
+ if looks_like_unsupported_dialect(&lower) {
61
+ return LixError::new(LixError::CODE_DIALECT_UNSUPPORTED, message)
62
+ .with_hint("Lix SQL uses DataFusion syntax. Use lix_json_get(...) or lix_json_get_text(...) for JSON access, and numbered placeholders like $1, $2, ...");
63
+ }
64
+
65
+ if looks_like_unsupported_runtime_plan(&lower) {
66
+ return LixError::new(LixError::CODE_UNSUPPORTED_SQL_RUNTIME_PLAN, message)
67
+ .with_hint("This SQL feature currently plans to a physical operator that is not supported by this engine runtime. Rewrite the query to avoid the unsupported operator, or run it on a runtime that supports the full physical plan.");
68
+ }
69
+
70
+ if lower.contains("uses variadic path segments") {
71
+ return LixError::new(LixError::CODE_INVALID_JSON_PATH, message)
72
+ .with_hint("Pass path segments as separate arguments, for example lix_json_get_text(document, 'user', 'name'), not '$.user.name' or '/user/name'.");
73
+ }
74
+
75
+ if lower.contains("failed to parse placeholder id")
76
+ || lower.contains("placeholder")
77
+ || lower.contains("bind")
78
+ {
79
+ return LixError::new(LixError::CODE_PARSE_ERROR, message).with_hint(
80
+ "Use numbered placeholders like $1, $2, ...; '?' placeholders are not supported.",
81
+ );
82
+ }
83
+
84
+ if lower.contains("requires start_commit_id")
85
+ || lower.contains("history filter")
86
+ || lower.contains("history table")
87
+ {
88
+ return LixError::new(LixError::CODE_HISTORY_FILTER_REQUIRED, message)
89
+ .with_hint("Add a commit/version range predicate before querying history tables.");
90
+ }
91
+
92
+ if lower.contains("table not found")
93
+ || (lower.contains("table") && lower.contains("not found"))
94
+ || lower.contains("no table named")
95
+ || lower.contains("failed to resolve table")
96
+ || lower.contains("could not find table")
97
+ || (lower.contains("relation") && lower.contains("not found"))
98
+ {
99
+ return LixError::new(LixError::CODE_TABLE_NOT_FOUND, message)
100
+ .with_hint("Use information_schema.tables to inspect available Lix SQL tables.");
101
+ }
102
+
103
+ if (lower.contains("column") || lower.contains("field"))
104
+ && (lower.contains("not found")
105
+ || lower.contains("does not exist")
106
+ || lower.contains("no field named"))
107
+ {
108
+ return LixError::new(LixError::CODE_COLUMN_NOT_FOUND, message);
109
+ }
110
+
111
+ if lower.contains("schema validation") {
112
+ return LixError::new(LixError::CODE_SCHEMA_VALIDATION, message);
113
+ }
114
+
115
+ if lower.contains("schema definition") {
116
+ return LixError::new(LixError::CODE_SCHEMA_DEFINITION, message);
117
+ }
118
+
119
+ if lower.contains("unsupported sql type json") {
120
+ return LixError::new(LixError::CODE_DIALECT_UNSUPPORTED, message)
121
+ .with_hint("Declare JSON/object columns through lix.registerSchema(...) or lix_registered_schema; SQL type JSON is not supported.");
122
+ }
123
+
124
+ if looks_like_type_mismatch(&lower) {
125
+ if lower.contains("encountered non utf-8 data") {
126
+ return LixError::new(
127
+ LixError::CODE_TYPE_MISMATCH,
128
+ "Lix SQL string functions require valid UTF-8 text; blob data could not be decoded as UTF-8",
129
+ )
130
+ .with_hint(
131
+ "Pass text to string functions. Raw blob parameters stay binary and are not implicitly decoded as UTF-8.",
132
+ );
133
+ }
134
+ return LixError::new(LixError::CODE_TYPE_MISMATCH, message)
135
+ .with_hint("Check the SQL function argument types. JSON text can be converted with lix_json(...); JSON fields can be read with lix_json_get(...) or lix_json_get_text(...).");
136
+ }
137
+
138
+ if matches!(
139
+ error,
140
+ DataFusionError::Plan(_) | DataFusionError::SchemaError(_, _)
141
+ ) {
142
+ return LixError::new(LixError::CODE_PARSE_ERROR, message);
143
+ }
144
+
145
+ if lower.contains("constraint")
146
+ || lower.contains("not null")
147
+ || lower.contains("non-nullable")
148
+ || lower.contains("unique")
149
+ || lower.contains("duplicate")
150
+ || lower.contains("primary key")
151
+ || lower.contains("foreign key")
152
+ {
153
+ return LixError::new(LixError::CODE_CONSTRAINT_VIOLATION, message);
154
+ }
155
+
156
+ match error {
157
+ DataFusionError::SQL(_, _) => LixError::new(LixError::CODE_PARSE_ERROR, message),
158
+ DataFusionError::NotImplemented(_) => {
159
+ LixError::new(LixError::CODE_DIALECT_UNSUPPORTED, message)
160
+ }
161
+ DataFusionError::Plan(_) | DataFusionError::SchemaError(_, _) => {
162
+ LixError::new(LixError::CODE_PARSE_ERROR, message)
163
+ }
164
+ DataFusionError::IoError(_) | DataFusionError::ObjectStore(_) => {
165
+ LixError::new(LixError::CODE_STORAGE_ERROR, message)
166
+ }
167
+ DataFusionError::Internal(_) => LixError::new(LixError::CODE_INTERNAL_ERROR, message),
168
+ _ => LixError::new(LixError::CODE_UNKNOWN, message),
169
+ }
170
+ }
171
+
172
+ fn looks_like_json_udf_miss(lower: &str) -> bool {
173
+ let json_function_guess = [
174
+ "json_extract",
175
+ "json_get",
176
+ "json_get_string",
177
+ "json_get_text",
178
+ "json_extract_string",
179
+ "json_extract_text",
180
+ ]
181
+ .iter()
182
+ .any(|name| lower.contains(name));
183
+
184
+ json_function_guess
185
+ && (lower.contains("function")
186
+ || lower.contains("udf")
187
+ || lower.contains("not found")
188
+ || lower.contains("does not exist")
189
+ || lower.contains("did you mean"))
190
+ }
191
+
192
+ fn looks_like_unsupported_dialect(lower: &str) -> bool {
193
+ lower.contains("->>")
194
+ || lower.contains("operator does not exist")
195
+ || lower.contains("unsupported sql type json")
196
+ || lower.contains("sqlite_master")
197
+ || lower.contains("returning")
198
+ }
199
+
200
+ fn looks_like_unsupported_runtime_plan(lower: &str) -> bool {
201
+ lower.contains("sql physical operator")
202
+ && lower.contains("is not supported by the webassembly runtime yet")
203
+ }
204
+
205
+ fn looks_like_type_mismatch(lower: &str) -> bool {
206
+ (lower.contains("type")
207
+ || lower.contains("signature")
208
+ || lower.contains("coerc")
209
+ || lower.contains("argument")
210
+ || lower.contains("convert"))
211
+ && (lower.contains("mismatch")
212
+ || lower.contains("incompatible")
213
+ || lower.contains("expected")
214
+ || lower.contains("cannot")
215
+ || lower.contains("invalid"))
216
+ }