Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add structured SQL error reporting with rich context - #53

Merged
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting
Feb 21, 2026
Merged

Add structured SQL error reporting with rich context#53
muk2 merged 2 commits into
mainfrom
feature/issue-44-error-reporting

Conversation

@muk2

@muk2muk2 commented Feb 20, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces generic Option<String> error field with StructuredError type that extracts rich information from PostgreSQL DbError responses
  • Categorizes errors into Syntax, Semantic, Execution, Transaction, Connection types based on SQLSTATE codes
  • Computes line/column numbers from PostgreSQL's byte-position error offset
  • Renders color-coded, multi-line error display in results panel with category labels, SQLSTATE codes, detail, hints, and object context

Implementation Details

src/db/query.rs

  • Added ErrorCategory enum with Syntax, Semantic, Execution, Transaction, Connection, Unknown variants
  • Added StructuredError struct with fields: category, severity, code, message, detail, hint, position, line, col, schema, table, column, constraint, where_
  • Added from_pg_error() to extract rich info from tokio_postgres::Error via as_db_error() API
  • Added byte_offset_to_line_col() to convert PostgreSQL's 1-based byte position to (line, column)
  • Added categorize_sqlstate() mapping SQLSTATE class codes to error categories
  • Changed QueryResult.error from Option<String> to Option<StructuredError>
  • 5 new unit tests for structured error types, display, position conversion, and SQLSTATE categorization

src/ui/components.rs

  • Added draw_structured_error() function rendering rich error display with:
    • Color-coded category header (red for syntax/execution, yellow for semantic/transaction)
    • SQLSTATE code badge
    • Line/column position info highlighted in accent color
    • Detail and Hint sections with bold labels
    • Schema/table/column object context
    • Constraint name
    • PL/pgSQL call stack context
  • Results panel title now shows specific error category instead of generic "ERROR"

src/ui/app.rs

  • Status bar error messages now show category label (e.g., "Syntax Error: ...")

Error Category Mapping

SQLSTATE ClassCategoryExample
42601Syntax Errorsyntax_error
42P01, 42703Semantic Errorundefined_table, undefined_column
22, 23Execution Errordivision_by_zero, constraint_violation
25, 40Transaction Errortransaction_aborted
08Connection Errorconnection_exception

Test plan

  • cargo build compiles without warnings
  • cargo test - all 230 tests pass
  • Manual: Execute invalid SQL and verify structured error with line/column
  • Manual: Reference non-existent table and verify "Semantic Error" category
  • Manual: Trigger constraint violation and verify "Execution Error" with constraint name
  • Manual: Verify hints are displayed when PostgreSQL provides them

Closes#44

🤖 Generated with Claude Code

muk2and others added 2 commits February 20, 2026 15:10
…hints
Replaces generic string errors with StructuredError type that extracts
rich information from PostgreSQL error responses: error category
(syntax/semantic/execution/transaction/connection), SQLSTATE code,
line and column numbers from byte position, detail, hint, schema/table/
column/constraint context, and PL/pgSQL call stack. The results panel
now renders errors with color-coded categories, position info, and
contextual hints instead of plain text.
Closes#44
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run cargo fmt for consistent code formatting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@muk2
muk2 merged commit 343f1cc into mainFeb 21, 2026
9 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug / Feature: Proper SQL Syntax Error Reporting Instead of Generic "DB Error"

1 participant

@muk2