Ir al contenido
learn

Diario

  • Misión y un plan de 13 lecciones
  • Código: scripts SQL ejecutados por psql, programas C# y Java, todos comparados con su salida esperada por check.sh
  • CI: postgresql-aurora-examples.yml lo ejecuta todo contra PostgreSQL en Linux y compila los programas en Windows y macOS; primer paso en verde el 2026-09-16
  • Lección 1: un contenedor, psql, bases de datos, esquemas y roles
  • Lección 2: tipos y modelado
  • Lección 3: CTE, ventanas, LATERAL, upserts y MERGE
  • Lección 4: PostgreSQL desde C# y Java
  • Lección 5: índices y planes
  • Lección 6: transacciones y MVCC
  • Lección 7: JSON y búsqueda
  • Lección 8: funciones, extensiones y pgvector
  • Lección 9: particionado
  • Lección 10: replicación, en tres clústeres dentro del contenedor del curso
  • Lección 11: copias de seguridad, recuperación a un momento dado y pg_upgrade
  • Lección 12: Aurora, según la documentación, y una conmutación por error desde C# y Java
  • Lección 13: migrar desde SQL Server, a mano, con un programa y con pgloader; DMS, Babelfish y los costes según la documentación
  • El curso está completo
  • Todo lo relativo a AWS: cada sección de Aurora sigue por verificar

PostgreSQL 18.6 en un contenedor, Npgsql 10.0.3, pgjdbc 42.7.13, pgvector 0.8.6, pgloader compilado desde las fuentes, y SQL Server 2025 para la migración. La mayoría de las filas son un driver, una herramienta o un valor por defecto que hace algo distinto de lo que dicen la documentación o el otro driver; dos tratan de GuitarAlchemist/ga y de la propia documentación de AWS. Nada se ha reportado aguas arriba.

No hay tabla de experimentos. El diario no registra ninguna hipótesis antes de sus mediciones: las cinco reconstrucciones del índice HNSW, el umbral del objetivo de estadísticas y los tiempos de los drivers son mediciones cuya explicación se escribió después del número, y convertirlas ahora en experimentos sería inventar el supuesto al revés.

