execsql2 2.34.0__py3-none-any.whl → 2.35.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.
Files changed (28) hide show
  1. execsql/api.py +1 -0
  2. execsql/config.py +2 -0
  3. execsql/data/execsql.conf.template +7 -0
  4. execsql/metacommands/data.py +7 -1
  5. execsql/metacommands/dispatch.py +7 -0
  6. execsql/metacommands/reference.py +1 -0
  7. execsql/models.py +30 -4
  8. execsql/script/executor.py +10 -10
  9. execsql/utils/errors.py +2 -2
  10. {execsql2-2.34.0.dist-info → execsql2-2.35.0.dist-info}/METADATA +2 -2
  11. {execsql2-2.34.0.dist-info → execsql2-2.35.0.dist-info}/RECORD +28 -28
  12. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/README.md +0 -0
  13. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/config_settings.sqlite +0 -0
  14. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/example_config_prompt.sql +0 -0
  15. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/make_config_db.sql +0 -0
  16. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/md_compare.sql +0 -0
  17. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/md_glossary.sql +0 -0
  18. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/md_upsert.sql +0 -0
  19. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/pg_compare.sql +0 -0
  20. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/pg_glossary.sql +0 -0
  21. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/script_template.sql +0 -0
  22. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/ss_compare.sql +0 -0
  23. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/ss_glossary.sql +0 -0
  24. {execsql2-2.34.0.data → execsql2-2.35.0.data}/data/execsql2_extras/ss_upsert.sql +0 -0
  25. {execsql2-2.34.0.dist-info → execsql2-2.35.0.dist-info}/WHEEL +0 -0
  26. {execsql2-2.34.0.dist-info → execsql2-2.35.0.dist-info}/entry_points.txt +0 -0
  27. {execsql2-2.34.0.dist-info → execsql2-2.35.0.dist-info}/licenses/LICENSE.txt +0 -0
  28. {execsql2-2.34.0.dist-info → execsql2-2.35.0.dist-info}/licenses/NOTICE +0 -0
execsql/api.py CHANGED
@@ -178,6 +178,7 @@ class _LibraryConfig:
178
178
  self.boolean_int = True
179
179
  self.boolean_words = False
180
180
  self.empty_strings = True
181
+ self.exact_decimals = False
181
182
  self.only_strings = False
182
183
  self.empty_rows = True
183
184
  self.del_empty_cols = False
execsql/config.py CHANGED
@@ -300,6 +300,7 @@ class ConfigData:
300
300
  self._get_bool(cp, self._INPUT_SECTION, "boolean_int", "boolean_int")
301
301
  self._get_bool(cp, self._INPUT_SECTION, "boolean_words", "boolean_words")
302
302
  self._get_bool(cp, self._INPUT_SECTION, "empty_strings", "empty_strings")
303
+ self._get_bool(cp, self._INPUT_SECTION, "exact_decimals", "exact_decimals")
303
304
  self._get_bool(cp, self._INPUT_SECTION, "only_strings", "only_strings")
304
305
  self._get_bool(cp, self._INPUT_SECTION, "empty_rows", "empty_rows")
305
306
  self._get_bool(cp, self._INPUT_SECTION, "delete_empty_columns", "del_empty_cols")
@@ -503,6 +504,7 @@ class ConfigData:
503
504
  self.boolean_int = True
504
505
  self.boolean_words = False
505
506
  self.empty_strings = True
507
+ self.exact_decimals = False
506
508
  self.only_strings = False
507
509
  self.empty_rows = True
508
510
  self.del_empty_cols = False
@@ -115,6 +115,13 @@
115
115
  # Values: Yes or No. Default: Yes.
116
116
  #empty_strings=Yes
117
117
 
