jupyter-duckdb 1.2.0.5__py3-none-any.whl → 1.2.0.6__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.
@@ -4,6 +4,7 @@ import duckdb
4
4
 
5
5
  from ... import DatabaseError, Column, Constraint, ForeignKey, Table
6
6
  from ...Connection import Connection as Base
7
+ from ...error import EmptyResultError
7
8
 
8
9
 
9
10
  class Connection(Base):
@@ -36,7 +37,10 @@ class Connection(Base):
36
37
  raise e
37
38
 
38
39
  # get rows
39
- rows = cursor.fetchall()
40
+ try:
41
+ rows = cursor.fetchall()
42
+ except duckdb.InvalidInputException as e:
43
+ raise EmptyResultError(str(e))
40
44
 
41
45
  # get columns
42
46
  if cursor.description is None:
@@ -4,6 +4,7 @@ from typing import Dict, List, Tuple, Any
4
4
 
5
5
  from ... import DatabaseError, Column, Constraint, ForeignKey, Table
6
6
  from ...Connection import Connection as Base
7
+ from ...error import EmptyResultError
7
8
 
8
9
 
9
10
  class Connection(Base):
@@ -41,7 +42,7 @@ class Connection(Base):
41
42
 
42
43
  # get columns
43
44
  if cursor.description is None:
44
- columns = []
45
+ raise EmptyResultError()
45
46
  else:
46
47
  columns = [e[0] for e in cursor.description]
47
48
 
duckdb_kernel/kernel.py CHANGED
@@ -14,6 +14,7 @@ from .db.error import *
14
14
  from .magics import *
15
15
  from .parser import RAParser, DCParser, ParserError
16
16
  from .util.ResultSetComparator import ResultSetComparator
17
+ from .util.SQL import SQL_KEYWORDS
17
18
  from .util.TestError import TestError
18
19
  from .util.formatting import row_count, rows_table, wrap_image
19
20
  from .visualization import *
@@ -46,11 +47,12 @@ class DuckDBKernel(Kernel):
46
47
  MagicCommand('query_max_rows').arg('count').on(self._query_max_rows_magic),
47
48
  MagicCommand('schema').flag('td').opt('only').on(self._schema_magic),
48
49
  MagicCommand('store').arg('file').flag('noheader').result(True).on(self._store_magic),
49
- MagicCommand('ra').disable('dc', 'auto_parser').flag('analyze').code(True).on(self._ra_magic),
50
+ MagicCommand('sql').disable('ra', 'dc', 'auto_parser'),
51
+ MagicCommand('ra').disable('sql', 'dc', 'auto_parser').flag('analyze').code(True).on(self._ra_magic),
50
52
  MagicCommand('all_ra').arg('value', '1').on(self._all_ra_magic),
51
- MagicCommand('dc').disable('ra', 'auto_parser').code(True).on(self._dc_magic),
53
+ MagicCommand('dc').disable('sql', 'ra', 'auto_parser').code(True).on(self._dc_magic),
52
54
  MagicCommand('all_dc').arg('value', '1').on(self._all_dc_magic),
53
- MagicCommand('auto_parser').disable('ra', 'dc').code(True).on(self._auto_parser_magic),
55
+ MagicCommand('auto_parser').disable('sql', 'ra', 'dc').code(True).on(self._auto_parser_magic),
54
56
  MagicCommand('guess_parser').arg('value', '1').on(self._guess_parser_magic),
55
57
  )
56
58
 
@@ -301,6 +303,11 @@ class DuckDBKernel(Kernel):
301
303
  self.print(f'loaded tests from {with_tests}\n')
302
304
 
303
305
  def _test_magic(self, silent: bool, result_columns: List[str], result: List[List], name: str):
306
+ # If the query was empty, result_columns and result may be None.
307
+ if result_columns is None or result is None:
308
+ self.print_data(wrap_image(False, 'Statement did not return data.'))
309
+ return
310
+
304
311
  # Testing makes no sense if there is no output.
305
312
  if silent:
306
313
  return
@@ -550,14 +557,22 @@ class DuckDBKernel(Kernel):
550
557
  self._magics['auto_parser'].default(False)
551
558
 
552
559
  def _auto_parser_magic(self, silent: bool, code: str):
560
+ # do not handle statements starting with SQL keywords
561
+ first_word = code.strip().split(maxsplit=1)
562
+ if len(first_word) > 0:
563
+ if first_word[0].upper() in SQL_KEYWORDS:
564
+ return
565
+
566
+ # try to parse DC
553
567
  try:
554
- return self._ra_magic(silent, code, analyze=False)
568
+ return self._dc_magic(silent, code)
555
569
  except ParserError as e:
