Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

### Bug Fixes

- Display SQLite BLOB values as decoded hex strings in query results.
- Expand `~` in configured log file paths before opening the log.

### Internal
Expand Down
12 changes: 11 additions & 1 deletion litecli/sqlexecute.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,16 @@
# })


def _decode_blob(value: Any) -> Any:
if isinstance(value, bytes):
return value.hex().upper()
return value


def _decode_blobs(row: tuple) -> tuple:
return tuple(_decode_blob(value) for value in row)


class SQLExecute(object):
databases_query = """
PRAGMA database_list
Expand Down Expand Up @@ -163,7 +173,7 @@ def get_result(self, cursor: Any) -> tuple[str | None, list | None, list | None,
if cursor.description is not None:
headers = [x[0] for x in cursor.description]
status = "{count} row{s} in set"
cursor = list(cursor)
cursor = [_decode_blobs(row) for row in cursor]
rowcount = len(cursor)
else:
_logger.debug("No rows in result.")
Expand Down
9 changes: 9 additions & 0 deletions tests/test_sqlexecute.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,15 @@ def test_binary(executor):
assert_result_equal(results, headers=["blb"], rows=[(expected,)])


@dbtest
def test_blob_returns_hex(executor):
run(executor, """create table foo(blb BLOB NOT NULL)""")
run(executor, """INSERT INTO foo VALUES (x'0101C30A')""")
results = run(executor, """select * from foo""")

assert_result_equal(results, headers=["blb"], rows=[("0101C30A",)])


@dbtest
def test_table_and_columns_query(executor):
run(executor, "create table a(x text, y text)")
Expand Down
Loading