Esperado Lo que pasa Dónde Medición Estado
CREATE FUNCTION … BEGIN ATOMIC …; END es un solo comando, ya que sus puntos y coma están dentro del cuerpo Npgsql corta el texto del comando en el punto y coma del cuerpo, como entre dos sentencias, y el servidor rechaza el comando truncado Npgsql 10.0.3, NpgsqlCommand sin parámetros 42601: syntax error at end of input. Funciona en un NpgsqlBatch, con Npgsql.EnableSqlRewriting desactivado, o con parámetros posicionales. pgjdbc 42.7.13 reconoce BEGIN ATOMIC y no corta Reproducido, no reportado 2026-09-16
pgloader migra una columna money de SQL Server sin perder dígitos, o avisa Conserva dos decimales, en silencio: lee money con convert(varchar(40), [col], 0), y el estilo 0 trunca pgloader construido desde 231ab86, mssql-schema.lisp, líneas 212-217 0.0125 pasó a 0.01, sin error ni aviso. La misma ejecución perdió la restricción CHECK y convirtió INCLUDE (Conclusion) en una columna de clave Reproducido, no reportado 2026-09-16
Target Session Attributes=standby se acepta con un solo host, como pgjdbc acepta targetServerType=secondary Npgsql rechaza la cadena de conexión de entrada; pgjdbc la acepta y falla más tarde, al conectar Npgsql 10.0.3, pgjdbc 42.7.13 NotSupportedException: Target Session Attributes other then Any is only supported with multiple hosts Por diseño en ambos, de forma distinta 2026-09-15
PowerShell pasa -Duser.timezone=Asia/Tokyo a java como un solo argumento PowerShell 7.6 lo sigue cortando en el punto PowerShell 7.6 Could not find or load main class .timezone=Asia.Tokyo Reproducido; entre comillas, funciona 2026-09-15
Un DateTime de tipo no especificado da las mismas filas sea cual sea la zona horaria de la sesión No lanza excepción, como se esperaba, pero se envía como timestamp y se convierte en la zona horaria de la sesión Npgsql 10.0.3 82 ejecuciones o 59, según Timezone. Un DateTimeOffset con un desfase de −4 horas sí lanza ArgumentException Por diseño 2026-09-15
SET statement_timeout = '2s' termina un INSERT que espera a un standby síncrono detenido La espera no se interrumpe; la sentencia queda bloqueada hasta que se cancela desde fuera PostgreSQL 18.6, replicación síncrona entre los clústeres del contenedor del curso Diez minutos, hasta pg_cancel_backend; el aviso dice que la transacción “has already committed locally” Por diseño: la confirmación ya es local y solo queda la espera. El script cancela ahora la espera desde otra sesión 2026-09-16
pg_rewind rebobina el antiguo primario degradado contra el nuevo El antiguo primario ya había reciclado el segmento de WAL que pg_rewind necesita pg_rewind 18, el node1 del contenedor del curso could not open file "node1/pg_wal/000000010000000000000002" Reproducido; wal_keep_size = 128MB conserva el segmento 2026-09-16
pg_upgrade --check de un clúster 17 por defecto a un clúster 18 por defecto pasa initdb 18 activa las sumas de comprobación por defecto, así que los dos valores por defecto ya no coinciden pg_upgrade 18, initdb 18 Se detuvo en “old cluster does not use data checksums but the new one does” Por diseño, valor por defecto cambiado; --no-data-checksums en el clúster nuevo 2026-09-16
Un índice GIN jsonb_path_ops es más pequeño que uno jsonb_ops, como la documentación dice que es lo habitual Con estos documentos es algo más grande PostgreSQL 18.6, los documentos de CI copiados 1.752 kB para jsonb_path_ops frente a 1.688 kB para jsonb_ops Reproducido; «lo habitual» no es «siempre» 2026-09-16
Una búsqueda de vecinos más cercanos con filtro devuelve las diez filas pedidas El recorrido HNSW reúne sus candidatos antes del filtro, ninguno lo pasa, y la consulta no devuelve nada pgvector 0.8.6, enable_seqscan = off Ninguna fila donde se pedían diez: 40 candidatos, ninguno es una tríada. Reconstruir el índice cinco veces dio las mismas 40 distancias cada vez Por diseño; hnsw.iterative_scan = strict_order devuelve las diez, y la lección lo activa 2026-09-16
Un script ejecutado con sqlcmd -i imprime lo mismo que las mismas sentencias con -Q Con -i, todo resultado que sigue a un error no capturado desaparece, cuando el error es la primera sentencia de un lote que sigue a un lote con resultados sqlcmd 18.6 contra SQL Server 2025 CU9 -Q imprimía los resultados; -i los perdía Reproducido, no reportado; los scripts capturan sus errores con TRY … CATCH 2026-09-16
Microsoft.Data.SqlClient abre una conexión desde el proyecto C# del curso Se niega, porque el proyecto activa InvariantGlobalization Microsoft.Data.SqlClient 7.0.3, OpenAsync Globalization Invariant Mode is not supported. Por diseño; el programa de migración tiene su propio proyecto 2026-09-16
Un convertidor que une una lista en una cadena relee todos los elementos guardados StringSplitOptions.RemoveEmptyEntries al releer elimina un nombre alternativo vacío GuitarAlchemist/ga, los convertidores de valores de MusicalKnowledgeDbContext.cs, en tres copias Tres nombres guardados, dos releídos Corregido upstream por #734, fusionada el 2026-09-24, en las tres copias 2026-09-15, 2026-09-24
Las páginas de AWS coinciden en una fecha de fin de vida Dos guías dan dos fechas, y también discrepan sobre un modo por defecto la guía de CloudWatch y el historial de la guía de usuario de Aurora Performance Insights termina el 31 de julio de 2026 en una y el 30 de noviembre de 2025 en la otra; Database Insights está en modo Standard por defecto en una y Advanced en la otra Reproducido en la documentación; no reportado 2026-09-16
  • La página de versiones de PostgreSQL indica 18.6 como versión menor actual de PostgreSQL 18, con soporte hasta el 14 de noviembre de 2030. PostgreSQL 19 está en beta. El curso fija la etiqueta de imagen postgres:18.6-trixie y anota su digest en la página de misión.
  • La versión de Aurora PostgreSQL más reciente en las notas de versión de AWS es 18.4.1, del 21 de agosto de 2026. Su tabla de extensiones da btree_gist 1.6; PostgreSQL 18.6 en la imagen ofrece 1.8.
  • Clientes: Npgsql 10.0.3 y su proveedor EF Core 10.0.3, que requiere EF Core 10.0.4 o posterior; pgjdbc 42.7.13, HikariCP 7.1.0. pgvector no está en la imagen oficial: la lección 8 necesitará otra imagen o una compilación.
  • El primer arranque de la imagen ejecuta un servidor temporal para crear el clúster, que escucha solo en el socket Unix. pg_isready por el socket respondía «accepting connections» durante ese intervalo, y el comando siguiente se topaba con un servidor que se estaba apagando. pg_isready -h 127.0.0.1 pasa por TCP. server.sh y el health check del servicio de CI lo usan.
  • Los errores de psql salían antes que los resultados de las instrucciones anteriores en las salidas guardadas: psql usa un búfer para la salida estándar, no para la de errores. server.sh ejecuta psql bajo stdbuf -o0, dentro del contenedor, con ambos flujos fusionados allí.
  • Cada script se ejecuta con TimeZone=UTC, DateStyle=ISO, MDY y lc_messages=C, fijados en PGOPTIONS, y cada consulta tiene un ORDER BY. \conninfo muestra el identificador del proceso servidor, que cambia en cada ejecución: los scripts no lo usan.
  • Un rango cerrado [started_at, completed_at] para los pasos hacía que se solaparan 2798 pares de pasos del mismo job: las horas de GitHub van al segundo, y un paso empieza en el segundo en que termina el anterior. Los rangos semiabiertos [) lo resuelven, pero 857 de los 2204 pasos se convierten en rangos vacíos, que pierden sus límites. La tabla conserva ambas marcas de tiempo y deriva el rango como columna generada almacenada.
  • Un CHECK cuyo mensaje de error incluía now() daba una salida distinta en cada ejecución; las filas de prueba usan fechas fijas.
  • WITH TIES devolvía las filas empatadas en un orden distinto de una ejecución a otra: un ORDER BY externo fija el orden.

