Ver exactamente qué bloquea Vetro y por qué.

Ejemplos reales de queries generadas por agentes de IA. Para cada una: el AST infractor, la regla activada, y la versión segura sugerida.

Estos son ejemplos reales de queries que agentes de IA (LangChain, Vercel AI SDK, OpenAI function calling, MCP servers, etc.) generan al conectarse a bases de datos en producción. Hemos anonimizado los nombres de tablas pero el patrón de cada query es idéntico al original.

DELETE queries

DELETE masivo sin condición

BLOQUEADA
DELETE FROM users;
Nodo AST infractor DeleteStmt > WhereClause = NULL
Regla VETRO-001 CRITICAL
Query segura sugerida
DELETE FROM users WHERE id = $1;

DELETE en CTE sin WHERE

BLOQUEADA
WITH old_orders AS (
  DELETE FROM orders
  RETURNING id
)
SELECT COUNT(*) FROM old_orders;
Nodo AST infractor WithClause > DeleteStmt > WhereClause = NULL
Regla VETRO-001 CRITICAL
Query segura sugerida
WITH old_orders AS (
  DELETE FROM orders
  WHERE created_at < NOW() - INTERVAL '90 days'
  RETURNING id
)
SELECT COUNT(*) FROM old_orders;

DELETE con WHERE siempre verdadero

BLOQUEADA
DELETE FROM products WHERE 1=1;
Nodo AST infractor DeleteStmt > WhereClause > BoolExpr = ALWAYS_TRUE
Regla VETRO-003 CRITICAL
Query segura sugerida
DELETE FROM products WHERE id = $1;

DELETE con subquery sin predicado externo

BLOQUEADA
DELETE FROM logs
WHERE id IN (SELECT id FROM logs);
Nodo AST infractor DeleteStmt > WhereClause > SubLink — sin predicado adicional
Regla VETRO-033 HIGH
Query segura sugerida
DELETE FROM logs
WHERE id IN (
  SELECT id FROM logs
  WHERE created_at < NOW() - INTERVAL '30 days'
);

UPDATE queries

UPDATE de rol a todos los usuarios

BLOQUEADA
UPDATE users SET role = 'admin';
Nodo AST infractor UpdateStmt > WhereClause = NULL
Regla VETRO-042 CRITICAL
Query segura sugerida
UPDATE users SET role = 'admin' WHERE id = $1;

UPDATE de precio a cero en todo el catálogo

BLOQUEADA
UPDATE products SET price = 0;
Nodo AST infractor UpdateStmt > WhereClause = NULL
Regla VETRO-042 CRITICAL
Query segura sugerida
UPDATE products SET price = $1 WHERE id = $2;

UPDATE masivo de estado en CTE sin WHERE

BLOQUEADA
WITH affected AS (
  UPDATE orders SET status = 'cancelled'
  RETURNING id
)
SELECT id FROM affected;
Nodo AST infractor WithClause > UpdateStmt > WhereClause = NULL
Regla VETRO-031 HIGH
Query segura sugerida
WITH affected AS (
  UPDATE orders SET status = 'cancelled'
  WHERE status = 'pending' AND created_at < NOW() - INTERVAL '7 days'
  RETURNING id
)
SELECT id FROM affected;

DROP queries

DROP TABLE en producción

BLOQUEADA
DROP TABLE users;
Nodo AST infractor DropStmt (nodo presente)
Regla VETRO-010 CRITICAL
Query segura sugerida
-- Usar migración versionada con herramienta de migración
-- (Flyway, Liquibase, Prisma Migrate, Alembic, Rails migrations)
-- Nunca ejecutar DROP TABLE directamente desde un agente

DROP DATABASE de producción

BLOQUEADA
DROP DATABASE production;
Nodo AST infractor DropStmt (nodo presente, object_type = DATABASE)
Regla VETRO-010 CRITICAL
Query segura sugerida
-- Las operaciones a nivel de DATABASE nunca deben ejecutarse
-- desde agentes de IA. Requieren intervención humana con acceso
-- administrativo explícito y autorización documentada.