556
570
  if e.depth > 0:
557
571
  raise e
558
572
 
573
+ # try to parse RA
559
574
  try:
560
- return self._dc_magic(silent, code)
575
+ return self._ra_magic(silent, code, analyze=False)
561
576
  except ParserError as e:
562
577
  if e.depth > 0:
563
578
  raise e
@@ -0,0 +1,6 @@
1
+ # see https://www.postgresql.org/docs/current/sql-commands.html
2
+ SQL_KEYWORDS = ('ABORT', 'ALTER', 'ANALYZE', 'BEGIN', 'CALL', 'CHECKPOINT', 'CLOSE', 'CLUSTER', 'COMMENT', 'COMMIT',
3
+ 'COPY', 'CREATE', 'DEALLOCATE', 'DECLARE', 'DELETE', 'DISCARD', 'DO', 'DROP', 'END', 'EXECUTE',
4
+ 'EXPLAIN', 'FETCH', 'GRANT', 'IMPORT', 'INSERT', 'LISTEN', 'LOAD', 'LOCK', 'MERGE', 'MOVE', 'NOTIFY',
5
+ 'PREPARE', 'REASSIGN', 'REFRESH', 'REINDEX', 'RELEASE', 'RESET', 'REVOKE', 'ROLLBACK', 'SAVEPOINT',
6
+ 'SECURITY', 'SELECT', 'SET', 'SHOW', 'START', 'TRUNCATE', 'UNLISTEN', 'UPDATE', 'VACUUM', 'VALUES')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jupyter-duckdb
3
- Version: 1.2.0.5
3
+ Version: 1.2.0.6
4
4
  Summary: a basic wrapper kernel for DuckDB
5
5
  Home-page: https://github.com/erictroebs/jupyter-duckdb
6
6
  Author: Eric Tröbs
@@ -1,7 +1,7 @@
1
1
  duckdb_kernel/__init__.py,sha256=6auU6zeJrsA4fxPSr2PYamS8fG-SMXTn5YQFXF2cseo,33
2
2
  duckdb_kernel/__main__.py,sha256=Z3GwHEBWoQjNm2Y84ijnbA0Lk66L7nsFREuqhZ_ptk0,165
3
3
  duckdb_kernel/kernel.json,sha256=_7E8Ci2FSdCvnzCjsOaue8QE8AvpS5JLQuxORO5IGtA,127
4
- duckdb_kernel/kernel.py,sha256=4OFNtWvrfSs27udrk9e1ClBMdltvLA9gJemSBZskj0k,21827
4
+ duckdb_kernel/kernel.py,sha256=iiX9JzSgIvno1tWc2ZJGYHts8J3P7md4yanMrsbMJkY,22454
5
5
  duckdb_kernel/db/Column.py,sha256=GM5P6sFdlYK92hiKln5-6038gIDOTxh1AYbR4kiga_w,559
6
6
  duckdb_kernel/db/Connection.py,sha256=5pH-CwGh-r9Q2QwJKGSxvoINBU-sqmvZyG4Q1digfeE,599
7
7
  duckdb_kernel/db/Constraint.py,sha256=1YgUHk7s8mHCVedbcuJKyXDykj7_ybbwT3Dk9p2VMis,287
@@ -11,12 +11,12 @@ duckdb_kernel/db/Table.py,sha256=HfvGX54kD_XvmLApYSmxtTQNvz2YYaaUNpm4e8dSOVY,934
11
11
  duckdb_kernel/db/__init__.py,sha256=PKQYQDCW7VQYxmzhQK6A0Qloka9FdMfeFQMfY-CjBSA,198
12
12
  duckdb_kernel/db/error/EmptyResultError.py,sha256=N9Oxi2HDZBKaRQsfRsWpJJGOYX4BjdQqWOU-XvzUzNY,92
13
13
  duckdb_kernel/db/error/__init__.py,sha256=oHfhfbcfyTJ3pAPN835omdQcebvJTauuULFx5gm9rq4,47
14
- duckdb_kernel/db/implementation/duckdb/Connection.py,sha256=4zBgK9xYSV2m7tSl81kLOqGhByP7UhyCZxDuLVpZz7c,6817
14
+ duckdb_kernel/db/implementation/duckdb/Connection.py,sha256=uBL-UVrSo8EJNXnnyAc2AwAYJ1QQQmH0noV6pnngZHs,6977
15
15
  duckdb_kernel/db/implementation/duckdb/__init__.py,sha256=HKogB1es4wOiQUoh7_eT32xnUFLmzoCyR_0LuY9r8YQ,35