118
+ # Whether a column of decimal numbers with different numbers of decimal places
119
+ # (1.5, 2.25) gets an exact DECIMAL(precision, scale) type when IMPORT or COPY
120
+ # creates a table. With No it gets a floating-point type, unless a value has
121
+ # more than 15 significant digits (then it is DECIMAL, so no digit is lost).
122
+ # Values: Yes or No. Default: No.
123
+ #exact_decimals=No
124
+
118
125
  # Whether to fold column headers to lowercase, uppercase, or leave unchanged.
119
126
  # Values: No, Lower, or Upper. Default: No.
120
127
  #fold_column_headers=No
@@ -21,7 +21,7 @@ What's actually here:
21
21
  ``x_set_counter``.
22
22
  - IMPORT / scanning configuration metacommands (the ``CONFIG …`` form):
23
23
  ``x_empty_strings``, ``x_trim_strings``, ``x_replace_newlines``,
24
- ``x_empty_rows``, ``x_only_strings``, ``x_boolean_int``,
24
+ ``x_empty_rows``, ``x_exact_decimals``, ``x_only_strings``, ``x_boolean_int``,
25
25
  ``x_boolean_words``, ``x_fold_col_hdrs``, ``x_trim_col_hdrs``,
26
26
  ``x_clean_col_hdrs``, ``x_del_empty_cols``, ``x_create_col_hdrs``,
27
27
  ``x_dedup_col_hdrs``, ``x_import_common_cols_only``, ``x_max_int``.
@@ -301,6 +301,12 @@ def x_only_strings(**kwargs: Any) -> None:
301
301
  return None
302
302
 
303
303
 
304
+ def x_exact_decimals(**kwargs: Any) -> None:
305
+ flag = kwargs["yesno"].lower()
306
+ _state.conf.exact_decimals = flag in ("yes", "on", "true", "1")
307
+ return None
308
+
309
+
304
310
  def x_boolean_int(**kwargs: Any) -> None:
305
311
  flag = kwargs["yesno"].lower()
306
312
  _state.conf.boolean_int = flag in ("yes", "on", "true", "1")
@@ -64,6 +64,7 @@ from execsql.metacommands.data import (
64
64
  x_dedup_col_hdrs,
65
65
  x_empty_rows,
66
66
  x_empty_strings,
67
+ x_exact_decimals,
67
68
  x_fold_col_hdrs,
68
69
  x_import_common_cols_only,
69
70
  x_max_int,
@@ -768,6 +769,12 @@ def build_dispatch_table() -> MetaCommandList:
768
769
  description="EMPTY_ROWS",
769
770
  category="config_option",
770
771
  )
