From b4a257aee8defdef220930ed40d4cab7b33f3471 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sevban=20D=C3=B6nmez?=
<82449360+byjanke@users.noreply.github.com>
Date: Wed, 2 Sep 2026 00:34:33 +0300
Subject: [PATCH] feat(errors): add error fingerprints for CockroachDB,
YugabyteDB, DuckDB, Trino, OpenGauss, Doris, StarRocks
---
data/xml/errors.xml | 19 +++++++++
tests/test_html_parser_forks.py | 71 +++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+)
create mode 100644 tests/test_html_parser_forks.py
diff --git a/data/xml/errors.xml b/data/xml/errors.xml
index cb990d29327..95f4d35169d 100644
--- a/data/xml/errors.xml
+++ b/data/xml/errors.xml
@@ -21,9 +21,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -118,6 +131,10 @@
+
+
+
+
@@ -208,6 +225,8 @@
+
+
diff --git a/tests/test_html_parser_forks.py b/tests/test_html_parser_forks.py
new file mode 100644
index 00000000000..335047aaedf
--- /dev/null
+++ b/tests/test_html_parser_forks.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+"""
+Copyright (c) 2006-2026 sqlmap developers (https://sqlmap.org)
+See the file 'LICENSE' for copying permission
+"""
+
+import os
+import sys
+import unittest
+
+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+from _testutils import bootstrap
+bootstrap()
+
+from lib.core.data import kb
+from lib.core.enums import DBMS
+from lib.core.enums import FORK
+from lib.parse.html import htmlParser
+
+
+class TestHtmlParserForks(unittest.TestCase):
+ def setUp(self):
+ kb.forkNote = None
+ kb.cache.parsedDbms.clear()
+
+ def test_cockroachdb_error_fingerprint(self):
+ page = "ERROR: at or near \"SELECT\": syntax error in CockroachDB pgwire/pgerror"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.PGSQL)
+ self.assertEqual(kb.forkNote, FORK.COCKROACHDB)
+
+ def test_yugabytedb_error_fingerprint(self):
+ page = "YugabyteDB ERROR: check the manual that corresponds to your YugabyteDB server version"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.PGSQL)
+ self.assertEqual(kb.forkNote, FORK.YUGABYTEDB)
+
+ def test_opengauss_error_fingerprint(self):
+ page = "openGauss ERROR: org.opengauss.util.PSQLException: syntax error"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.PGSQL)
+ self.assertEqual(kb.forkNote, FORK.OPENGAUSS)
+
+ def test_duckdb_error_fingerprint(self):
+ page = "org.duckdb.DuckDBException: duckdb.duckdb.ParserException: syntax error"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.SQLITE)
+ self.assertEqual(kb.forkNote, FORK.DUCKDB)
+
+ def test_trino_error_fingerprint(self):
+ page = "io.trino.jdbc.TrinoSQLException: line 1:1: mismatched input 'SELECT'"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.PRESTO)
+ self.assertEqual(kb.forkNote, FORK.TRINO)
+
+ def test_doris_error_fingerprint(self):
+ page = "check the manual that corresponds to your Apache Doris server version with org.apache.doris.qm"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.MYSQL)
+ self.assertEqual(kb.forkNote, FORK.DORIS)
+
+ def test_starrocks_error_fingerprint(self):
+ page = "check the manual that corresponds to your StarRocks server version with com.starrocks.sql"
+ dbms = htmlParser(page)
+ self.assertEqual(dbms, DBMS.MYSQL)
+ self.assertEqual(kb.forkNote, FORK.STARROCKS)
+
+
+if __name__ == "__main__":
+ unittest.main()