TRUNCATE queries

TRUNCATE en tabla de órdenes

BLOQUEADA
TRUNCATE TABLE orders;
Nodo AST infractor TruncateStmt (nodo presente)
Regla VETRO-011 CRITICAL
Query segura sugerida
DELETE FROM orders
WHERE created_at < NOW() - INTERVAL '90 days';

TRUNCATE con CASCADE

BLOQUEADA
TRUNCATE TABLE users CASCADE;
Nodo AST infractor TruncateStmt (nodo presente, restart_seqs = true)
Regla VETRO-011 CRITICAL
Query segura sugerida
DELETE FROM users WHERE created_at < $1
AND NOT EXISTS (
  SELECT 1 FROM subscriptions
  WHERE subscriptions.user_id = users.id
    AND subscriptions.status = 'active'
);

Queries seguras permitidas

Vetro no bloquea queries legítimas. Cualquier operación que incluya predicados específicos y no presente patrones de destrucción masiva pasa sin modificación. La latencia añadida es inferior a 2ms p99.

DELETE con WHERE específico

PERMITIDA
DELETE FROM users WHERE id = $1;
Nodo AST DeleteStmt > WhereClause > ColumnRef (id)
Resultado PASS

UPDATE con WHERE específico

PERMITIDA
UPDATE users SET name = $1 WHERE id = $2;
Nodo AST UpdateStmt > WhereClause > ColumnRef (id)
Resultado PASS

SELECT con filtro temporal

PERMITIDA
SELECT * FROM orders
WHERE created_at > NOW() - INTERVAL '7 days';
Nodo AST SelectStmt > WhereClause > A_Expr (temporal)
Resultado PASS

INSERT con columnas explícitas

PERMITIDA
INSERT INTO events (user_id, action) VALUES ($1, $2);
Nodo AST InsertStmt > Cols = [user_id, action]
Resultado PASS

Casos edge

Algunos patrones merecen explicación adicional porque el comportamiento de Vetro puede no ser intuitivo a primera vista.

WHERE 1=1 — siempre verdadero

BLOQUEADA
DELETE FROM temp_table WHERE 1=1;
Nodo AST infractor DeleteStmt > WhereClause > Integer(1) = Integer(1)
Regla VETRO-003 CRITICAL
Por qué está bloqueada

Un WHERE con condición siempre verdadera (1=1, true, 'a'='a') es semánticamente equivalente a no tener WHERE. El AST lo detecta evaluando si el predicado puede ser false para algún valor. Si no puede, el engine lo trata como ausente.

DELETE con LIMIT en MySQL

PERMITIDA
DELETE FROM mysql_table LIMIT 10;
Nodo AST DeleteStmt > LimitCount = 10 (MySQL)
Resultado PASS — MySQL solamente
Por qué está permitida

En MySQL y SQLite, DELETE ... LIMIT N es una extensión del estándar SQL que acota el número de filas eliminadas. Un LIMIT con valor > 0 previene la eliminación masiva, por lo que Vetro lo considera un predicado efectivo. Esta excepción no aplica a Postgres ni Snowflake, donde DELETE LIMIT no es sintaxis válida.

DELETE en CTE con WHERE válido

PERMITIDA
WITH deleted AS (
  DELETE FROM sessions
  WHERE expired_at < NOW()
  RETURNING id
)
SELECT COUNT(*) FROM deleted;
Nodo AST WithClause > DeleteStmt > WhereClause > A_Expr (temporal)
Resultado PASS
Por qué está permitida

El DELETE dentro del CTE incluye una cláusula WHERE con un predicado temporal real (expired_at < NOW()). El engine evalúa la presencia y validez del WHERE dentro del CTE exactamente igual que en un DELETE standalone.