772
+ mcl.add(
773
+ r"^\s*CONFIG\s+EXACT_DECIMALS\s+(?P<yesno>YES|NO|ON|OFF|TRUE|FALSE|0|1)\s*$",
774
+ x_exact_decimals,
775
+ description="EXACT_DECIMALS",
776
+ category="config_option",
777
+ )
771
778
  mcl.add(
772
779
  r"^\s*CONFIG\s+ONLY_STRINGS\s+(?P<yesno>YES|NO|ON|OFF|TRUE|FALSE|0|1)\s*$",
773
780
  x_only_strings,
@@ -254,6 +254,7 @@ _METACOMMANDS: tuple[Metacommand, ...] = (
254
254
  "CONFIG DELETE_EMPTY_COLUMNS YES|NO",
255
255
  "CONFIG EMPTY_ROWS YES|NO",
256
256
  "CONFIG EMPTY_STRINGS YES|NO",
257
+ "CONFIG EXACT_DECIMALS YES|NO",
257
258
  "CONFIG EXPORT_ROW_BUFFER <n>",
258
259
  "CONFIG FOLD_COLUMN_HEADERS NO|LOWER|UPPER",
259
260
  "CONFIG GUI_LEVEL <n>",
execsql/models.py CHANGED
@@ -49,6 +49,10 @@ __all__ = [
49
49
 
50
50
  ColumnType = tuple[str, type[DataType], int | None, bool, int | None, int | None]
51
51
 
52
+ # Every decimal of up to this many significant digits reads back unchanged
53
+ # from an IEEE double (DBL_DIG).
54
+ _DOUBLE_EXACT_DIGITS = 15
55
+
52
56
 
53
57
  def _text_length(value: Any) -> int:
54
58
  """Return the length of *value* written as text (a column may turn out to be text)."""
@@ -71,9 +75,14 @@ class Column:
71
75
  """Accumulate match counts and length statistics for a single data type."""
72
76
 
73
77
  # Accumulates the count of matches for each data type, plus the maximum length if appropriate.
74
- def __init__(self, data_type_obj: DataType) -> None:
75
- """Initialise the accumulator for the given data type."""
78
+ def __init__(self, data_type_obj: DataType, *, exact_decimals: bool = False) -> None:
79
+ """Initialise the accumulator for the given data type.
80
+
81
+ *exact_decimals*: the ``exact_decimals`` setting; see
82
+ :meth:`chooses_float`.
83
+ """
76
84
  self.dt = data_type_obj
85
+ self.exact_decimals = exact_decimals
77
86
  self.failed = False
78
87
  self.count = 0
79
88
  self.maxlen = 0
@@ -127,6 +136,23 @@ class Column:
127
136
  self.maxscale = max(self.dt.scale, self.maxscale)
128
137
  self.max_int_digits = max(int_digits, self.max_int_digits)
129
138
 
139
+ def chooses_float(self) -> bool:
140
+ """Whether a decimal column gives way to a float column.
141
+
142
+ A column of decimals with different scales (``1.50``, ``2``,
143
+ ``-3.25``) is a float unless the ``exact_decimals`` setting is on,
144
+ or a value has more digits than a double holds exactly: every
145
+ decimal of up to 15 significant digits reads back unchanged from
146
+ a double, so such a column loses nothing, and a longer one
147
+ (``1234567890.1234567891``) stays ``DECIMAL(p, s)``.
148
+ """
149
+ return (
150
+ self.varscale
151
+ and not self.exact_decimals
152
+ and self.maxprecision is not None
153
+ and self.maxprecision <= _DOUBLE_EXACT_DIGITS
154
+ )
155
+
130
156
  def __init__(self, colname: str, infer_strings: bool = True) -> None:
131
157
  """Create a column characteriser for the named column.
132
158
 
@@ -169,7 +195,7 @@ class Column:
169
195
  self.Accum(DT_Boolean()),
170
196
  self.Accum(DT_Integer()),
171
197
  self.Accum(DT_Long()),
172
- self.Accum(DT_Decimal()),
198
+ self.Accum(DT_Decimal(), exact_decimals=conf.exact_decimals),
173
199
  self.Accum(DT_Float()),
174
200
  self.Accum(DT_Character()),
175
201
  self.Accum(DT_Varchar()),
@@ -262,7 +288,7 @@ class Column:
262
288
  break
263
289
  else:
264
290
  if ac.dt.precspec:
265
- if ac.dt.precision is not None and ac.dt.scale is not None:
291
+ if ac.dt.precision is not None and ac.dt.scale is not None and not ac.chooses_float():
266
292
  sel_type = ac
267
293
  break
268
294
  else:
@@ -85,6 +85,14 @@ _DEFER_RX = re.compile(r"!\{([$@&~#+]?\w+)\}!")
85
85
  _VARLIKE = re.compile(r"!![$@&~#]?\w+!!", re.I)
86
86
 
87
87
 
88
+ def _warn_unsubstituted(cmd: str) -> None:
89
+ """Log a command that still looks like it holds a variable; print it too if ``write_warnings`` is on."""
90
+ from execsql.utils.errors import write_warning
91
+ from execsql.utils.fileio import redact
92
+
93
+ write_warning(f"There is a potential un-substituted variable in the command\n {redact(cmd)}")
94
+
95
+
88
96
  def _stack_localvars(ctx: RuntimeContext) -> SubVarSet | None:
89
97
  """Build the merged ``~`` local + ``#`` param overlay for the current scope.
90
98
 
@@ -254,11 +262,7 @@ def _exec_sql(
254
262
  effective_locals = _stack_localvars(ctx) or localvars
255
263
  cmd = substitute_vars(text, effective_locals, ctx=ctx)
256
264
  if _VARLIKE.search(cmd):
257
- from execsql.utils.fileio import redact
258
-
259
- output.write(
260
- f"Warning: There is a potential un-substituted variable in the command\n {redact(cmd)}\n",
261
- )
265
+ _warn_unsubstituted(cmd)
262
266
  e = None
263
267
  result = None
264
268
  try:
@@ -323,11 +327,7 @@ def _exec_metacommand(
323
327
  assert subvars is not None
324
328
 
325
329
  if _VARLIKE.search(cmd):
326
- from execsql.utils.fileio import redact
327
-
328
- output.write(
329
- f"Warning: There is a potential un-substituted variable in the command\n {redact(cmd)}\n",
330
- )
330
+ _warn_unsubstituted(cmd)
331
331
  e = None
332
332
  try:
333
333
  applies, result = metacommandlist.eval(cmd)
execsql/utils/errors.py CHANGED
@@ -274,8 +274,8 @@ def write_warning(warning_msg: str, *, always: bool = False) -> None:
274
274
  warning_msg: The warning text to emit.
275
275
  always: When ``True``, always write to stderr regardless of the
276
276
  ``conf.write_warnings`` setting. Use this for structural warnings
277
- (e.g. IF-level mismatch, unsubstituted variables) that should always
278
- be visible. When ``False`` (default), stderr output is gated by
277
+ (e.g. IF-level mismatch) that should always be visible. When
278
+ ``False`` (default), stderr output is gated by
279
279
  ``conf.write_warnings``.
280
280
  """
281
281
  if _state.exec_log is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execsql2
3
- Version: 2.34.0
3
+ Version: 2.35.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/en/stable/
6
6
  Project-URL: Repository, https://github.com/geocoug/execsql
@@ -441,7 +441,7 @@ execsql format --no-sql --in-place scripts/
441
441
  ```yaml
442
442
  repos:
443
443
  - repo: https://github.com/geocoug/execsql
444
- rev: v2.34.0
444
+ rev: v2.35.0
445
445
  hooks:
446
446
  - id: execsql-format
447
447
  - id: execsql-lint
@@ -1,13 +1,13 @@
1
1
  execsql/__init__.py,sha256=ZeVnpEWu8M2bn3qLmVM72NhWRueUGNbsX8UAPTermo0,901
2
2
  execsql/__main__.py,sha256=Nnh7_QgjYTTzd1Kog2thl7wzNpoxfnZ3YaurSOMzE_U,270
3
- execsql/api.py,sha256=jJa9P8T0lWR7hXF1WZKgfK7QHbU5qns4x6YNFbFH_eo,26795
4
- execsql/config.py,sha256=PoIU1dr6uwTCHVmnNhA4zzPT1BsZBPcX0Q7KC1ItvqI,40408
3
+ execsql/api.py,sha256=WrlmuLKYpOnNLW8l9Svzeh28Ox0zGFrjhJtYlKY7niU,26831
4
+ execsql/config.py,sha256=wTtugbLNplxgva4P8uD8jKYs8N0MywHPTvjwHTsYFDU,40528
5
5
  execsql/config_validation.py,sha256=a4ZszyJFGTNgs1jkvXE3yMCaYFtF1Uqih2ojMDVh1v8,10556
6
6
  execsql/exceptions.py,sha256=aHavdblmP7m5ZLxyyKKmPSwwbdmP962j4ShP1Gd9r64,9651
7
7
  execsql/format.py,sha256=z-KZ8VY1muz8S6iaErZX9E_7wE_VtjEcUB7e_KyhfyI,59565
8
8
  execsql/interactive.py,sha256=7vm7NAlcarBJJOIffcLOcJqH9ZCInvHB_CmC2sQsXf8,8241
9
9
  execsql/manifest.py,sha256=eJp39R8bYuFuJiGaBbDsk_lua13uJHXPOdwWdUfE-CQ,9027
10
- execsql/models.py,sha256=heq4wrTJHOHF5sCIbvnCiaNHteeT8G06aBoRAsF9vuI,17191
10
+ execsql/models.py,sha256=8AnxILNwFZjDX8xXvv5usgOcTDsOIwkfZJjeYbXREe8,18374
11
11
  execsql/parser.py,sha256=bw26e1lD-PZscV11VtBdqSLkjpcYfNLQC2EYfYD5UwU,16012
12
12
  execsql/plugins.py,sha256=RykMlIjTyWcnQc9ygjLErS3wdcsZSsG9QTIvg4DwfAI,13626
13
13
  execsql/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -31,7 +31,7 @@ execsql/cli/commands/listing.py,sha256=thtkJ-ILGd0SPs57oVIMkkCGpXsfS0hQxueMc2ccR
31
31
  execsql/cli/commands/lsp.py,sha256=8xIrqA4dnapdlLqbGGb53YtFTnsX2YqpLYvrrl-Z6pE,4051
32
32
  execsql/cli/commands/run.py,sha256=sGFDku66CazJrorr0mmrhUI3QDvQVSMEYlU8G1Pd5fQ,16492
33
33
  execsql/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- execsql/data/execsql.conf.template,sha256=Mz8wZxu0U2bfL-fsDpRHvdLkwNpfuZrl4QUMjp7SXyk,12770
34
+ execsql/data/execsql.conf.template,sha256=3-sJPrB1u3KPsuiXv7X_BcSugUmRBgqFh37GuevyfTc,13138
35
35
  execsql/data/script_header.sql,sha256=a7WKScekNgJoxVEmMRTkWv8NsAzW1jJ4vJfGy9HVy0g,349
36
36
  execsql/db/__init__.py,sha256=jTbuafuKOqYtXFR1wvCOoKK5Lr3l1uErfaIbIr6UywI,1063
37
37
  execsql/db/access.py,sha256=fxiC3rtoOJzrNXNxau-w7oh1fd9tyh2_PMliBbFc164,21427
@@ -101,9 +101,9 @@ execsql/metacommands/__init__.py,sha256=aMf-3IRjMpNFSUI-IMAcvL-kXZHq5qF6W_p3Uawd
101
101
  execsql/metacommands/conditions.py,sha256=4DsMXr6vnfbtcKqgnxYV4UK4NmAfE_hpfgkFjlH0bjo,29844
102
102
  execsql/metacommands/connect.py,sha256=SPk4h9yiUgTD3w1gNOT_oYx8VShggsO357by5Hoy6OI,15344
103
103
  execsql/metacommands/control.py,sha256=9swW6X8jXDUpu5cHiAnQVx1ahFyWxlx7mjg4dqYfX5Y,9355
104
- execsql/metacommands/data.py,sha256=gaKJ0xA-maFnezT9TJv-q4G4Etn-kJnF7vZWZoG4UqI,12305
104
+ execsql/metacommands/data.py,sha256=9zxyg3_kV4jRuagUNtSlhhlvH2TiPP0gdNAaXBXdhI0,12493
105
105
  execsql/metacommands/debug.py,sha256=mKRT7uLwnw34Xl46fNDI_zH4MsPpZyihoLlonapbXuU,12981
106
- execsql/metacommands/dispatch.py,sha256=so0ebcnv66NhVDtA1Bt4GelD0hsC5w7gy7rItz2Mdos,87430
106
+ execsql/metacommands/dispatch.py,sha256=m7p2L_HtooKfSv58MHbDmYJJ7Xe1UEpr6mnHdvABViI,87655
107
107
  execsql/metacommands/effects.py,sha256=cRSo48R4nRJzkRR3OGHLhJzofcdAaNIobaxmn1N9TGw,3813
108
108
  execsql/metacommands/io.py,sha256=vlGBje5sgnqeilooMdhJDgSRIhysHy5_7LrKtik9Xjs,3011
109
109
  execsql/metacommands/io_export.py,sha256=_1o5T3Ejqq_0N1hYwaRPgDktn8nZT8sQLMyXPRgXEec,14587
@@ -111,7 +111,7 @@ execsql/metacommands/io_fileops.py,sha256=ru7zYgNV7rg0WtaDwhdYjy5iJTcecvjzR1PCdM
111
111
  execsql/metacommands/io_import.py,sha256=gJICeK1MOfG6D73I7m8zBCalvr_ZJzD-QBKOpKYeYXo,15684
112
112
  execsql/metacommands/io_write.py,sha256=yXDkMbQ3haDARVATVUYZprakyJHSyk1NywdKkFLpQ14,12783
113
113
  execsql/metacommands/prompt.py,sha256=PlXhtBYCembG_1SSCrwpQR10mGF3_jXodu4aCSHlSCM,37950
114
- execsql/metacommands/reference.py,sha256=qBsOfcu4pi3XQCL-ywusfbrTtpqwqrWUlVraj8tj5Co,54325
114
+ execsql/metacommands/reference.py,sha256=9Q7DSiPEjXyD9HQkkqiToRN59TrZ8_6Gz9VVVv9WSjw,54369
115
115
  execsql/metacommands/script_ext.py,sha256=CsUbyq8QFPnnvfX_k7fPlYNvvRw1xLmAWER4Exo5pwc,3658
116
116
  execsql/metacommands/system.py,sha256=6X2qmMpGUHDzyEluEotXt0Ks9jKQTpc2x0eoYNgN12M,7997
117
117
  execsql/metacommands/upsert.py,sha256=hcYGonmh2sdijbqwNynn1-iajMnLp7x5vbRbtfjaf8c,21461
@@ -119,7 +119,7 @@ execsql/script/__init__.py,sha256=I7hVO6wm3iOocxRRGEcFHhjdtL1moKbUYLB-wKbjPdk,32
119
119
  execsql/script/ast.py,sha256=WqCpFxhxrT2IIGvbArTp3QS0BZryRZAb7IL4ri3I6xg,20591
120
120
  execsql/script/control.py,sha256=WqLy-HLPqHG3vEzYpKMiIJsD7LpORjyQuUWzFzcGz4w,2327
121
121
  execsql/script/engine.py,sha256=h1pUSXGqwJASLJizqzd9LBMn_U5Vuqc1UbaZk1xUinw,18468
122
- execsql/script/executor.py,sha256=p6VWZeTMRPD_621I-CF4K2aaFaAbrY5I82hksrACFJQ,40999
122
+ execsql/script/executor.py,sha256=s942xbokn1S8wUNqZd8zGKs-Hr-6Gd8FNaWqnTbZk28,41041
123
123
  execsql/script/parser.py,sha256=z73v6t6ZbPUKkRu-UOIL6q1cCRDeoRvG2aXXC8NpMvE,37162
124
124
  execsql/script/variables.py,sha256=XHRnViFp0zPy-skGpYbpckkYAcczqpw1lqTVLR9eZvo,17735
125
125
  execsql/utils/__init__.py,sha256=0uR6JwVJQRX3vceByNBduCAf5dd5assKjeqJUWvpZoA,278
@@ -127,7 +127,7 @@ execsql/utils/auth.py,sha256=0LYKdNMhodq9R0B8WyKp69a-xlP9wOR6Ua9Lgo2aJnQ,14868
127
127
  execsql/utils/color.py,sha256=goQqhnLg8yERpFolQikA9zYSVcuAm0unKTJiWTbQm-U,634
128
128
  execsql/utils/crypto.py,sha256=KlT6lPk-v0-qQQfAMfWvT9Q6kRdCD3_5JVaLajNocKM,3051
129
129
  execsql/utils/datetime.py,sha256=9ZizCFBYut5gC4gU3Cmegfddv1HLoU5xVQWm9thy5EI,6127
130
- execsql/utils/errors.py,sha256=WKojSMjNecL9riRo9TnZ4fXofZr2uDo2_4B6n-zP31M,11693
130
+ execsql/utils/errors.py,sha256=PtOM2XZSMxXVyHEOcCLAmkeLNjGbGuecU8TVDgCF2RE,11668
131
131
  execsql/utils/fileio.py,sha256=IqIEhun9aOnr1oBCWK2z2VAPVo95bZ54cVglLW4rV9M,48208
132
132
  execsql/utils/gui.py,sha256=1iiupP9AsLdR6ST0gcLE143o6y6YGUFlNv_pdVPxfCE,23943
133
133
  execsql/utils/mail.py,sha256=4RiKtXa_sqij_YGdYmjQ3PG0u3G9qjs-9caQwBErtBw,7278
@@ -136,22 +136,22 @@ execsql/utils/paths.py,sha256=7IIHT6vqXTfs6Ltfrzm_I2ZV4pU8IuedOLkHo6a1_K8,1175
136
136
  execsql/utils/regex.py,sha256=DGzPBl0Kt4--RbwPhoZI6Bm6N_CBUvI0DbqE4EF6qp8,3718
137
137
  execsql/utils/strings.py,sha256=UQNjpRCEFa1UO6feU-M-9e24wWAvizs_iu_4fFusLxo,8516
138
138
  execsql/utils/timer.py,sha256=eDYf5VzCNFk7oo90InJucUm3XcBdhYMogjZMqeg9xzc,1899
139
- execsql2-2.34.0.data/data/execsql2_extras/README.md,sha256=6f5bWiBlKRn8s6GVrU423-HFrU1Jwbk2AabxraLu3AY,5398
140
- execsql2-2.34.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
141
- execsql2-2.34.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=2e8KzzVWhho8KxYVHETSVmZdhW7wodioDsqBLSL6m4s,7487
142
- execsql2-2.34.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
143
- execsql2-2.34.0.data/data/execsql2_extras/md_compare.sql,sha256=ARYEcOlxWLxfw-KCKDeJRdCqnuCb9PVwGaHtITR2sYU,26535
144
- execsql2-2.34.0.data/data/execsql2_extras/md_glossary.sql,sha256=gu2PDTm295YvxR7cDp25Mf-xXHly0BvlMudoNOrep5Q,10931
145
- execsql2-2.34.0.data/data/execsql2_extras/md_upsert.sql,sha256=YNUTFS6yB4bZXs-wRDn6dN8jL5wIumzZyE2uo5arIos,113407
146
- execsql2-2.34.0.data/data/execsql2_extras/pg_compare.sql,sha256=WcupGxQoWtMwHVPuy42xCpP4gAV4Ttb1W-_hwh-3xb4,24529
147
- execsql2-2.34.0.data/data/execsql2_extras/pg_glossary.sql,sha256=CfQz2HZj2nMvJfYfQrAmNYdx0uRrOIWsCXwVo5gKv_k,9953
148
- execsql2-2.34.0.data/data/execsql2_extras/script_template.sql,sha256=s5i0HULxp49N2Cpd24iALleM_dBq5oLuN3Arx_4Z7-o,11140
149
- execsql2-2.34.0.data/data/execsql2_extras/ss_compare.sql,sha256=PpU-vPyqqC1faBoo5zwVZlZHYKkT79QZisWVlk4o-ss,26415
150
- execsql2-2.34.0.data/data/execsql2_extras/ss_glossary.sql,sha256=_oTiZHpadPXWrNs8VoRe9PZgX9XdK490NMVWVTVtjl4,13110
151
- execsql2-2.34.0.data/data/execsql2_extras/ss_upsert.sql,sha256=Dvst877h4KHn8ayYF9EXI_OxqLQ89wyfcnGYYT4szro,118304
152
- execsql2-2.34.0.dist-info/METADATA,sha256=-If95mpt8uHmRfovA0qRritNaIxwEIW6v3d71fcCAHE,26939
153
- execsql2-2.34.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
154
- execsql2-2.34.0.dist-info/entry_points.txt,sha256=jOf53-4IVGjEZeNYUOF1GGaiPNfVZcNKxP3vDFKEyMA,58
155
- execsql2-2.34.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
156
- execsql2-2.34.0.dist-info/licenses/NOTICE,sha256=McYzgxYav3U1OaVsY4Su1sfBrfmplpRdA9b6-gCDQCg,342
157
- execsql2-2.34.0.dist-info/RECORD,,
139
+ execsql2-2.35.0.data/data/execsql2_extras/README.md,sha256=6f5bWiBlKRn8s6GVrU423-HFrU1Jwbk2AabxraLu3AY,5398
140
+ execsql2-2.35.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
141
+ execsql2-2.35.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=2e8KzzVWhho8KxYVHETSVmZdhW7wodioDsqBLSL6m4s,7487
142
+ execsql2-2.35.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
143
+ execsql2-2.35.0.data/data/execsql2_extras/md_compare.sql,sha256=ARYEcOlxWLxfw-KCKDeJRdCqnuCb9PVwGaHtITR2sYU,26535
144
+ execsql2-2.35.0.data/data/execsql2_extras/md_glossary.sql,sha256=gu2PDTm295YvxR7cDp25Mf-xXHly0BvlMudoNOrep5Q,10931
145
+ execsql2-2.35.0.data/data/execsql2_extras/md_upsert.sql,sha256=YNUTFS6yB4bZXs-wRDn6dN8jL5wIumzZyE2uo5arIos,113407
146
+ execsql2-2.35.0.data/data/execsql2_extras/pg_compare.sql,sha256=WcupGxQoWtMwHVPuy42xCpP4gAV4Ttb1W-_hwh-3xb4,24529
147
+ execsql2-2.35.0.data/data/execsql2_extras/pg_glossary.sql,sha256=CfQz2HZj2nMvJfYfQrAmNYdx0uRrOIWsCXwVo5gKv_k,9953
148
+ execsql2-2.35.0.data/data/execsql2_extras/script_template.sql,sha256=s5i0HULxp49N2Cpd24iALleM_dBq5oLuN3Arx_4Z7-o,11140
149
+ execsql2-2.35.0.data/data/execsql2_extras/ss_compare.sql,sha256=PpU-vPyqqC1faBoo5zwVZlZHYKkT79QZisWVlk4o-ss,26415
150
+ execsql2-2.35.0.data/data/execsql2_extras/ss_glossary.sql,sha256=_oTiZHpadPXWrNs8VoRe9PZgX9XdK490NMVWVTVtjl4,13110
151
+ execsql2-2.35.0.data/data/execsql2_extras/ss_upsert.sql,sha256=Dvst877h4KHn8ayYF9EXI_OxqLQ89wyfcnGYYT4szro,118304
152
+ execsql2-2.35.0.dist-info/METADATA,sha256=w_11vJcNw1_5LNse5KT9rHS7IJDv3-Ng6dCGM7q0_Oo,26939
153
+ execsql2-2.35.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
154
+ execsql2-2.35.0.dist-info/entry_points.txt,sha256=jOf53-4IVGjEZeNYUOF1GGaiPNfVZcNKxP3vDFKEyMA,58
155
+ execsql2-2.35.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
156
+ execsql2-2.35.0.dist-info/licenses/NOTICE,sha256=McYzgxYav3U1OaVsY4Su1sfBrfmplpRdA9b6-gCDQCg,342
157
+ execsql2-2.35.0.dist-info/RECORD,,