2026-09-15 — Hallazgos en Guitar Alchemist

Sección titulada «2026-09-15 — Hallazgos en Guitar Alchemist»

Nada de esto se ha comunicado al proyecto; son notas, con las consultas que los reproducen en las lecciones.

  • GA.Knowledge.Service.csproj referencia GA.Business.Config.fsproj dos veces, en las líneas 26 y 31, en el commit 32f143c. La clave primaria de ga.project_refs rechaza la segunda (lección 2).
  • MusicalKnowledgeDbContext.cs existe en tres copias que solo difieren en su namespace, en Common/GA.Data.EntityFramework/, Common/GA.Data.EntityFramework/Data/ y Common/GA.Infrastructure/Persistence/EntityFramework/. No encontré ninguna llamada a AddDbContext o UseSqlite para él en ese commit, aunque hay servicios que lo inyectan.
  • Sus convertidores de valores guardan las listas como cadenas unidas y las vuelven a leer con StringSplitOptions.RemoveEmptyEntries: un nombre alternativo vacío se pierde. Tres nombres guardados, dos leídos (lección 4).
  • En IconicChords.yaml, tres digitaciones no tocan sus clases de altura declaradas: Blackbird no toca si y añade do♯, mi y la; la digitación Hendrix no tiene si; la digitación del Mu Major, Cadd9(no3), toca mi (lección 3, ejercicio 1).
  • Versiones de paquetes: Microsoft.Extensions.Hosting se referencia en 5 versiones y MongoDB.Driver en 5; 16 paquetes tienen un máximo textual que no es su versión más alta; 13 versiones distintas no son números simples, entre ellas las flotantes 0.* y 8.*-* (lección 3).
  • Dos proyectos se llaman GaApi.Tests.csproj, en Tests/Apps/GaApi.Tests y Tests/GaApi.Tests.
  • Npgsql: un DateTime con Kind=Unspecified no lanzó una excepción, como esperaba, sino que se envió como timestamp y se convirtió en la zona horaria de la sesión: 82 ejecuciones o 59 según Timezone. Un DateTimeOffset con un desfase de −4 horas lanza ArgumentException.
  • pg_prepared_statements contaba la propia consulta de recuento una vez preparada; una expresión regular que no coincide con su propio texto corrigió el recuento.
  • EF Core construye un modelo una vez por tipo de contexto: dos configuraciones de la misma entidad en una sola clase de contexto, elegidas por un argumento del constructor, daban dos veces el primer modelo. Una subclase por configuración.
  • pgjdbc envía la zona horaria de la JVM como TimeZone de la sesión, así que getString sobre un timestamptz dependía de la máquina. check.sh ejecuta Java con -Duser.timezone=America/Toronto.
  • PowerShell 7.6 sigue cortando -Duser.timezone=Asia/Tokyo en el punto: Java respondía «Could not find or load main class .timezone=Asia.Tokyo». Entre comillas, funciona.
  • Npgsql rechaza Target Session Attributes=standby con un solo host: NotSupportedException: Target Session Attributes other then Any is only supported with multiple hosts. pgjdbc acepta targetServerType=secondary con un host y falla al conectarse.
  • Una ejecución de l04-timings: 478 comandos INSERT en un segundo aproximadamente, un NpgsqlBatch en 5 a 7 ms, un COPY binario en unos 50 ms. Ejecuciones anteriores ese mismo día tardaron hasta 2,2 segundos en el bucle de INSERT.

