Documento vivo (issue #194). Estado de cada funcionalidad de Squaero frente a
cada motor soportado. Los issues de verificación por motor (#195 MySQL, #196
SQLite, #197 Informix, #198 MongoDB) usan esta matriz como checklist y van
cambiando ⏳ → ✅/
| Estado | Significado |
|---|---|
| ✅ | Funciona (verificado en vivo) |
| Funciona con límites (ver nota) | |
| ➖ | No aplica al motor (razón honesta que muestra la UI) |
| ❌ | Roto (issue enlazado) |
| ⏳ | Sin verificar todavía |
Motores: SQLite (embebido), MySQL/MariaDB (motor de referencia), Informix
(ODBC, build x86), MongoDB (solo lectura: find/aggregate). PostgreSQL (libpq)
ya se distribuye (#22/#23, PR #275); su camino núcleo + funciones específicas del
motor están verificados en vivo por scripts/smoke/postgres-features.mjs (10/10
vs postgres:16, ver QA-SMOKE). Aún no tiene columna propia en
la matriz de abajo — las funciones a nivel UI (monitor, ER, builder, charts,
designer, etc.) faltan por recorrer en vivo; los usuarios/permisos no están
implementados para PG y slow-queries requiere la extensión pg_stat_statements.
SQL Server (FreeTDS db-lib, #49) llega con conexión, consultas, mapeo de
tipos, introspección, transacciones y cifrado, verificados en vivo en el build
x86 contra SQL Server 2022 (encrypt_option = TRUE con el cifrado por defecto,
16 tipos con su texto correcto, árbol, describe, rollback y paginación por
cursor). DDL, edición de filas y cancelación aún no están (DBC_ERR_UNSUPPORTED),
el cifrado no verifica el certificado del servidor, y strict (TDS 8) no se
pudo verificar: el contenedor de 2022 sin configurar corta la conexión.
| Funcionalidad | SQLite | MySQL/MariaDB | Informix | MongoDB |
|---|---|---|---|---|
| Conexión / desconexión / reconexión | ✅ | ✅ | ✅ 28 | ✅ |
| Conexión cifrada (SSL/TLS) | ➖ 36 | ✅ 37 | ✅ 38 | ✅ 39 |
| Árbol de objetos + carpetas por tipo | ✅ | |||
| Describe / estructura / DDL | ✅ | ✅ | ✅ 29 | |
| Ejecutar consulta | ✅ | ✅ | ✅ 28 | |
| Paginación real (offset) | ✅ | ✅ | ✅ 28 | ✅ |
| Edición transaccional (insert/update/delete + rollback) | ✅ | ✅ | ✅ 32 | ➖ 6 |
| Detalle de fila (form view) | ⏳ | ⏳ | ⏳ | |
| Export CSV / JSON / SQL / XML / HTML / XLSX | ✅ 8 | ✅ 8 | ✅ 8·35 | ⏳ 8 |
| Import CSV / JSON / XLSX | ⏳ | ⏳ | ⏳ | ➖ 6 |
| Generación de datos | ⏳ | ⏳ | ⏳ | ➖ 6 |
| Sort / filtro de grid | ⏳ 8 | ⏳ 8 | ⏳ 8 | ⏳ 8 |
| Historial / snippets / ejecutar selección | ⏳ 8 | ⏳ 8 | ⏳ 8 | ⏳ 8 |
| Monitor de servidor + kill | ➖ 9 | ✅ 33 | ➖ 10 | ➖ 11 |
| Usuarios / permisos (crear/eliminar/grant/revoke) | ➖ 12 | ✅ 33 | ➖ 13 | ➖ 14 |
| Procedimientos / funciones | ➖ 15 | ✅ 33 | ✅ 30 | ➖ 16 |
| Triggers | ✅ | ✅ 33 | ✅ 31 | ➖ 17 |
| Eventos programados | ➖ 18 | ✅ 33 | ➖ 19 | ➖ 17 |
| Diagrama ER | ||||
| Constructor visual de consultas | ⏳ | ⏳ | ⏳ | ➖ 21 |
| Charts / gráficos | ⏳ 8 | ⏳ 8 | ⏳ 8 | ⏳ 8 |
| Diseñador de tablas (CREATE) | ✅ | ⏳ | ⏳ | ➖ 6 |
| Diseñador de tablas (ALTER) | ⏳ | ⏳ | ➖ 6 | |
| Índices | ✅ | ⏳ | ⏳ | ➖ 23 |
| Constraints | ➖ 24 | ⏳ | ⏳ | ➖ 23 |
| Sincronización de esquema / datos | ⏳ | ⏳ | ⏳ | ➖ 6 |
| Transferencia de datos | ⏳ | ⏳ | ⏳ | |
| EXPLAIN (plan visual) | ✅ | ⏳ | ➖ 26 | ➖ 27 |
Las razones ➖ son las que la propia UI muestra (fuente: frontend/src/utils/*).
-
SQLite — carpetas por tipo: solo se ofrece la carpeta de Triggers; SQLite no tiene procedimientos/funciones/eventos.
-
Informix — carpetas por tipo: Procedimientos/Funciones/Triggers; sin eventos.
-
MongoDB — árbol: colecciones en lugar de tablas; sin carpetas de rutinas.
-
MongoDB — describe: los tipos/columnas se infieren muestreando ~200 documentos.
-
MongoDB — consulta: sintaxis mongosh (
db.coll.find({...}).sort().limit()), solofind/aggregate(lectura). -
MongoDB — escritura: «MongoDB es de solo lectura en Squaero (find/aggregate)» → edición, import, generación, diseñador, sync no aplican.
-
MongoDB — detalle de fila: disponible en modo lectura (sin editar).
-
Engine-agnóstico: funciona sobre el conjunto de resultados/cliente, igual en todos los motores; ⏳ hasta confirmarlo en vivo o por el smoke.
-
SQLite — monitor: «SQLite es una base de datos embebida: no tiene procesos de servidor.»
-
Informix — monitor: «Informix administra sesiones por CLI (onmode), no por SQL.»
-
MongoDB — monitor: «El monitor de procesos aún no está disponible para MongoDB.»
-
SQLite — usuarios: «SQLite no tiene usuarios ni permisos: es una base de datos embebida.»
-
Informix — usuarios: «La gestión de usuarios de Informix aún no está disponible aquí.»
-
MongoDB — usuarios: «La gestión de usuarios de MongoDB aún no está disponible aquí.»
-
SQLite — rutinas: «SQLite no tiene procedimientos ni funciones almacenadas…»
-
MongoDB — rutinas: «MongoDB no expone procedimientos almacenados en catálogos SQL.»
-
MongoDB — triggers/eventos: «MongoDB no expone triggers en catálogos SQL.»
-
SQLite — eventos: «SQLite no tiene eventos programados.»
-
Informix — eventos: «Los eventos programados de Informix no están disponibles aquí.»
-
Diagrama ER (#260): las relaciones se leen de las llaves foráneas reales del motor cuando las expone (MySQL
KEY_COLUMN_USAGE, PostgreSQLpg_constraint, SQLitePRAGMA foreign_key_list, Informixsysreferences); solo se cae a la inferencia por nombre (customer_id → customers) cuando el motor no tiene FKs (MongoDB) o la consulta falla, marcándolo en la UI. Verificado en vivo con SQLite y MySQL (columna FK sin convención → resuelta). -
MongoDB — constructor visual: genera SQL
SELECT; MongoDB usa mongosh. -
SQLite — ALTER: solo add/drop/rename de columnas; el cambio de tipo in-place da error honesto (SQLite no soporta
MODIFY COLUMN). -
MongoDB — índices/constraints: «MongoDB gestiona índices por comandos, no por catálogos SQL.» / «MongoDB no expone constraints en catálogos SQL.»
-
SQLite — constraints: el listado por catálogo no está disponible (viven en el texto del
CREATE TABLE). -
MongoDB — transferencia: válido como origen (lectura); no como destino (escritura).
-
Informix — EXPLAIN: Informix escribe el plan a archivo (
SET EXPLAIN), no vía SQL. -
MongoDB — EXPLAIN: usa la superficie
.explain(), noEXPLAINSQL. -
Informix — verificado en vivo (2026-07-08) contra un servidor Informix real (IBM Informix Dynamic Server 11.70.FC7, ~400 objetos) vía el
quaero-rpcx86 (el driver ODBC de Informix es 32-bit; ver [[quaero-x86-unified-build]]). Conexión, consulta con literales y paginación offset confirmados. -
Informix — describe: BUG encontrado y corregido en esta verificación (#197):
describe_tablereportaba TODAS las columnas comoCHARporque la aritméticacoltype - (coltype/256)*256asumía división entera, pero el/de Informix es no-truncante → colapsaba a 0. Cambiado aMOD(coltype,256); ahora devuelve el tipo real (SMALLINT/VARCHAR/DATETIME/DECIMAL…), verificado en vivo sobreabreviado_jo. -
Informix — procedimientos/funciones: listado y cuerpo (
sysprocbody, datakey 'T') verificados; las sobrecargas se resuelven porprocid(una rutina sobrecargada ×2 devuelve dos cuerpos distintos). -
Informix — triggers: listado (
systriggers) y cuerpo (systrigbody) portrigidverificados en vivo. -
Informix — edición transaccional: verificado en vivo (2026-07-08) sobre una tabla scratch dedicada (creada y eliminada al terminar, sin tocar datos de negocio): insert×2 + update + delete visibles dentro de la transacción,
ROLLBACKlos deshizo (→ 0 filas) yCOMMITpersiste (control positivo). Confirma que la base es logged y que el rollback real funciona a través del driver ODBC. El constructor de DML tiene además test unitario (informix_dml_test). -
MySQL — verificado en vivo (2026-07-08) contra MySQL 8.0.46 (contenedor efímero) vía
scripts/smoke/mysql-features.mjs, 10/10: utf8mb4 (acentos + emoji) en datos Y nombres de objetos, procedimientos+funciones (listado porinformation_schema.ROUTINES+SHOW CREATE), triggers, eventos programados, usuarios (CREATE/GRANT/SHOW GRANTS/REVOKE/DROP), monitorSHOW PROCESSLIST+KILLde una 2ª sesión, paginación offset sobre 12k filas, y edición transaccional con rollback real. -
MongoDB — verificado en vivo (2026-07-08) contra mongo:7 vía
scripts/smoke/mongo-features.mjs, 7/7 (solo lectura): árbol de colecciones, describe por muestreo (8 campos inferidos), find +aggregate, paginaciónskip+limit, y renderizado legible de tipos BSON especiales — ObjectId (hex de 24), ISODate, Decimal128, documentos anidados, arrays y emoji. Confirma que los límites⚠️ 3/4/5 son correctos (no fallos crípticos). -
Informix — export: el export es client-side (
exportResult, sin ramas por motor); verificado (2026-07-08) corriendo los exportadores reales sobre un resultado real de Informix — CSV/JSON/SQL/XML/HTML preservan acentos (café ñoño, ruta Latin-1→UTF-8) y los NULL. XLSX usa el mismo camino{columns,rows}→buildXlsx(con test unitario). Nota: el volcado SQL (toInserts) emite identificadores ANSI entre comillas dobles; para re-importar en Informix habría que activarDELIMIDENT(sin él, las comillas dobles son literales de cadena). El archivo se genera correctamente. -
SQLite — SSL/TLS: no aplica; es una base embebida, sin transporte de red.
-
MySQL — SSL/TLS: verificado en vivo en el build x86 que se distribuye (2026-09-13, #144), contra
mysql:8.4con OpenSSL 3.0.22 estático:required→TLS_AES_256_GCM_SHA384;verify_cacon la CA del servidor conecta y con otra CA se rechaza;verify_casinssl_case rechaza (el conector no verificaba nada sin CA). Si se pide TLS y la sesión no queda cifrada, la conexión falla. La verificación del 2026-07-08 había sido en x64: hasta #144 el x86 aceptabassl_mode=requiredy conectaba en claro. Campos DSNssl_mode/ssl_ca/ssl_cert/ssl_key(DBC_FEAT_SSL). PostgreSQL (sin columna propia):requireyverify-full→ TLSv1.3 verificados en el mismo build; una CA equivocada o un host que no coincide con el certificado se rechazan. -
Informix — SSL/TLS: verificado en vivo en el build x86 (2026-09-13, #144) contra Informix 15.0.1 con un listener
onsocssl(keystore GSKit del servidor +SSL_KEYSTORE_LABEL). El DSN usaprotocol=onsocssl, con su propio selector en el formulario. El cliente verifica el certificado con el keystore que nombraetc\conssl.cfgdel Client SDK:- con el certificado del servidor en ese keystore, conecta y consulta;
- con un keystore que no confía en él → GSK_ERROR_BAD_CERT;
- sin
conssl.cfg→ GSK_KEYRING_OPEN_ERROR; onsoctcpcontra el listener TLS → Invalid message received.
El keystore es configuración de la máquina, no un campo del DSN.
-
MongoDB — SSL/TLS: verificado en vivo en el build x86 (2026-09-13, #144) contra
mongo:6.0conrequireTLS: sintlsel servidor corta la conexión; contls=trueel certificado se verifica contra las CA de confianza de Windows (una CA propia sin instalar → Untrusted root certificate); con la verificación desactivada en la URI la sesión cifrada funciona (Secure Channel).DBC_FEAT_SSLanunciado.tlsCAFilese rechaza en Windows: Secure Channel no la usa en memoria, la instala en el almacénLOCAL_MACHINE\Root, con lo que toda la máquina pasaría a confiar en esa CA. Una CA privada se instala a propósito en el almacén de Windows.
El smoke reproducible (scripts/smoke/) cubre el camino crítico por motor:
conectar → árbol → describe → SELECT paginado → insert/update/delete
transaccional → export CSV → desconectar. Filas cubiertas: Conexión, Árbol,
Describe, Ejecutar consulta, Paginación, Edición transaccional, Export.
| Motor | Smoke | Notas |
|---|---|---|
| SQLite | ✅ 12/12 + 9/9 features | smoke.mjs (camino crítico) + sqlite-features.mjs (2026-07-07) |
| MySQL/MariaDB | ✅ 12/12 + 10/10 features | smoke.mjs + mysql-features.mjs vs MySQL 8.0.46 (2026-07-08) |
| Informix | ✅ en vivo | vs un servidor IBM IDS 11.70 real, quaero-rpc x86 (2026-07-08) — lectura + edición transaccional (tabla scratch); encontró+corrigió el bug de tipos del describe |
| MongoDB | ✅ 4/4 + 7/7 features | smoke.mjs + mongo-features.mjs vs mongo:7 (2026-07-08) |
Ver QA-SMOKE.md para correrlo. Las filas ✅ de SQLite y MySQL/MariaDB arriba (conexión, árbol, describe, consulta, paginación, edición transaccional, export) están verificadas por el smoke del camino crítico.
SQLite feature-smoke (scripts/smoke/sqlite-features.mjs, #196) verifica en
vivo contra el core real, sin contenedor: path con espacios/acentos, diseñador
CREATE con tipos variados + describe (PK), unicode (acentos+emoji) en datos Y en
nombres de objetos, vistas (árbol + DDL), triggers (listado + DDL inline),
índices (pragma_index_list/info, como la app), EXPLAIN QUERY PLAN, FKs reales
por PRAGMA foreign_key_list, y archivo de solo lectura (lectura OK, escritura
con error honesto). Esas filas de la columna SQLite pasan a ✅.
Última actualización: 2026-07-08 — los 4 motores verificados en vivo:
#196 SQLite (sqlite-features.mjs), #195 MySQL 8.0.46 (mysql-features.mjs),
#197 Informix IDS 11.70 solo-lectura (+ bug de tipos del describe corregido),
#198 MongoDB mongo:7 (mongo-features.mjs).