execsql2 2.16.17__py3-none-any.whl → 2.17.0__py3-none-any.whl
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.
- execsql/debug/repl.py +1 -1
- execsql/metacommands/debug.py +14 -4
- execsql/metacommands/upsert.py +0 -29
- execsql/script/executor.py +12 -8
- execsql/script/parser.py +45 -5
- {execsql2-2.16.17.dist-info → execsql2-2.17.0.dist-info}/METADATA +1 -1
- {execsql2-2.16.17.dist-info → execsql2-2.17.0.dist-info}/RECORD +26 -26
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/README.md +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/config_settings.sqlite +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/example_config_prompt.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/execsql.conf +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/make_config_db.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/md_compare.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/md_glossary.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/md_upsert.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/pg_compare.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/pg_glossary.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/pg_upsert.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/script_template.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/ss_compare.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/ss_glossary.sql +0 -0
- {execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/ss_upsert.sql +0 -0
- {execsql2-2.16.17.dist-info → execsql2-2.17.0.dist-info}/WHEEL +0 -0
- {execsql2-2.16.17.dist-info → execsql2-2.17.0.dist-info}/entry_points.txt +0 -0
- {execsql2-2.16.17.dist-info → execsql2-2.17.0.dist-info}/licenses/LICENSE.txt +0 -0
- {execsql2-2.16.17.dist-info → execsql2-2.17.0.dist-info}/licenses/NOTICE +0 -0
execsql/debug/repl.py
CHANGED
|
@@ -546,7 +546,7 @@ def _print_script_detail(name: str) -> None:
|
|
|
546
546
|
return
|
|
547
547
|
block = scripts[script_name]
|
|
548
548
|
sig = _format_script_signature(block.name, block.param_defs)
|
|
549
|
-
src = _format_script_source(block.span)
|
|
549
|
+
src = _format_script_source(block.span, full_path=True)
|
|
550
550
|
_write_rule(f" {_c(_BOLD + _YELLOW, 'Script')} {_c(_DIM, '──')} {_c(_CYAN, sig)} ")
|
|
551
551
|
_write(f" {_c(_BOLD, 'Source:')} {src}\n")
|
|
552
552
|
if block.param_defs:
|
execsql/metacommands/debug.py
CHANGED
|
@@ -203,9 +203,19 @@ def _format_script_signature(name: str, param_defs: Any) -> str:
|
|
|
203
203
|
return f"{name}({', '.join(parts)})"
|
|
204
204
|
|
|
205
205
|
|
|
206
|
-
def _format_script_source(span: Any) -> str:
|
|
207
|
-
"""Return ``file:start-end`` from a SourceSpan.
|
|
208
|
-
|
|
206
|
+
def _format_script_source(span: Any, *, full_path: bool = False) -> str:
|
|
207
|
+
"""Return ``file:start-end`` from a SourceSpan.
|
|
208
|
+
|
|
209
|
+
By default the filename is the basename, suitable for compact list-view
|
|
210
|
+
output. Pass ``full_path=True`` to retain the full source path (used by
|
|
211
|
+
detail views like ``SHOW SCRIPTS <name>`` and ``.scripts <name>``).
|
|
212
|
+
"""
|
|
213
|
+
if not span or not span.file:
|
|
214
|
+
filename = "<unknown>"
|
|
215
|
+
elif full_path:
|
|
216
|
+
filename = span.file
|
|
217
|
+
else:
|
|
218
|
+
filename = Path(span.file).name
|
|
209
219
|
if span and span.start_line is not None:
|
|
210
220
|
if span.end_line is not None and span.end_line != span.start_line:
|
|
211
221
|
return f"{filename}:{span.start_line}-{span.end_line}"
|
|
@@ -235,7 +245,7 @@ def x_show_scripts(**kwargs: Any) -> None:
|
|
|
235
245
|
return
|
|
236
246
|
block = scripts[script_name]
|
|
237
247
|
sig = _format_script_signature(block.name, block.param_defs)
|
|
238
|
-
src = _format_script_source(block.span)
|
|
248
|
+
src = _format_script_source(block.span, full_path=True)
|
|
239
249
|
_state.output.write(f"Script: {sig}\n")
|
|
240
250
|
_state.output.write(f"Source: {src}\n")
|
|
241
251
|
if block.param_defs:
|
execsql/metacommands/upsert.py
CHANGED
|
@@ -201,14 +201,6 @@ def _set_subvars(result: Any) -> None:
|
|
|
201
201
|
sv("$PG_UPSERT_EXPORT_PATH", "")
|
|
202
202
|
|
|
203
203
|
|
|
204
|
-
def _qa_failure_msg(result: Any) -> str:
|
|
205
|
-
"""Build a concise QA failure message listing which tables failed."""
|
|
206
|
-
failed = [t.table_name for t in result.tables if not t.qa_passed]
|
|
207
|
-
if failed:
|
|
208
|
-
return f"PG_UPSERT QA failed for: {', '.join(failed)}"
|
|
209
|
-
return "PG_UPSERT QA checks failed."
|
|
210
|
-
|
|
211
|
-
|
|
212
204
|
# ---------------------------------------------------------------------------
|
|
213
205
|
# Import guard + helpers
|
|
214
206
|
# ---------------------------------------------------------------------------
|
|
@@ -484,13 +476,6 @@ def x_pg_upsert(**kwargs: Any) -> None:
|
|
|
484
476
|
if opts.get("cleanup"):
|
|
485
477
|
ups.cleanup()
|
|
486
478
|
|
|
487
|
-
if not result.qa_passed:
|
|
488
|
-
raise ErrInfo(
|
|
489
|
-
"cmd",
|
|
490
|
-
command_text=metacommandline,
|
|
491
|
-
other_msg=_qa_failure_msg(result),
|
|
492
|
-
)
|
|
493
|
-
|
|
494
479
|
|
|
495
480
|
def x_pg_upsert_qa(**kwargs: Any) -> None:
|
|
496
481
|
"""PG_UPSERT QA FROM <staging> TO <base> TABLES <t1>, <t2> [options]
|
|
@@ -524,13 +509,6 @@ def x_pg_upsert_qa(**kwargs: Any) -> None:
|
|
|
524
509
|
if opts.get("cleanup"):
|
|
525
510
|
ups.cleanup()
|
|
526
511
|
|
|
527
|
-
if not result.qa_passed:
|
|
528
|
-
raise ErrInfo(
|
|
529
|
-
"cmd",
|
|
530
|
-
command_text=metacommandline,
|
|
531
|
-
other_msg=_qa_failure_msg(result),
|
|
532
|
-
)
|
|
533
|
-
|
|
534
512
|
|
|
535
513
|
def x_pg_upsert_check(**kwargs: Any) -> None:
|
|
536
514
|
"""PG_UPSERT CHECK FROM <staging> TO <base> TABLES <t1>, <t2>
|
|
@@ -567,13 +545,6 @@ def x_pg_upsert_check(**kwargs: Any) -> None:
|
|
|
567
545
|
if opts.get("cleanup"):
|
|
568
546
|
ups.cleanup()
|
|
569
547
|
|
|
570
|
-
if not result.qa_passed:
|
|
571
|
-
raise ErrInfo(
|
|
572
|
-
"cmd",
|
|
573
|
-
command_text=metacommandline,
|
|
574
|
-
other_msg=_qa_failure_msg(result),
|
|
575
|
-
)
|
|
576
|
-
|
|
577
548
|
|
|
578
549
|
# ---------------------------------------------------------------------------
|
|
579
550
|
# Plugin registration
|
execsql/script/executor.py
CHANGED
|
@@ -243,15 +243,17 @@ def _exec_sql(
|
|
|
243
243
|
|
|
244
244
|
def _exec_metacommand(
|
|
245
245
|
ctx: RuntimeContext,
|
|
246
|
-
|
|
246
|
+
cmd: str,
|
|
247
247
|
source: str,
|
|
248
248
|
line_no: int,
|
|
249
|
-
localvars: SubVarSet | None = None,
|
|
250
249
|
) -> Any:
|
|
251
|
-
"""Dispatch a metacommand through the dispatch table.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
250
|
+
"""Dispatch a metacommand through the dispatch table.
|
|
251
|
+
|
|
252
|
+
*cmd* must already have ``!!$VAR!!`` substitution applied. The caller is
|
|
253
|
+
responsible for expansion so that side-effecting substitutions (counter
|
|
254
|
+
increments, ``$RANDOM``, ``$UUID``) are evaluated exactly once per
|
|
255
|
+
metacommand reference.
|
|
256
|
+
"""
|
|
255
257
|
if _VARLIKE.search(cmd):
|
|
256
258
|
ctx.output.write(
|
|
257
259
|
f"Warning: There is a potential un-substituted variable in the command\n {cmd}\n",
|
|
@@ -355,13 +357,15 @@ def _execute_node(
|
|
|
355
357
|
command = node.command
|
|
356
358
|
if in_loop:
|
|
357
359
|
command = _convert_deferred_vars(command)
|
|
358
|
-
#
|
|
360
|
+
# Substitute once: the same expanded text is used for BREAK detection
|
|
361
|
+
# and dispatch. Calling substitute_vars twice would double-increment
|
|
362
|
+
# !!$COUNTER_N!! and re-roll !!$RANDOM!!/!!$UUID!! references.
|
|
359
363
|
effective_locals = _stack_localvars(ctx) or localvars
|
|
360
364
|
expanded = substitute_vars(command, effective_locals, ctx=ctx)
|
|
361
365
|
if _BREAK_RX.match(expanded):
|
|
362
366
|
raise _BreakLoop
|
|
363
367
|
ctx.last_command = _FakeScriptCmd(node)
|
|
364
|
-
_exec_metacommand(ctx,
|
|
368
|
+
_exec_metacommand(ctx, expanded, node.span.file, node.span.start_line)
|
|
365
369
|
|
|
366
370
|
elif isinstance(node, IfBlock):
|
|
367
371
|
ctx.last_command = _FakeScriptCmd(node)
|
execsql/script/parser.py
CHANGED
|
@@ -114,14 +114,48 @@ _EXEC_SCRIPT_RX = re.compile(
|
|
|
114
114
|
re.I,
|
|
115
115
|
)
|
|
116
116
|
|
|
117
|
+
# A parameter default value is either a double-quoted string, a single-quoted
|
|
118
|
+
# string (both may contain spaces, commas, and other special characters), or
|
|
119
|
+
# a bare run of non-whitespace characters. Unquoted values must not begin
|
|
120
|
+
# with a quote — that catches mismatched / unterminated quoted values
|
|
121
|
+
# (e.g. ``name="value``) instead of silently treating them as literals.
|
|
122
|
+
_PARAM_VALUE = r'(?:"[^"]*"|\'[^\']*\'|[^\s\'"]\S*)'
|
|
123
|
+
|
|
117
124
|
_WITH_PARAMS_RX = re.compile(
|
|
118
125
|
r"(?:\s+WITH)?(?:\s+PARAM(?:ETER)?S)?\s*\(\s*(?P<params>"
|
|
119
|
-
|
|
126
|
+
rf"\w+(?:\s*=\s*{_PARAM_VALUE})?(?:\s*,\s*\w+(?:\s*=\s*{_PARAM_VALUE})?)*"
|
|
120
127
|
r")\s*\)\s*$",
|
|
121
128
|
re.I,
|
|
122
129
|
)
|
|
123
130
|
|
|
124
|
-
_PARAM_TOKEN_RX = re.compile(
|
|
131
|
+
_PARAM_TOKEN_RX = re.compile(rf"(\w+)(?:\s*=\s*({_PARAM_VALUE}))?\s*\Z")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _split_param_tokens(params_str: str) -> list[str]:
|
|
135
|
+
"""Split a parameter list on commas, respecting quoted values.
|
|
136
|
+
|
|
137
|
+
Quoted segments (``"..."`` or ``'...'``) are kept intact so that commas
|
|
138
|
+
inside quotes do not split the token. Each returned token is stripped
|
|
139
|
+
of surrounding whitespace.
|
|
140
|
+
"""
|
|
141
|
+
tokens: list[str] = []
|
|
142
|
+
current: list[str] = []
|
|
143
|
+
in_quote: str | None = None
|
|
144
|
+
for ch in params_str:
|
|
145
|
+
if in_quote is not None:
|
|
146
|
+
current.append(ch)
|
|
147
|
+
if ch == in_quote:
|
|
148
|
+
in_quote = None
|
|
149
|
+
elif ch in ('"', "'"):
|
|
150
|
+
current.append(ch)
|
|
151
|
+
in_quote = ch
|
|
152
|
+
elif ch == ",":
|
|
153
|
+
tokens.append("".join(current))
|
|
154
|
+
current = []
|
|
155
|
+
else:
|
|
156
|
+
current.append(ch)
|
|
157
|
+
tokens.append("".join(current))
|
|
158
|
+
return [t.strip() for t in tokens]
|
|
125
159
|
|
|
126
160
|
|
|
127
161
|
def _parse_param_defs(
|
|
@@ -129,16 +163,21 @@ def _parse_param_defs(
|
|
|
129
163
|
lineno: int,
|
|
130
164
|
source: str,
|
|
131
165
|
) -> list[ParamDef]:
|
|
132
|
-
"""Parse ``'a, b, c=100, d=
|
|
166
|
+
"""Parse ``'a, b, c=100, d="hello world"'`` into a list of :class:`ParamDef`.
|
|
167
|
+
|
|
168
|
+
Defaults may be unquoted (``key=value``), double-quoted (``key="v a l"``),
|
|
169
|
+
or single-quoted (``key='v,a,l'``). Surrounding quotes are stripped so
|
|
170
|
+
that ``ParamDef.default`` always holds the resolved value, mirroring the
|
|
171
|
+
quote-handling done at the call site for passed arguments.
|
|
133
172
|
|
|
134
173
|
Required parameters (no default) must precede optional parameters
|
|
135
174
|
(with default). Raises :class:`ErrInfo` if ordering is violated.
|
|
136
175
|
"""
|
|
137
|
-
tokens =
|
|
176
|
+
tokens = _split_param_tokens(params_str)
|
|
138
177
|
defs: list[ParamDef] = []
|
|
139
178
|
seen_optional: str | None = None # name of first optional param
|
|
140
179
|
for token in tokens:
|
|
141
|
-
m = _PARAM_TOKEN_RX.match(token
|
|
180
|
+
m = _PARAM_TOKEN_RX.match(token)
|
|
142
181
|
if not m:
|
|
143
182
|
raise ErrInfo(
|
|
144
183
|
type="cmd",
|
|
@@ -146,6 +185,7 @@ def _parse_param_defs(
|
|
|
146
185
|
)
|
|
147
186
|
name, default = m.group(1), m.group(2)
|
|
148
187
|
if default is not None:
|
|
188
|
+
default = _strip_quotes(default)
|
|
149
189
|
if seen_optional is None:
|
|
150
190
|
seen_optional = name
|
|
151
191
|
elif seen_optional is not None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: execsql2
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.17.0
|
|
4
4
|
Summary: Runs a SQL script against a PostgreSQL, SQLite, MariaDB/MySQL, DuckDB, Firebird, MS-Access, MS-SQL-Server, or Oracle database, or an ODBC DSN. Provides metacommands to import and export data, copy data between databases, conditionally execute SQL and metacommands, and dynamically alter SQL and metacommands with substitution variables.
|
|
5
5
|
Project-URL: Homepage, https://execsql2.readthedocs.io
|
|
6
6
|
Project-URL: Repository, https://github.com/geocoug/execsql
|
|
@@ -31,7 +31,7 @@ execsql/db/postgres.py,sha256=-GpaA9fi6_vdIDTGyRGxNRaPYAAkEB_aCb-EyLFShsM,21120
|
|
|
31
31
|
execsql/db/sqlite.py,sha256=n44ldZ-afQFSnUuYJ1phcvWFnxp3SwgrD2YQcyr7zLM,10664
|
|
32
32
|
execsql/db/sqlserver.py,sha256=d8PwfNumt-Spit_0llafqQ900suv3CZMbrRsHLU1iB4,7683
|
|
33
33
|
execsql/debug/__init__.py,sha256=j6EGUR0dHzUhWN1mHHtf1-Lhjq3Sb1V-vmnq2Ztgj1M,178
|
|
34
|
-
execsql/debug/repl.py,sha256=
|
|
34
|
+
execsql/debug/repl.py,sha256=snR_ErOOXyWBHeGdE_PaP8dwnysxaue5T-C6mGNFgeI,20763
|
|
35
35
|
execsql/exporters/__init__.py,sha256=-Cnji-OgodJV8ftcDcOyTof0kQMy9J5kKVC8GVFpc3o,670
|
|
36
36
|
execsql/exporters/base.py,sha256=Uhq0PBz8N_pJ7WlIN9225wY-HyxfzWSb9YabHXicBA8,6387
|
|
37
37
|
execsql/exporters/delimited.py,sha256=Po9RV4UwBLOuRZmPFJk5CErpFvTdLCy--nFJJffZgxM,32383
|
|
@@ -71,7 +71,7 @@ execsql/metacommands/conditions.py,sha256=B6fBumkqoPO4wcQbw_ypYITaSnzPemAA1g5GrN
|
|
|
71
71
|
execsql/metacommands/connect.py,sha256=Wnlp5PeeaNDaVlaWjCetvarTgQIwIeMPYe8cyslPYeA,14969
|
|
72
72
|
execsql/metacommands/control.py,sha256=PlTAq34OkcmnOsPm3bZxF4mg1MaNBpENa8wzIKVEY10,8302
|
|
73
73
|
execsql/metacommands/data.py,sha256=tRQBGTAuW-eJ2tBNWaoZI9OjTyNNyHJISo7gOdL-sm8,11370
|
|
74
|
-
execsql/metacommands/debug.py,sha256=
|
|
74
|
+
execsql/metacommands/debug.py,sha256=aTTI5yg7JTUYWBDve8QeLHtufMPnaWg8XG8M-rKwtw4,12415
|
|
75
75
|
execsql/metacommands/dispatch.py,sha256=DvpgpkX1yMWnJrVW8ir_o1xKgfZgXzlTt6IwP0Lwoek,87441
|
|
76
76
|
execsql/metacommands/io.py,sha256=vlGBje5sgnqeilooMdhJDgSRIhysHy5_7LrKtik9Xjs,3011
|
|
77
77
|
execsql/metacommands/io_export.py,sha256=iX4L3lpZGT2P5ca2C3XJ3MYxXJ_loC7nWmfKcWv4UGQ,13379
|
|
@@ -81,13 +81,13 @@ execsql/metacommands/io_write.py,sha256=eayUxsLnEDqp2R5iqlEjeOK8DxyoOFkG9hBe2JkV
|
|
|
81
81
|
execsql/metacommands/prompt.py,sha256=E2e7q4pxbl_wEBrhco0B2gm5hO_HG3rNIF75PLdTgGg,36767
|
|
82
82
|
execsql/metacommands/script_ext.py,sha256=sw4YKUQl0SRlVlmhIoGbMokOo_hVqh1EcTuYCN7c4kM,2396
|
|
83
83
|
execsql/metacommands/system.py,sha256=cuyGebDR-ysVWjZRVYJLSGWhxfQWcFHroutCPySiad0,7375
|
|
84
|
-
execsql/metacommands/upsert.py,sha256=
|
|
84
|
+
execsql/metacommands/upsert.py,sha256=wzoMpM8g49pEvU9GkHZ62fPvqV3w1UIUfxVA7HAsS_o,20317
|
|
85
85
|
execsql/script/__init__.py,sha256=3WaBklMVIWjtCsYQ-BVo9UAVEIATOgeGsuyv21YKnxo,3969
|
|
86
86
|
execsql/script/ast.py,sha256=AviMXseSpZtaPpJtJEs3olaXuk23kN_dU5raHbymy6s,20266
|
|
87
87
|
execsql/script/control.py,sha256=s-1eZdGARM6H1FwZ6VDdO_f50j7bvvRtTHesfUm9tbc,6144
|
|
88
88
|
execsql/script/engine.py,sha256=EhuVBniOrFkzAW4I3NIZLt3INHTZJvlYoF7B99rZBLI,29391
|
|
89
|
-
execsql/script/executor.py,sha256=
|
|
90
|
-
execsql/script/parser.py,sha256
|
|
89
|
+
execsql/script/executor.py,sha256=0YW8G_pZqa-S1a8hEoRUMVAbsJF8PSXSwdctKG17tuU,37840
|
|
90
|
+
execsql/script/parser.py,sha256=-7v6yJIYgTHyYzE57fy-xEoLy--NWFnQsbAvGh17cqY,33825
|
|
91
91
|
execsql/script/variables.py,sha256=ZSBGQUsoii6w3dLDVY9xxoPIV6wY0sAV_BNIQ6pgQAE,14328
|
|
92
92
|
execsql/utils/__init__.py,sha256=0uR6JwVJQRX3vceByNBduCAf5dd5assKjeqJUWvpZoA,278
|
|
93
93
|
execsql/utils/auth.py,sha256=onXzNkNZQZxGC5w7eey06sjvAIAX_Lf9g7nUJtcsel0,7009
|
|
@@ -101,24 +101,24 @@ execsql/utils/numeric.py,sha256=xh02ANSRk3nUpQ-rtm66ILoMqoi7HtzCoRMIOT9U8QI,1570
|
|
|
101
101
|
execsql/utils/regex.py,sha256=diEzTZqU_HHwVMadPAvN1Vgzhl7I03eVaEFGCXyGGL8,3770
|
|
102
102
|
execsql/utils/strings.py,sha256=5Dvzrk-9SIw2lpxXZQkiJbNyo1sy7iXXAtSULlZ0KG8,8488
|
|
103
103
|
execsql/utils/timer.py,sha256=eDYf5VzCNFk7oo90InJucUm3XcBdhYMogjZMqeg9xzc,1899
|
|
104
|
-
execsql2-2.
|
|
105
|
-
execsql2-2.
|
|
106
|
-
execsql2-2.
|
|
107
|
-
execsql2-2.
|
|
108
|
-
execsql2-2.
|
|
109
|
-
execsql2-2.
|
|
110
|
-
execsql2-2.
|
|
111
|
-
execsql2-2.
|
|
112
|
-
execsql2-2.
|
|
113
|
-
execsql2-2.
|
|
114
|
-
execsql2-2.
|
|
115
|
-
execsql2-2.
|
|
116
|
-
execsql2-2.
|
|
117
|
-
execsql2-2.
|
|
118
|
-
execsql2-2.
|
|
119
|
-
execsql2-2.
|
|
120
|
-
execsql2-2.
|
|
121
|
-
execsql2-2.
|
|
122
|
-
execsql2-2.
|
|
123
|
-
execsql2-2.
|
|
124
|
-
execsql2-2.
|
|
104
|
+
execsql2-2.17.0.data/data/execsql2_extras/README.md,sha256=sxwVyU0ZahCfANv56LahkyuM505kFjrMhe-1SvWE69E,4845
|
|
105
|
+
execsql2-2.17.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
|
|
106
|
+
execsql2-2.17.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=SY3Jxn1qcVm4kPW9xmmTfknHfvURXmeEYTbRjYrjGSw,7487
|
|
107
|
+
execsql2-2.17.0.data/data/execsql2_extras/execsql.conf,sha256=1a2g2Vga7s128wcu3ftIFRkHlKKtuvkuOHSD1XuNT7o,9404
|
|
108
|
+
execsql2-2.17.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
|
|
109
|
+
execsql2-2.17.0.data/data/execsql2_extras/md_compare.sql,sha256=B8Wd7LZ0vnMY2qvA139JIEBkPObgRH2i5xj6PejTQt8,24092
|
|
110
|
+
execsql2-2.17.0.data/data/execsql2_extras/md_glossary.sql,sha256=DJRHcU5NbFpxTTX-IwH3yRlsboj1q6BBGrUAHKn4Cuo,10796
|
|
111
|
+
execsql2-2.17.0.data/data/execsql2_extras/md_upsert.sql,sha256=v_7GbWh_N1mBTmw3gvTrkagOVp2q0KmXvM8hE-DlFxY,112524
|
|
112
|
+
execsql2-2.17.0.data/data/execsql2_extras/pg_compare.sql,sha256=9dWa8hnfy5dVJI-z2iGpd9JzQmI4j2ziMlEdpnr66ro,24352
|
|
113
|
+
execsql2-2.17.0.data/data/execsql2_extras/pg_glossary.sql,sha256=pKjIIDsROAgJq2H-1qNEcRMAWManivcZ_AEVHzUUlic,9908
|
|
114
|
+
execsql2-2.17.0.data/data/execsql2_extras/pg_upsert.sql,sha256=k7AFiGTLBy3nf-qO5QIaZrEYTAKvdxxU3JDLx9jqkzs,108315
|
|
115
|
+
execsql2-2.17.0.data/data/execsql2_extras/script_template.sql,sha256=1Estacb_vm1FgK41k_G9nuduP1yiA-fQ1Kn4Z4mv5Ao,11153
|
|
116
|
+
execsql2-2.17.0.data/data/execsql2_extras/ss_compare.sql,sha256=TsVxWm3cEpR5-EiMYXNhtaY0arSNeKZhsJdHdLA7xeI,24833
|
|
117
|
+
execsql2-2.17.0.data/data/execsql2_extras/ss_glossary.sql,sha256=cLM7nN8JOIu9ZVP9oY9qdSK3hrnWJiDcX6nZmQQbQWI,13065
|
|
118
|
+
execsql2-2.17.0.data/data/execsql2_extras/ss_upsert.sql,sha256=BCqmBykXBF-BpCgOFeG1qhf2XfScKsxPD17wd1hYfHw,120647
|
|
119
|
+
execsql2-2.17.0.dist-info/METADATA,sha256=KHC9DTyU7haKukUTn6bHYgwkpXDNLq_lffErzmLCajo,20920
|
|
120
|
+
execsql2-2.17.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
121
|
+
execsql2-2.17.0.dist-info/entry_points.txt,sha256=sUOxkM-dN1eBGGpSpDLsAaE0yNXYQKWZAfxPOlMkQyk,90
|
|
122
|
+
execsql2-2.17.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
|
|
123
|
+
execsql2-2.17.0.dist-info/licenses/NOTICE,sha256=sqVrM73Ys9zfvWC_P797lHfTnoPW_ETeBSrUTFaob0A,339
|
|
124
|
+
execsql2-2.17.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
{execsql2-2.16.17.data → execsql2-2.17.0.data}/data/execsql2_extras/example_config_prompt.sql
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|