2026-09-16 — Planes que dan la misma salida en cada ejecución

Sección titulada «2026-09-16 — Planes que dan la misma salida en cada ejecución»
  • EXPLAIN ANALYZE sobre el historial de pasos de 440 800 filas daba filas distintas por nodo de una ejecución a otra: los workers paralelos repartían las filas de forma distinta cada vez. max_parallel_workers_per_gather = 0 para las lecciones que muestran planes.
  • Las estimaciones del planificador cambiaban tras cada ANALYZE, que lee una muestra aleatoria de 30 000 filas con el objetivo de estadísticas por defecto. Con 1500, la muestra es de 450 000 filas, más que la tabla, y las estimaciones son exactas y estables.
  • La línea Buffers repartía las páginas entre hit y read según lo que las instrucciones anteriores dejaban en memoria. La función auxiliar de planes las suma en un solo número; el total no cambió tras reiniciar el contenedor.
  • PostgreSQL 18 imprime Buffers sin BUFFERS, los recuentos de filas con dos decimales, e Index Searches.
  • xmin imprimía -1 para la primera versión de fila: el ID de transacción guardado con \gset se tomaba después del INSERT. Ahora se toma justo antes.
  • pg_stat_user_tables mostraba cero actualizaciones HOT justo después de las actualizaciones: las estadísticas se envían como mucho una vez por segundo. pg_stat_force_next_flush() corrige el recuento.
  • Un programa no puede esperar a que vuelva la instrucción bloqueada de B. Los programas C# y Java la lanzan, y una tercera conexión consulta pg_stat_activity hasta que B espera un bloqueo, con pg_blocking_pids nombrando a A.
  • En el ejemplo de deadlock, cualquiera de las dos sesiones podía ser la cancelada, según cuál esperara primero deadlock_timeout. A tiene 10 segundos y B 100 ms: B detecta siempre el ciclo, y se cancela.
  • Un tsvector generado almacenado cuya configuración venía de otra columna generada fue rechazado: una columna generada no puede referirse a otra. La configuración es una columna normal, fijada por el INSERT.
  • Un índice de trigramas sobre las 478 filas de ga.package_refs nunca se usaba, ni siquiera con enable_seqscan = off: el índice de la clave primaria era más barato. El ejemplo usa los 88 160 nombres de pasos de los documentos copiados.
  • Sobre estos documentos, jsonb_path_ops salió algo más grande que jsonb_ops, 1752 kB frente a 1688 kB, lo contrario de lo que la documentación dice que es habitual.
  • La frase "prepared statements" coincidió con pg_prepared_statements en este diario: el analizador de búsqueda de texto corta en los guiones bajos.
  • Hallazgo, Npgsql 10.0.3. Un único CREATE FUNCTION … BEGIN ATOMIC SELECT …; END en un NpgsqlCommand sin parámetros falla con 42601: syntax error at end of input. Npgsql corta el texto del comando en el punto y coma de dentro del cuerpo, como hace con varias instrucciones. El mismo texto funciona en un NpgsqlBatch, con el switch Npgsql.EnableSqlRewriting a false, o en un comando con parámetros posicionales. pgjdbc 42.7.13 detecta BEGIN ATOMIC y no corta; una función BEGIN ATOMIC seguida de otra instrucción en un solo execute falla entonces por tener varios comandos en una sentencia preparada. No comunicado a ninguno de los dos proyectos.
  • La imagen oficial no tiene pgvector. Los scripts de pgvector se ejecutan sobre pgvector/pgvector:0.8.6-pg18-trixie, un servidor cada vez en el puerto 5432; la CI lo ejecuta como un segundo servicio, sin puerto.
  • Con enable_seqscan = off, una consulta de vecinos más cercanos filtrada por tríadas no devolvía ninguna fila, donde se pedían diez: el escaneo HNSW devuelve 40 candidatos, ninguno de ellos una tríada. hnsw.iterative_scan = strict_order devuelve las diez. Reconstruí el índice cinco veces: las distancias de los 40 candidatos fueron las mismas cada vez.
  • Los vectores de clases de intervalo de los acordes icónicos muestran que el acorde Elektra es el acorde Petrushka transpuesto una tercera mayor hacia arriba, y que el acorde Foxy Lady es la inversión del acorde Joni Mitchell, cuya transposición es el acorde Debussy.

