# Database Fingerprinting Patterns
# Patterns to identify database type from error messages

## MySQL

### Error Messages
"You have an error in your SQL syntax"
"check the manual that corresponds to your MySQL server version"
"MySqlException"
"mysql_fetch_array()"
"mysql_num_rows()"
"Warning: mysql_"
"SQL syntax.*MySQL"
"Function 'mysql_.*' does not exist"
"Table '.*' doesn't exist"
"Unknown column '.*' in 'field list'"
"Connection refused"
"Can't connect to MySQL server on"
"MySQL server version for the right syntax to use near"

### Syntax Characteristics
-- Uses ` for comments (not #)
-- Uses ` (backtick) for table/column names
-- Uses LIMIT without OFF
-- Supports AUTO_INCREMENT
-- Functions: CONCAT(), GROUP_CONCAT(), NOW(), CURDATE()

## PostgreSQL

### Error Messages
"PostgreSQL.*ERROR"
"ERROR:\s*syntax.*PostgreSQL"
"Warning.*pg_"
"invalid input syntax for type"
"column \"[^\"]+\" does not exist"
"relation \"[^\"]+\" does not exist"
"ERROR:  syntax error at"
"ERROR:  column.*does not exist"
"SELECT \* FROM EXIST"
"parse error at or near"

### Syntax Characteristics
-- Uses -- for single-line comments
-- Uses /* */ for multi-line comments
-- Uses " for identifiers
-- Uses LIMIT ... OFFSET
-- Functions: current_database(), current_user(), pg_sleep()

## SQL Server (MSSQL)

### Error Messages
"Microsoft OLE DB Provider for SQL Server"
"Unclosed quotation mark after the character string"
"'ODBC SQL Server Driver"
"SQLServer JDBC Driver"
"Invalid column name"
"Warning.*mssql_"
"SqlException"
"System.Data.SqlClient.SqlException"
"incorrect syntax near"
"Could not find stored procedure"

### Syntax Characteristics
-- Uses -- for comments
-- Uses [ ] for identifiers
-- Uses TOP instead of LIMIT
-- Uses @@ for variables
-- Functions: @@version, DB_NAME(), @@servername

## Oracle

### Error Messages
"ORA-\d{5}"
"Oracle error"
"Oracle JDBC"
"java.sql.SQLException"
"Query or PL/SQL error"
"ORA-01756: quoted string not properly terminated"
"ORA-00933: SQL command not properly ended"
"PL/SQL: ORA-00900"

### Syntax Characteristics
-- Uses -- for comments
-- Uses " for string literals
-- Uses :(colon) for bind variables
-- Functions: SYSDATE(), USER(), SYS_CONTEXT()
-- Uses FROM dual for single-row queries

## SQLite

### Error Messages
"SQLiteException"
"sqlite3.OperationalError"
"database is locked"
"no such table"
"sqlite3.OperationalError: no such table"
"SQLITE_ERROR: no such table"
"database disk image is malformed"
"attempt to write a readonly database"

### Syntax Characteristics
-- Uses -- for comments
-- Uses " for strings (mostly)
-- Uses .sqlite_master for metadata
-- No stored procedures
-- LIMIT syntax without OFFSET (by default)

## MariaDB

### Error Messages
"check the manual that corresponds to your MariaDB server version"
"MariaDB"
"Aurora"
"MariaDB server version"
"SQL syntax.*MariaDB"
"Connector/MariaDB"

## MongoDB (NoSQL)

### Error Patterns
"MongoDB.*Error"
"MongoException"
"E11000"
"E11000 duplicate key error"
"BSONDecodeError"
"DocumentNotFound"

## Generic Database Indicators

### Common Headers
"X-Powered-By: PHP"
"X-Powered-By: ASP.NET"
"X-Powered-By: Express"
"X-Powered-By: JSP"
"X-AspNet-Version"
"Server: cloudflare"
"Server: AWS"

### Framework Indicators
"Drupal.settings"
"laravel_session"
"csrfmiddlewaretoken"
"JSESSIONID"
"PHPSESSID"
"cf-cache-status"
"X-AspNet-Version"

## Framework-Specific Patterns

### WordPress
/wp-admin/
/wp-login.php
/wp-json/
/includes/
"wp-content"

### Drupal
/drupal
/sites/all/
/modules/
/includes/
"Drupal.settings"

### Laravel
/laravel
/storage/
/bootstrap/
"Laravel"

### Django
"/admin/"
"/user/login"
"csrftoken"
"django"

### Rails
"rails"
"Ruby on Rails"
"actionpack"
"activerecord"
"session_id"

## Quick Fingerprinting Queries

```sql
-- MySQL
SELECT @@version
SELECT DATABASE()
SELECT USER()

-- PostgreSQL
SELECT version()
SELECT current_database()
SELECT current_user()

-- SQL Server
SELECT @@version
SELECT DB_NAME()
SELECT @@servername

-- Oracle
SELECT banner FROM v$version
SELECT user FROM dual
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM dual

-- SQLite
SELECT sqlite_version()
SELECT name FROM sqlite_master WHERE type='table'
```