16
16
  duckdb_kernel/db/implementation/postgres/Connection.py,sha256=39wv-mvKHdu4u_ADFiSbAvGMVEs3FtuzRYIH4uzJ-pw,9307
17
17
  duckdb_kernel/db/implementation/postgres/__init__.py,sha256=HKogB1es4wOiQUoh7_eT32xnUFLmzoCyR_0LuY9r8YQ,35
18
18
  duckdb_kernel/db/implementation/postgres/util.py,sha256=4nr1mqXhlwkMVXbJSfJ7dRlUm6UskpvgKApe7GRwmBI,281
19
- duckdb_kernel/db/implementation/sqlite/Connection.py,sha256=L-aSUuN_7Z-hc5wczLjap2Xu-Vv6-dXmwXcN_WE8o98,6994
19
+ duckdb_kernel/db/implementation/sqlite/Connection.py,sha256=SSLpdigWjO_3lUXdsx3eH5OXOTBlZiXOgIyPCf6L8D0,7044
20
20
  duckdb_kernel/db/implementation/sqlite/__init__.py,sha256=HKogB1es4wOiQUoh7_eT32xnUFLmzoCyR_0LuY9r8YQ,35
21
21
  duckdb_kernel/magics/MagicCommand.py,sha256=l0EmnqgGZ0HyqQhdTljAaftflVo_RYp-U5UiDftYxAA,3180
22
22
  duckdb_kernel/magics/MagicCommandCallback.py,sha256=9XVidNtzs8Lwq_T59VrH89t5LUgJcc5C7grusElXVW4,1041
@@ -72,6 +72,7 @@ duckdb_kernel/parser/util/RenamableColumn.py,sha256=LxJhFDMUv_OxYYDLwKn63QGpBRfs
72
72
  duckdb_kernel/parser/util/RenamableColumnList.py,sha256=GfhdGv4KYT64Z9YA9TCn-7hhcEcc3Gu3vI2zMZ52w-8,3015
73
73
  duckdb_kernel/parser/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
74
  duckdb_kernel/util/ResultSetComparator.py,sha256=RZDIfjJyx8-eR-HIqQlEYgZd_V1ympbszpVRF4TlA7o,2262
75
+ duckdb_kernel/util/SQL.py,sha256=-uRfa0IwEQueZNZ7vkBPczLuvm_87y4_nnMBx3FgqNk,643
75
76
  duckdb_kernel/util/TestError.py,sha256=iwlGHr9j6pFDa2cGxqGyvJ-exrFUtPJjVm_OhHi4n3g,97
76
77
  duckdb_kernel/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
78
  duckdb_kernel/util/formatting.py,sha256=cbt0CtERnqtzd97mLrOjeJpqM2Lo6pW96BjAYqrOTD8,793
@@ -79,7 +80,7 @@ duckdb_kernel/visualization/Drawer.py,sha256=D0LkiGMvuJ2v6cQSg_axLTGaM4VXAJEQJAy
79
80
  duckdb_kernel/visualization/RATreeDrawer.py,sha256=j-Vy1zpYMzwZ3CsphyfPW-J7ou9a9tM6aXXgAlQTgDI,2128
80
81
  duckdb_kernel/visualization/SchemaDrawer.py,sha256=9K-TUUmyeGdMYMTFQJ7evIU3p8p2KyMKeizUc7-y8co,3015
81
82
  duckdb_kernel/visualization/__init__.py,sha256=5eMJmxJ01XAXcgWDn3t70eSZF2PGaXdNo6GK-x-0H3s,78
82
- jupyter_duckdb-1.2.0.5.dist-info/METADATA,sha256=7twgLgE-u5--Y9lV-JCtqPoUFSL8GAwdPyVcmu1NzjA,9115
83
- jupyter_duckdb-1.2.0.5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
84
- jupyter_duckdb-1.2.0.5.dist-info/top_level.txt,sha256=KvRRPMnmkQNuhyBsXoPmwyt26LRDp0O-0HN6u0Dm5jA,14
85
- jupyter_duckdb-1.2.0.5.dist-info/RECORD,,
83
+ jupyter_duckdb-1.2.0.6.dist-info/METADATA,sha256=CpGdT2u47HAdtsRNJpQJeQvQPIuBVXVLfYyybbrxQnY,9115
84
+ jupyter_duckdb-1.2.0.6.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
85
+ jupyter_duckdb-1.2.0.6.dist-info/top_level.txt,sha256=KvRRPMnmkQNuhyBsXoPmwyt26LRDp0O-0HN6u0Dm5jA,14
86
+ jupyter_duckdb-1.2.0.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5