2026-09-16 — Aurora, según la documentación

Sección titulada «2026-09-16 — Aurora, según la documentación»
  • Aurora PostgreSQL 18.4 incluye pgvector 0.8.2, mientras que el curso ejecuta 0.8.6. pageinspect no está en la tabla de extensiones de Aurora PostgreSQL 18.
  • Las páginas de AWS no coinciden sobre el fin de vida de Performance Insights: 31 de julio de 2026 en la guía de CloudWatch, 30 de noviembre de 2025 en el historial de la Aurora User Guide. Tampoco coinciden sobre si Database Insights usa por defecto el modo Standard o el Advanced.
  • max_standby_streaming_delay: 30 segundos en la página Lock:Relation, 14 000 ms en la tabla de parámetros de Aurora PostgreSQL 14.
  • Una clave primaria solo sobre id se rechaza en una tabla particionada por started_at; con (id, started_at) se acepta, y se comprueba partición a partición.
  • DETACH PARTITION … CONCURRENTLY no está permitido mientras la tabla tiene una partición por defecto, y una partición por defecto que contiene una fila de octubre impide crear la partición de octubre.
  • El particionado por hash de 64 nombres de job dio a una partición 2,1 veces las filas de otra.
  • Un procedimiento que imprimía un regclass después de DROP TABLE imprimía el OID a secas: el aviso tiene que ir antes del borrado.

2026-09-16 — Varios servidores en un contenedor

Sección titulada «2026-09-16 — Varios servidores en un contenedor»
  • El curso ejecuta un contenedor cada vez. Las lecciones 10 y 11 arrancan pequeños clústeres dentro de él con initdb y pg_ctl, en los puertos 5433 a 5436, con shared_buffers = 32MB; la CI ejecuta los mismos scripts dentro de su contenedor de servicio.
  • Un script reescrito en Windows mediante el modo texto de Python acabó con finales de línea CRLF, y bash -s en el contenedor falló en sus primeras líneas. Los archivos escritos con newline='' conservan LF.
  • Los clústeres de la imagen ponen su socket Unix en /var/run/postgresql, no en /tmp: con PGHOST=/tmp, cada psql fallaba, y cada bucle de espera agotaba sus 30 segundos.
  • SET statement_timeout = '2s' no terminó un INSERT que esperaba a un standby síncrono detenido: esperó diez minutos, hasta que lo cancelé con pg_cancel_backend. El script cancela ahora la espera desde otra sesión; el aviso dice que la transacción «has already committed locally».
  • pg_rewind falló primero con could not open file "node1/pg_wal/000000010000000000000002": el antiguo primario había reciclado el segmento que necesitaba. wal_keep_size = 128MB lo conserva.
  • Las estadísticas de conflictos de PostgreSQL 18 cuentan el conflicto insert_exists de un suscriptor que tenía su propia fila; el apply worker reintenta hasta que se borra la fila.

2026-09-16 — Copias de seguridad y pg_upgrade

Sección titulada «2026-09-16 — Copias de seguridad y pg_upgrade»
  • pg_upgrade --check de un clúster 17 a un clúster 18 nuevo se detuvo en «old cluster does not use data checksums but the new one does»: initdb 18 activa los checksums por defecto. --no-data-checksums en el clúster nuevo lo resuelve.
  • pg_upgrade 18 conservó las seis estadísticas de columna de ci.runs, no sus estadísticas extendidas; vacuumdb --analyze-only --missing-stats-only las reconstruyó.
  • La actualización necesita los binarios de PostgreSQL 17: check.sh instala postgresql-17 desde el repositorio apt que la imagen ya usa, así que la versión menor del lado antiguo no está fijada. Las salidas solo muestran la versión mayor.

2026-09-16 — Una conmutación por error desde los drivers

Sección titulada «2026-09-16 — Una conmutación por error desde los drivers»
  • ops/12-cluster.sh arranca un primario y un standby en el contenedor del curso, publicados en los puertos 5433 y 5434. Los programas detienen el primario mediante COPY … TO PROGRAM 'pg_ctl … -W stop' y promueven el standby con pg_promote().
  • En la conexión abierta antes del fallo, pgjdbc informa de 57P01, «terminating connection due to administrator command», y Npgsql «Exception while reading from stream» en Windows a través de Docker Desktop, pero una PostgresException con 57P01 en la CI en Linux: la primera ejecución de la CI falló en esa línea. El programa C# imprime ahora el FullState de la conexión, Broken en ambos casos.
  • Ambos drivers guardan en caché el estado de los hosts durante 10 segundos por defecto, y sin embargo una escritura justo después de la promoción encontró el nuevo primario en los dos. No he rastreado por qué en su código fuente.
  • El volumen de clúster máximo: 256 TiB para Aurora PostgreSQL 15.13, 16.9, 17.5 y posteriores en la tabla de versiones de la página de cuotas, 128 TiB en la tabla de cuotas de la misma página, 256 TiB sin condición en la descripción general.
  • El calendario de versiones da a PostgreSQL 18 una «community release date» del 26 de febrero de 2026, la fecha de 18.3; PostgreSQL 18.0 se publicó el 25 de septiembre de 2025.
  • La página de actualizaciones de versión mayor dice que las estadísticas del optimizador no se transfieren, mientras que pg_upgrade 18 transfiere la mayoría.
  • Los Blue/Green Deployments y zero-ETL todavía no tienen columna de Aurora PostgreSQL 18 en sus tablas de versiones; RDS Proxy sí, desde 18.3.
  • El AWS Advanced .NET Data Provider Wrapper existe, 2.2.0 en GitHub, con un dialecto Npgsql, pero la lista de drivers de AWS de la Aurora User Guide no lo menciona.
  • El curso está completo: 13 lecciones. SQL Server 2025 CU9 arrancó en unos segundos en su contenedor y usaba unos 450 MB en reposo; la CI lo ejecuta como contenedor de servicio junto a PostgreSQL.
  • sqlcmd 18.6 (mssql-tools18 en la imagen) descartaba todos los resultados posteriores a un error no capturado en un script ejecutado con -i, cuando el error era la primera instrucción de un lote que venía después de un lote con resultados; -Q con las mismas instrucciones los imprimía. Los scripts capturan sus errores con TRY … CATCH.
  • Microsoft.Data.SqlClient 7.0.3 lanzó Globalization Invariant Mode is not supported. en OpenAsync en el proyecto C# del curso, que activa InvariantGlobalization. El programa de migración tiene su propio proyecto.
  • Npgsql truncó los ticks de datetimeoffset(7) a microsegundos (.9999999 a .999999); pgloader los redondeó (10:06:00.9999999 -04:00 a 14:06:01).
  • pgloader, con la imagen construida desde 231ab86, convirtió un valor money de 0.0125 en 0.01, sin error ni aviso: lee money con convert(varchar(40), [col], 0), y el estilo 0 conserva dos decimales (mssql-schema.lisp, líneas 212-217). También omitió la restricción CHECK y convirtió INCLUDE (Conclusion) en una columna de clave.
  • El IDENT_CURRENT de SQL Server era 6 con tres filas: dos inserts fallidos y una fila borrada habían consumido valores.
  • Documentación de AWS consultada el mismo día: DMS no incluye SQL Server 2025 entre sus orígenes; la tabla de parámetros y la página de collations de Babelfish dan dos collations de servidor por defecto distintas, y la página de collations sigue diciendo que PostgreSQL no admite LIKE sobre collations no deterministas; el Babelfish de código abierto se queda en PostgreSQL 17.7 y no tiene imagen de contenedor.
  • La página web de precios de SQL Server 2025 de Microsoft rechazó las peticiones automatizadas; los precios vienen de su hoja de precios en PDF.
  • #734, fusionada el 2026-09-24, corrige los convertidores de listas: los 11 convertidores de listas de cadenas de las tres copias de MusicalKnowledgeDbContext dividen sin RemoveEmptyEntries, y una columna vacía se relee como una lista vacía. Su prueba falla en los 11 con el código antiguo. Queda un límite, y la PR lo dice: una lista que solo contiene una cadena vacía se relee todavía como una lista vacía, porque las dos guardan el mismo valor de columna.
  • Los comandos de Linux y macOS de las lecciones 1 y 4, en esos sistemas.
  • Cada sección «En Aurora»: pg_read_file y el requisito de CONNECT para rds_superuser, btree_gist 1.6, el error de solo lectura en una réplica, TLS por defecto, los tokens IAM con el proveedor de contraseña periódico de Npgsql, la fijación de RDS Proxy con el DISCARD ALL de Npgsql y con las sentencias preparadas a nivel de protocolo, y pg_is_in_recovery() en una Aurora Replica.
  • Las lecciones 5 a 8 en Aurora: el valor por defecto de shared_buffers en Aurora PostgreSQL 18 y la razón de que sea mayor, la gestión de planes de consulta en 18.4, hot_standby_feedback frenando VACUUM en el writer, el valor por defecto de max_standby_streaming_delay, las extensiones de confianza bajo rds.allowed_extensions, y los escaneos iterativos de pgvector 0.8.2.
  • Las lecciones 9 a 12 en Aurora: pg_partman 5.4.3 en 18.4, la replicación lógica tras rds.logical_replication, las estadísticas tras una actualización mayor a 18, los Blue/Green Deployments y zero-ETL en 18, los rangos y la pausa automática de Aurora Serverless en 18, si las conexiones inactivas de un pool impiden la pausa automática, RDS Proxy con las solicitudes de cancelación, y la duración de una conmutación por error vista desde Npgsql y pgjdbc.
  • Por qué Npgsql y pgjdbc encontraron enseguida el standby promovido pese a sus cachés de estado de hosts de 10 segundos.
  • La lección 13 en AWS: DMS con un origen SQL Server 2025, si la validación de DMS informa de los valores datetimeoffset(7) truncados a microsegundos, la collation de servidor por defecto de Babelfish y cómo trata los siete comportamientos de esta lección, los precios de la AWS Price List publicada el 2026-09-11, y si RDS factura una instancia SQL Server de 2 vCPU por 4 vCPU de licencia.