Está en la página 1de 54

Machine Translated by Google

Notas  de  la  versión  de  Firebird  5.0  Beta  1
Proyecto  Firebird:  desarrolladores  principales,  Mark  Rotteveel

Versión  0500­02,  21  de  marzo  de  2023
Machine Translated by Google
Tabla  de  contenido

Tabla  de  contenido
1.  Notas  generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Compatibilidad  con  versiones  anteriores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Informe  de  errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2.  Nuevo  en  Firebird  5.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  6

Resumen  de  nuevas  funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  6

Completar  en  Firebird  5.0  Beta  1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  6

3.  Cambios  en  el  Firebird  Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  10

Enlaces  rápidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  10

Soporte  para  operaciones  paralelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  10

Actualización  de  ODS  menor  en  línea. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Más  detalles  relacionados  con  el  cursor  en  la  salida  del  plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Compresión  más  densa  de  registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  13

Caché  de  declaraciones  compiladas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  13

Analizador  de  SQL  y  PSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  13

Paquete  de  rutinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  dieciséis

Tablas  de  instantáneas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  19

Vistas  auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Paquete  RDB$BLOB_UTIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  25

Paquete  de  rutinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  25

Ejemplos  _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4.  Cambios  en  la  API  de  Firebird  y  el  ODS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Cambios  en  la  estructura  en  disco  (ODS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Nuevo  Número  ODS  Menor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Nuevo  Sistema  de  Tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Nuevas  Columnas  en  las  Tablas  del  Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Interfaces  de  programación  de  aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Principales  extensiones  de  la  API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  30

Extensiones  a  varios  métodos  getInfo() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  31

Extensiones  de  la  API  de  servicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  31

5.  Palabras  reservadas  y  cambios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  32

Nuevas  palabras  clave  en  Firebird  5.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  32

No  reservado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  32

6.  Adiciones  y  cambios  de  configuración. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
33

Parámetros  para  Operaciones  en  Paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

MaxParallelWorkers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

Trabajadores  Paralelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

Otros  parámetros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

1
Machine Translated by Google
Tabla  de  contenido

MaxStatementCacheSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

OnDisconnectTriggerTimeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

DefaultProfilerPlugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

Parámetros  de  configuración  modificados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

Complemento  WireCrypt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  33

RemotePipeName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  34

TcpLoopbackFastPath. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  34

Adiciones  y  cambios  en  la  configuración  de  replicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  34

replicación_en_cascada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  34

Permitir  macros  en  replication.conf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  34

7.  Seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  35

Privilegio  del  sistema  PROFILE_ANY_ATTACHMENT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  35

8.  Lenguaje  de  definición  de  datos  (DDL). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  36

Enlaces  rápidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  36

Soporte  para  índices  parciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  36

COMENTARIO  SOBRE  MAPEO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  37

9.  Lenguaje  de  manipulación  de  datos  (DML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  38

Enlaces  rápidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  38

Cláusula  SKIP  LOCKED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  38

Compatibilidad  con  CUANDO  NO  COINCIDE  CON  LA  FUENTE  en  la  instrucción  MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  40  Admite  

múltiples  filas  para  DML  RETURNING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Permitir  expresiones  de  consulta  entre  paréntesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Cambios  en  los  literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Sintaxis  literal  completa  de  la  cadena  de  caracteres  estándar  de  SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Sintaxis  literal  de  cadena  binaria  estándar  SQL  completa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Nuevas  expresiones  y  funciones  integradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
43

UNICODE_CHAR  y  UNICODE_VAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  43

10.  Utilidades  de  supervisión  y  línea  de  comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
45

Supervisión. . . . . . . . . . . . . . . . . . . . . . . . .   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  45

isql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  46

Unifique  la  visualización  de  los  procedimientos  y  paquetes  del  sistema  con  otros  objetos  del  sistema . . . . . . . . . . . . . . . . . .  46

gbak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  46

Copia  de  seguridad/restauración  en   . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  46

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
paralelo . . . . . . . . . . .  gfijo  _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  46

Barrido  paralelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  46

Actualización  de  SAO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

11.  Problemas  de  compatibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  48

SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  48

Comportamiento  de  RETORNO  de  varias  filas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  48

Eliminación  del  protocolo  WNET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  48

Eliminación  de  QLI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  48

2
Machine Translated by Google
Tabla  de  contenido

12.  Errores  corregidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  49

Versión  Firebird  5.0  Beta  1:  Corrección  de  errores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  49

Motor  central. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  49

El  servidor  se  bloquea/colga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  50

Utilidades  _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  51

13.  Equipos  de  proyecto  de  Firebird  5.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  52

Apéndice  A:  Aviso  de  licencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  53

3
Machine Translated by Google
Capítulo  1.  Notas  generales

Capítulo  1.  Notas  generales
Gracias  por  elegir  Firebird  5.0.  Le  invitamos  cordialmente  a  probarlo  duro  según  sus  expectativas  y  colaborar  con  nosotros  para  
identificar  y  corregir  cualquier  error  que  pueda  encontrar.

Se  presenta  ODS  (Estructura  en  disco)  13.1.  Es  una  actualización  menor  de  ODS,  por  lo  que  las  bases  de  datos  en  ODS  13.0  
(creadas  por  Firebird  4.0)  aún  se  pueden  abrir  con  un  servidor  Firebird  5.0  (con  algunas  características  nuevas  que  no  están  
disponibles),  pero  las  bases  de  datos  en  ODS  más  antiguas  no  se  pueden  abrir.

Las  bases  de  datos  creadas  en  versiones  anteriores  (pre­Beta)  de  Firebird  5.0  pueden  ser  inaccesibles  en  la  
versión  Beta  1  y  deben  volver  a  crearse.  El  ODS  se  modificó  varias  veces  durante  el  ciclo  de  desarrollo  y,  por  
lo  general,  el  Proyecto  Firebird  no  garantiza  que  el  ODS  sea  estable  antes  de  la  etapa  Beta.

La  biblioteca  del  motor  todavía  se  llama  engine13.dll  (Windows)  y  libEngine13.so  (POSIX).  La  base  de  datos  de  seguridad  se  llama  
security5.fdb.  El  diseño  y  la  configuración  de  los  binarios  no  han  cambiado  desde  Firebird  4.

Dicho  esto,  puede  copiar  la  biblioteca  del  motor  Firebird  del  paquete  de  distribución  Firebird  3.0  (llamado  
engine12.dll  (Windows)  y  libEngine12.so  (POSIX),  y  ubicado  dentro  del  subdirectorio /plugins)  para  continuar  
trabajando  con  bases  de  datos  en  ODS12  sin  necesita  una  copia  de  seguridad/restauración.  Sin  embargo,  no  
se  podrá  acceder  a  las  nuevas  funciones  introducidas  con  Firebird  5.0.

Compatibilidad  con  versiones  anteriores
Las  incompatibilidades  conocidas  se  detallan  en  el  capítulo  Problemas  de  compatibilidad .

Informe  de  errores
Los  errores  corregidos  en  esta  versión  se  enumeran  y  describen  en  el  capítulo  titulado  Errores  corregidos.

•  Si  cree  que  ha  descubierto  un  nuevo  error  en  esta  versión,  asegúrese  de  leer  las  instrucciones  para  el  informe  de  errores  en  el  
artículo  Cómo  informar  errores  de  manera  efectiva,  en  el  sitio  web  del  Proyecto  Firebird.

•  Si  cree  que  la  corrección  de  un  error  no  ha  funcionado  o  ha  causado  una  regresión,  localice  el  error  original
informe  en  el  Rastreador,  vuelva  a  abrirlo  si  es  necesario  y  siga  las  instrucciones  a  continuación.

Siga  estas  pautas  cuando  intente  analizar  su  error:

1.  Escriba  informes  de  errores  detallados,  proporcionando  el  número  de  compilación  exacto  de  su  kit  Firebird.  también  proporcionar
detalles  de  la  plataforma  del  sistema  operativo.

2.  Incluya  datos  de  prueba  reproducibles  en  su  informe  y  publíquelo  en  nuestro  Rastreador.

Documentación
Encontrará  todos  los  documentos  LÉAME  a  los  que  se  hace  referencia  en  estas  notas,  así  como  muchos  otros  que  no

4
Machine Translated by Google
Capítulo  1.  Notas  generales

referido  —  en  el  subdirectorio  doc  de  su  instalación  de  Firebird  5.0.

—  El  Proyecto  Pájaro  de  Fuego

5
Machine Translated by Google
Capítulo  2.  Nuevo  en  Firebird  5.0

Capítulo  2.  Nuevo  en  Firebird  5.0
Resumen  de  nuevas  características
Firebird  5.0  introduce  muchas  mejoras  sin  ningún  cambio  en  la  arquitectura  o  la  operación,  las  más  importantes  son:

•  Operación  paralela  (multiproceso)  para  copia  de  seguridad/restauración,  barrido  y  creación  de  índices;

•  índices  parciales;

•  Cláusula  SKIP  LOCKED  para  sentencias  SELECT  WITH  LOCK,  UPDATE  y  DELETE;

•  Actualización  de  ODS  menor  en  línea;

•  Caché  de  declaraciones  compiladas;

•  Perfilador  de  PSQL  y  SQL;

•  Compatibilidad  con  CUANDO  NO  COINCIDE  CON  LA  FUENTE  para  la  instrucción  MERGE;

•  Soporta  múltiples  filas  para  DML  DEVOLUCIÓN;

•  Nuevas  funciones  y  paquetes  incorporados;

•  Compresión  a  nivel  de  grabación  más  densa;

•  Soporte  de  red  para  cursores  desplazables;

La  siguiente  lista  resume  las  características  y  los  cambios,  con  enlaces  a  los  capítulos  y  temas  donde  se  puede  encontrar  información  más  
detallada.

Completar  en  Firebird  5.0  Beta  1

Operaciones  paralelas  (multiproceso)

Operaciones  tales  como  la  copia  de  seguridad/restauración  lógica,  el  barrido  y  la  ejecución  de  sentencias  CREATE  INDEX  pueden  ser  

ejecutadas  en  paralelo  por  varios  subprocesos,  lo  que  reduce  el  tiempo  total  de  la  operación.

Referencias  del  rastreador:  #1783,  #3374,  #7447

Consulte  los  capítulos  Compatibilidad  con  operaciones  en  paralelo,  copia  de  seguridad/restauración  en  paralelo  y  barrido  en  paralelo  para  
obtener  más  detalles.

Soporte  para  índices  parciales

La  declaración  CREATE  INDEX  DDL  se  ha  ampliado  para  admitir  índices  parciales,  es  decir,  un  índice  ahora  puede  declarar  una  condición  
que  define  el  subconjunto  de  registros  que  se  indexarán.

Referencia  del  rastreador:  #7257

Cláusula  SKIP  LOCKED

Se  introdujo  la  nueva  cláusula  SKIP  LOCKED  para  las  sentencias  SELECT  WITH  LOCK,  UPDATE  y  DELETE.  Permite  saltarse  los  registros  

ya  bloqueados  mientras  se  lee  la  tabla.

Referencia  del  rastreador:  #7350

6
Machine Translated by Google
Capítulo  2.  Nuevo  en  Firebird  5.0

Actualización  de  ODS  menor  en  línea  

Se  ha  introducido  la  capacidad  de  actualizar  la  base  de  datos  a  la  última  versión  de  ODS  menor,  no  requiere  un  ciclo  de  copia  de  
seguridad/restauración.

Referencia  del  rastreador:  #7397

Caché  de  declaraciones  compiladas

Se  ha  implementado  la  memoria  caché  por  archivo  adjunto  de  sentencias  SQL  compiladas .

Referencia  del  rastreador:  #7144

Perfilador  de  PSQL  y  SQL

Se  ha  agregado  una  capacidad  integrada  para  generar  perfiles  de  declaraciones  SQL  y  PSQL ,  lo  que  hace  posible  medir  el  tiempo  de  
ejecución  en  diferentes  niveles.

Referencia  del  rastreador:  #7086

Compatibilidad  con  CUANDO  NO  COINCIDE  CON  LA  FUENTE  en  la  instrucción  MERGE

La  declaración  MERGE  se  ha  ampliado  para  admitir  la  cláusula  WHEN  NOT  MATCHED  BY  SOURCE.

Referencia  del  rastreador:  #6681

Funciones  integradas  UNICODE_CHAR  y  UNICODE_VAL

Se  agregaron  nuevas  funciones  integradas  UNICODE_CHAR  y  UNICODE_VAL  para  permitir  la  conversión  entre  punto  de  código  

Unicode  y  carácter.

Referencia  del  rastreador:  #6798

Nuevo  paquete  de  sistema  RDB$BLOB_UTIL  Se  

agregó  el  nuevo  paquete  de  sistema  RDB$BLOB_UTIL  para  permitir  varias  operaciones  con  BLOB  en  los  módulos  PSQL.

Referencia  del  rastreador:  #281

Admite  múltiples  filas  devueltas  por  DML  con  la  cláusula  RETURNING

La  cláusula  RETURNING,  si  se  usa  en  consultas  DSQL,  ahora  permite  que  se  devuelvan  varias  filas.

Referencia  del  rastreador:  #6815

Optimice  el  algoritmo  RLE  a  nivel  de  registro  para  una  compresión  más  densa  de  cadenas  más  cortas  que  las  declaradas  y  conjuntos  
de  valores  NULL  posteriores

El  algoritmo  de  compresión  incorporado  se  ha  mejorado  para  permitir  una  compresión  más  densa  de  los  registros.

Referencia  del  rastreador:  #4723

Más  detalles  relacionados  con  el  cursor  en  la  salida  del  plan

El  plan  de  ejecución  ahora  contiene  más  información  sobre  los  cursores.

Referencia  del  rastreador:  #7441

7
Machine Translated by Google
Capítulo  2.  Nuevo  en  Firebird  5.0

Otras  mejoras  se  enumeran  brevemente  a  continuación,  siga  las  referencias  del  rastreador  para  obtener  más  información.

Unifique  la  visualización  de  los  procedimientos  y  paquetes  del  sistema  con  otros  objetos  del  sistema

Referencia  del  rastreador:  #7411

Simplifique  la  compilación  de  la  biblioteca  del  cliente

Referencia  del  rastreador:  #7399

Mejora  del  rendimiento  para  la  copia  de  BLOB

Referencia  del  rastreador:  #7382

Elección  basada  en  costos  entre  unión  de  bucle  anidado  y  unión  hash

Referencia  del  rastreador:  #7331

Cree  paquetes  de  Android  con  todos  los  archivos  necesarios  en  todas  las  arquitecturas  (x86,  x64,  arm32,  arm64)

Referencia  del  rastreador:  #7293

Unificar  los  nombres  de  archivo  de  lanzamiento

Referencia  del  rastreador:  #7284

Mejorar  los  diagnósticos  de  discrepancia  de  versiones  de  la  UCI

Referencia  del  rastreador:  #7169

Proporcione  la  capacidad  de  ver  en  los  eventos  de  registro  de  seguimiento  relacionados  con  el  contexto  de  seguridad  faltante

Referencia  del  rastreador:  #7165

ResultSet.getInfo()  nuevo  método  API

Referencia  del  rastreador:  #7083

Soporte  de  red  para  cursores  desplazables

Referencia  del  rastreador:  #7051

Agregue  la  tabla  MON$COMPILED_STATEMENTS  y  también  la  columna  MON$COMPILED_STATEMENT_ID  a  ambos

Tablas  MON$STATEMENTS  y  MON$CALL_STACK

Referencia  del  rastreador:  #7050

Hacer  la  capacidad  de  agregar  comentarios  al  mapeo  ("COMENTARIO  SOBRE  MAPEO ...  ES ...")

Referencia  del  rastreador:  #7046

Los  resultados  de  la  negación  deben  ser  los  mismos  para  cada  tipo  de  datos  (SMALLINT /  INT /  BIGINT /  INT128)  cuando  el  argumento  es  el  

valor  mínimo  para  este  tipo

Referencia  del  rastreador:  #7025

Transforme  las  uniones  EXTERNAS  en  INNER  si  la  condición  WHERE  viola  las  reglas  de  unión  externa

Referencia  del  rastreador:  #6992

8
Machine Translated by Google
Capítulo  2.  Nuevo  en  Firebird  5.0

Agregue  una  forma  de  recuperar  la  declaración  BLR  con  Statement.getInfo  ()  y  SET  EXEC_PATH_DISPLAY  de  ISQL
BLR

Referencia  del  rastreador:  #6910

SIMILAR  TO  debe  usar  el  índice  cuando  el  patrón  comienza  con  un  carácter  no  comodín  (como  lo  hace  LIKE)

Referencia  del  rastreador:  #6873

Agregue  la  columna  MON$SESSION_TIMEZONE  a  la  tabla  MON$ATTACHMENTS

Referencia  del  rastreador:  #6794

Permitir  expresión  de  consulta  entre  paréntesis  para  cumplimiento  estándar

Referencia  del  rastreador:  #6740

Tabla  del  sistema  con  palabras  clave

Referencia  del  rastreador:  #6713

Admite  la  sintaxis  literal  completa  de  la  cadena  de  caracteres  estándar  de  SQL

Referencia  del  rastreador:  #5589

Admite  la  sintaxis  literal  de  cadena  binaria  estándar  de  SQL  completo

Referencia  del  rastreador:  #5588

Permitir  que  las  subrutinas  accedan  a  variables/parámetros  definidos  en  el  nivel  externo/principal

Referencia  del  rastreador:  #4769

Evite  la  recuperación  de  datos  si  la  cláusula  WHERE  siempre  se  evalúa  como  FALSO

Referencia  del  rastreador:  #1708

9
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Capítulo  3.  Cambios  en  el  motor  Firebird
enlaces  rápidos
•  Soporte  para  operaciones  paralelas

•  Actualización  de  ODS  menor  en  línea

•  Más  detalles  relacionados  con  el  cursor  en  la  salida  del  plan

•  Caché  de  declaraciones  compiladas

•  Compresión  más  densa  de  registros

•  Analizador  de  SQL  y  PSQL

•  Paquete  RDB$BLOB_UTIL

Soporte  para  operaciones  paralelas
Vlad  Khorsun

Boleto  de  rastreador:  #7447

El  motor  de  Firebird  ahora  puede  ejecutar  algunas  tareas  utilizando  varios  subprocesos  en  paralelo.  Actualmente,  se  implementa  la  
ejecución  paralela  para  las  tareas  de  barrido  y  creación  de  índices.  Se  admite  la  ejecución  en  paralelo  para  el  barrido  automático  y  manual.

Para  manejar  una  tarea  con  varios  subprocesos,  el  motor  ejecuta  subprocesos  de  trabajo  adicionales  y  crea  adjuntos  de  trabajo  internos.  
De  forma  predeterminada,  la  ejecución  en  paralelo  no  está  habilitada.  Hay  dos  formas  de  habilitar  el  paralelismo  en  un  archivo  adjunto  de  
usuario:

1.  establezca  el  número  de  trabajadores  paralelos  en  DPB  usando  la  nueva  etiqueta  isc_dpb_parallel_workers,

2.  Establezca  el  número  predeterminado  de  trabajadores  paralelos  utilizando  la  nueva  configuración  ParallelWorkers  en  firebird.conf.

La  utilidad  gfix  tiene  un  nuevo  interruptor  de  línea  de  comandos,  ­parallel,  que  permite  establecer  el  número  de  trabajadores  paralelos  para  
la  tarea  de  barrido.  Por  ejemplo:

gfix  ­sweep  ­parallel  4  <base  de  datos>

ejecutará  el  barrido  en  la  base  de  datos  dada  y  le  pedirá  al  motor  que  use  4  trabajadores.  gfix  usa  la  etiqueta  DPB  isc_dpb_parallel_workers  
cuando  se  adjunta  a  <base  de  datos>,  si  el  interruptor  ­parallel  está  presente.

La  nueva  configuración  de  firebird.conf  ParallelWorkers  establece  el  número  predeterminado  de  trabajadores  paralelos  que  puede  usar  
cualquier  archivo  adjunto  de  usuario  que  ejecute  una  tarea  paralelizable.  El  valor  predeterminado  es  1  y  significa  que  no  se  utilizan  
trabajadores  paralelos  adicionales.  El  valor  en  el  DPB  tiene  una  prioridad  más  alta  que  la  configuración  en  firebird.conf.

Para  controlar  la  cantidad  de  trabajadores  adicionales  que  puede  crear  el  motor,  hay  dos  configuraciones  nuevas  en  firebird.conf:

10
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

ParallelWorkers

Establece  el  número  predeterminado  de  trabajadores  paralelos  que  utilizan  los  archivos  adjuntos  de  usuario.  Se  puede  anular  
mediante  un  archivo  adjunto  con  la  etiqueta  isc_dpb_parallel_workers  en  DPB.

MaxParallelWorkers

Limita  el  número  de  trabajadores  utilizados  simultáneamente  para  la  base  de  datos  dada  y  el  proceso  de  Firebird.

Los  archivos  adjuntos  de  trabajadores  internos  son  creados  y  administrados  por  el  propio  motor.  El  motor  mantiene  grupos  por  base  de  
datos  de  adjuntos  de  trabajadores.  La  cantidad  de  subprocesos  en  cada  grupo  está  limitada  por  el  valor  de  la  configuración  
MaxParallelWorkers .  Los  grupos  son  creados  por  cada  proceso  de  Firebird  de  forma  independiente.

En  la  arquitectura  SuperServer,  los  archivos  adjuntos  de  los  trabajadores  se  implementan  como  archivos  adjuntos  de  sistema  livianos,  
mientras  que  en  Classic  y  SuperClassic  parecen  archivos  adjuntos  de  usuario  habituales.  Todos  los  archivos  adjuntos  de  los  
trabajadores  están  integrados  en  la  creación  del  proceso  del  servidor.  Por  lo  tanto,  en  las  arquitecturas  clásicas  no  hay  procesos  de  
servidor  adicionales.  Los  archivos  adjuntos  de  los  trabajadores  están  presentes  en  las  tablas  de  seguimiento.  Los  archivos  adjuntos  de  
los  trabajadores  inactivos  se  destruyen  después  de  60  segundos  de  inactividad.  Además,  en  las  arquitecturas  clásicas,  los  archivos  
adjuntos  de  los  trabajadores  se  destruyen  inmediatamente  después  de  que  la  última  conexión  del  usuario  se  separe  de  la  base  de  datos.

Ejemplos:

Configure  en  firebird.conf  ParallelWorkers  =  4,  MaxParallelWorkers  =  8  y  reinicie  el  servidor  Firebird.

1.  Conéctese  a  la  base  de  datos  de  prueba  sin  usar  isc_dpb_parallel_workers  en  DPB  y  ejecute  CREATE  INDEX...
instrucción  SQL.  En  la  confirmación,  el  índice  se  creará  realmente  y  el  motor  utilizará  3  archivos  adjuntos  de  trabajo  adicionales.  
En  total,  4  archivos  adjuntos  en  4  subprocesos  funcionarán  en  la  creación  de  índices.

2.  Asegúrese  de  que  el  barrido  automático  esté  habilitado  para  la  base  de  datos  de  prueba.  Cuando  el  barrido  automático  se  ejecute  en  esa  base  de  
datos,  también  utilizará  3  trabajadores  adicionales  (y  se  ejecutará  dentro  de  4  subprocesos).

3.  Se  puede  paralelizar  más  de  una  sola  tarea  a  la  vez:  hacer  2  archivos  adjuntos  y  ejecutar  CREAR  ÍNDICE…  en  cada  uno  de  ellos  
(por  supuesto,  los  índices  a  construir  deben  ser  diferentes).  Cada  índice  se  creará  utilizando  4  archivos  adjuntos  (1  usuario  y  3  

trabajadores)  y  4  subprocesos.

4.  Ejecute  gfix  ­sweep  <base  de  datos>  sin  especificar  switch  ­parallel:  el  barrido  se  ejecutará  usando  4
accesorios  en  4  hilos.

5.  Ejecute  gfix  ­sweep  ­parallel  2  <base  de  datos>:  el  barrido  se  ejecutará  utilizando  2  archivos  adjuntos  en  2  subprocesos.  Esto  
muestra  que  el  valor  en  la  etiqueta  DPB  isc_dpb_parallel_workers  anula  el  valor  de  la  configuración  de  ParallelWorkers.

Actualización  de  ODS  menor  en  línea
dmitri  yemanov

Boleto  de  rastreador:  #7397

Esta  función  permite  actualizar  la  base  de  datos  existente  a  la  versión  más  reciente  de  ODS  sin  realizar  copias  de  seguridad/
restauración,  siempre  que  la  base  de  datos  pertenezca  a  la  misma  versión  principal  de  ODS.

Por  ejemplo,  una  base  de  datos  creada  por  Firebird  4.0  usa  ODS  13.0  y,  por  lo  tanto,  puede  actualizarse  al  ODS  13.1  que  usa  Firebird  
5.0.

11
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Notas:

•  La  actualización  debe  hacerse  manualmente,  usando  el  comando  gfix  ­upgrade

•  Requiere  acceso  exclusivo  a  la  base  de  datos,  de  lo  contrario  se  arroja  error

•  Se  requiere  el  privilegio  del  sistema  USE_GFIX_UTILITY

•  La  actualización  es  transaccional,  todos  los  cambios  se  revierten  si  ocurre  algún  error

Uso:

gfix  ­actualizar  <base  de  datos>

Ver  también  actualización  de  ODS  por  gfix.

Esta  es  una  modificación  unidireccional,  la  degradación  hacia  atrás  es  imposible.  Por  lo  tanto,  haga  una  
copia  de  la  base  de  datos  antes  de  actualizar,  solo  para  tener  un  punto  de  recuperación  si  algo  sale  mal  
durante  el  proceso.

Más  detalles  relacionados  con  el  cursor  en  la  salida  del  plan
dmitri  yemanov

Boleto  de  rastreador:  #7441

La  salida  detallada  del  plan  ahora  distingue  entre  declaraciones  SELECT  especificadas  por  el  usuario  (informadas  como  
expresiones  de  selección),  cursores  declarados  por  PSQL  y  subconsultas.  Tanto  los  planes  heredados  como  los  detallados  
ahora  también  incluyen  información  sobre  la  posición  del  cursor  (línea/columna)  dentro  de  su  módulo  PSQL.

Ejemplos:

­­  línea  23,  columna  2

PLAN  (ÍNDICE  DE  DISTRITO  (DISTRICT_PK))  
­­  línea  28,  columna  2
UNIRSE  AL  PLAN  (ÍNDICE  DE  CLIENTE  (CLIENTE_PK),  ÍNDICE  DE  ALMACÉN  (ALMACÉN_PK))

Seleccione  Expresión  (línea  23,  columna  2)
     ­>  Comprobación  de  singularidad
     ­>  Filtrar

     ­>  Tabla  "DISTRITO"  Acceso  por  ID
     ­>  Mapa  de  bits
     ­>  Escaneo  único  del  índice  "DISTRICT_PK"

Seleccione  Expresión  (línea  28,  columna  2)
     ­>  Comprobación  de  singularidad
     ­>  Unión  de  bucle  anidado  (interior)
     ­>  Filtrar

     ­>  Tabla  "CLIENTE"  Acceso  Por  ID
  ­>  Mapa  de  bits

12
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

     ­>  Escaneo  único  del  índice  "CUSTOMER_PK"
     ­>  Filtrar

     ­>  Tabla  "ALMACÉN"  Acceso  Por  DNI
     ­>  Mapa  de  bits

  ­>  Escaneo  único  del  índice  "WAREHOUSE_PK"

Los  números  de  línea/columna  (así  como  los  cursores  declarados  por  PSQL)  no  se  pueden  ver  directamente  en  el  plan  para  consultas  
SQL  especificadas  por  el  usuario,  excepto  si  la  consulta  es  EXECUTE  BLOCK.  Sin  embargo,  se  puede  acceder  a  ellos  en  la  columna  
MON$EXPLAINED_PLAN  en  las  tablas  MON$STATEMENTS  o  MON$COMPILED_STATEMENTS.

Compresión  más  densa  de  registros
dmitri  yemanov

Boleto  de  rastreador:  #4723

A  partir  de  ODS  13.1,  el  motor  utiliza  un  método  de  compresión  RLE  avanzado  (con  contador  de  longitud  variable)  que  almacena  
secuencias  de  bytes  repetitivas  de  manera  más  efectiva,  lo  que  reduce  la  sobrecarga  de  almacenamiento.  Esto  mejora  la  compresión  
para  campos  VARCHAR  largos  (especialmente  codificados  en  UTF8)  que  se  llenan  solo  parcialmente.

Caché  de  declaraciones  compiladas
Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #7144

El  motor  ahora  mantiene  un  caché  por  archivo  adjunto  de  sentencias  SQL  compiladas.  De  forma  predeterminada,  el  almacenamiento  
en  caché  está  habilitado,  el  umbral  de  almacenamiento  en  caché  está  definido  por  el  parámetro  MaxStatementCacheSize  en  
firebird.conf.  Se  puede  deshabilitar  estableciendo  MaxStatementCacheSize  en  cero.

El  caché  se  mantiene  automáticamente;  Las  declaraciones  almacenadas  en  caché  se  invalidan  cuando  es  necesario  (generalmente  
cuando  se  ejecuta  alguna  declaración  DDL).

Analizador  de  SQL  y  PSQL
Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #7086

El  generador  de  perfiles  permite  a  los  usuarios  medir  el  costo  de  rendimiento  del  código  SQL  y  PSQL.  Se  implementa  con  un  paquete  
de  sistema  en  el  motor  que  pasa  datos  a  un  complemento  de  perfilador.

Esta  documentación  trata  las  partes  del  motor  y  del  complemento  como  una  sola  cosa,  en  la  forma  en  que  se  utilizará  el  generador  
de  perfiles  predeterminado  (Default_Profiler).

El  paquete  RDB$PROFILER  puede  perfilar  la  ejecución  de  código  PSQL,  recopilando  estadísticas  de  cuántas  veces  se  ejecutó  cada  
línea  junto  con  sus  tiempos  de  ejecución  mínimos,  máximos  y  acumulados  (con  precisión  de  nanosegundos),  así  como  estadísticas  
de  apertura  y  obtención  de  SQL  implícito  y  explícito.

13
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

cursores

Para  recopilar  datos  de  perfil,  un  usuario  primero  debe  iniciar  una  sesión  de  perfil  con  RDB$PROFILER.START_SESSION.  Esta  función  
devuelve  un  ID  de  sesión  de  perfil  que  luego  se  almacena  en  las  tablas  de  instantáneas  del  generador  de  perfiles  para  que  el  usuario  las  
consulte  y  las  analice.  Una  sesión  de  Profiler  puede  ser  local  (mismo  archivo  adjunto)  o  remota  (otro  archivo  adjunto).

La  creación  de  perfiles  remotos  solo  reenvía  comandos  al  archivo  adjunto  remoto.  Por  lo  tanto,  es  posible  que  un  cliente  perfile  varios  
archivos  adjuntos  simultáneamente.  También  es  posible  que  una  sesión  de  perfil  iniciada  local  o  remotamente  tenga  comandos  emitidos  
por  otro  archivo  adjunto.

Los  comandos  emitidos  de  forma  remota  requieren  que  el  archivo  adjunto  de  destino  esté  en  un  estado  inactivo,  es  decir,  que  no  esté  
ejecutando  otras  solicitudes.  Cuando  el  archivo  adjunto  de  destino  no  está  inactivo,  la  llamada  se  bloquea  esperando  ese  estado.

Si  el  archivo  adjunto  remoto  es  de  un  usuario  diferente,  el  usuario  que  llama  debe  tener  el  privilegio  del  sistema  
PROFILE_ANY_ATTACHMENT.

Después  de  que  se  inicia  una  sesión,  las  estadísticas  de  las  declaraciones  de  PSQL  y  SQL  se  recopilan  en  la  memoria.  Una  sesión  de  
perfil  recopila  datos  solo  de  declaraciones  ejecutadas  en  el  mismo  archivo  adjunto  asociado  con  la  sesión.  Los  datos  se  agregan  y  
almacenan  por  solicitudes  (es  decir,  una  ejecución  de  declaración).  Al  consultar  tablas  de  instantáneas,  el  usuario  puede  realizar  una  
agregación  adicional  por  declaración  o  usar  las  vistas  auxiliares  que  lo  hacen  automáticamente.

Se  puede  pausar  una  sesión  para  deshabilitar  temporalmente  la  recopilación  de  estadísticas.  Se  puede  reanudar  más  tarde  para  devolver  
la  recopilación  de  estadísticas  en  la  misma  sesión.

Se  puede  iniciar  una  nueva  sesión  cuando  ya  hay  una  sesión  activa.  En  ese  caso,  tiene  la  misma  semántica  de  finalizar  la  sesión  actual  
con  RDB$PROFILER.FINISH_SESSION(FALSE),  por  lo  que  las  tablas  de  instantáneas  no  se  actualizan.

Para  analizar  los  datos  recopilados,  el  usuario  debe  vaciar  los  datos  en  las  tablas  de  instantáneas,  lo  que  se  puede  hacer  finalizando  o  
pausando  una  sesión  (con  el  parámetro  FLUSH  establecido  en  TRUE)  o  llamando  a  RDB$PROFILER.FLUSH.  Los  datos  se  vacían  
mediante  una  transacción  autónoma  (una  transacción  iniciada  y  finalizada  con  el  propósito  específico  de  actualizar  los  datos  del  
generador  de  perfiles).

A  continuación  se  muestra  una  sesión  de  perfil  de  muestra  y  consultas  para  el  análisis  de  datos.

1.  Preparación:  cree  una  tabla  y  rutinas  que  se  analizarán

crear  pestaña  de  
tabla  (id  entero  no  nulo,  val  
entero  no  nulo);

establecer  plazo !;

crear  o  alterar  la  función  mult(p1  entero,  p2  entero)  devuelve  entero
como

*
empezar  volver  p1 p2;

14
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

¡fin!

crear  o  modificar  procedimiento  ins
como

declarar  n  entero  =  1;  comenzar  

mientras  (n  <=  1000)  

comenzar  
     si  (mod  (n,  2)  =  1)  entonces
     insertar  en  valores  de  tabulación  (:n,  mult(:n,  2));
     n  =  n  +  1;
fin
¡fin!

establecer  plazo ;!

2.  Empezar  a  perfilar

seleccione  rdb$profiler.start_session('Profile  Session  1')  de  rdb$database;

establecer  plazo !;

ejecutar  bloque
como

comenzar  a  ejecutar  el  
procedimiento  ins;  
eliminar  de  la  pestaña;  ¡fin!

establecer  plazo ;!

ejecutar  el  procedimiento  rdb$profiler.finish_session(true);

ejecutar  procedimiento  ins;

seleccione  rdb$profiler.start_session('Profile  Session  2')  de  rdb$database;

seleccione  mod  (id,  5),  
     sum  (val)  
de  la  pestaña  
donde  id  <=  50
agrupar  por  mod(id,  5)  
ordenar  por  sum(val);

ejecutar  el  procedimiento  rdb$profiler.finish_session(true);

3.  Análisis  de  datos

15
Machine Translated by Google Capítulo  3.  Cambios  en  el  motor  Firebird

establecer  transacción  de  lectura  confirmada;

seleccione  *  de  plg$prof_sessions;

seleccione  *  de  plg$prof_psql_stats_view;

seleccione  *  de  plg$prof_record_source_stats_view;

seleccionar  preq.*  
from  plg$prof_requests  preq  unirse  a  
plg$prof_sessions  pses  en  pses.profile_id  
=  preq.profile_id  y
     pses.description  =  'Sesión  de  perfil  1';

seleccione  pstat.*  
de  plg$prof_psql_stats  pstat  únase  a  
plg$prof_sessions  pses  en  pses.profile_id  
=  pstat.profile_id  y  pses.description  =  'Sesión  de  perfil  1'  ordene  
     por  pstat.profile_id,  pstat.request_id,  pstat.line_num,  
pstat.column_num;
    

    

    

seleccione  pstat.*  
de  plg$prof_record_source_stats  pstat  únase  a  
plg$prof_sessions  pses  en  pses.profile_id  
=  pstat.profile_id  y  pses.description  =  'Sesión  de  perfil  2'  ordene  
     por  pstat.profile_id,  pstat.request_id,  pstat.cursor_id,  
pstat.record_source_id;
    

    

Paquete  de  rutinas

Función  START_SESSION

RDB$PROFILER.START_SESSION  inicia  una  nueva  sesión  del  generador  de  perfiles,  la  convierte  en  la  sesión  actual  (del  
ATTACHMENT_ID  dado)  y  devuelve  su  identificador.

Si  FLUSH_INTERVAL  es  diferente  de  NULL,  la  descarga  automática  se  configura  de  la  misma  manera  que  se  llama  manualmente  a  
RDB$PROFILER.SET_FLUSH_INTERVAL.

Si  PLUGIN_NAME  es  NULL  (el  valor  predeterminado),  utiliza  la  configuración  de  la  base  de  datos  DefaultProfilerPlugin.

PLUGIN_OPTIONS  son  opciones  específicas  del  complemento  y  actualmente  deben  ser  NULL  para  el  complemento  Default_Profiler.

Parámetros  de  entrada):

dieciséis
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

•  DESCRIPCIÓN  tipo  VARCHAR(255)  CONJUNTO  DE  CARACTERES  UTF8  predeterminado  NULL

•  FLUSH_INTERVAL  tipo  INTEGER  por  defecto  NULL

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

•  PLUGIN_NAME  tipo  VARCHAR(255)  CONJUNTO  DE  CARACTERES  UTF8  predeterminado  NULL

•  PLUGIN_OPTIONS  tipo  VARCHAR(255)  CONJUNTO  DE  CARACTERES  UTF8  predeterminado  NULL

Tipo  de  valor  devuelto:  BIGINT  NOT  NULL.

Procedimiento  PAUSE_SESSION

RDB$PROFILER.PAUSE_SESSION  detiene  la  sesión  actual  del  generador  de  perfiles  (del  ATTACHMENT_ID  dado),  por  lo  que  no  se  recopilan  las  siguientes  
estadísticas  de  declaraciones  ejecutadas.

Si  FLUSH  es  TRUE,  las  tablas  de  instantáneas  se  actualizan  con  datos  hasta  el  momento  actual;  de  lo  contrario,  los  datos  permanecen  solo  en  la  memoria  para  

una  actualización  posterior.

Llamar  llamando  aRDB$PERFILADOR.PAUSA_SESIÓN(VERDADERO) tiene  la  misma  semántica  
  RDB$PROFILER.PAUSE_SESSION(FALSE)  seguido  de  RDB$PROFILER.FLUSH   de
(usando  
el  mismo  ATTACHMENT_ID).

Parámetros  de  entrada):

•  FLUSH  tipo  BOOLEAN  NO  NULO  predeterminado  FALSO

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

Procedimiento  RESUME_SESSION

RDB$PROFILER.RESUME_SESSION  reanuda  la  sesión  actual  del  generador  de  perfiles  (del  ATTACHMENT_ID  dado),  si  estaba  en  pausa,  por  lo  que  las  

próximas  estadísticas  de  declaraciones  ejecutadas  se  recopilan  nuevamente.

Parámetros  de  entrada):

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

Procedimiento  FINISH_SESSION

RDB$PROFILER.FINISH_SESSION  finaliza  la  sesión  actual  del  generador  de  perfiles  (del  ATTACHMENT_ID  proporcionado).

Si  FLUSH  es  TRUE,  las  tablas  de  instantáneas  se  actualizan  con  los  datos  de  la  sesión  finalizada  (y  las  sesiones  anteriores  terminadas  que  aún  no  están  

presentes  en  la  instantánea);  de  lo  contrario,  los  datos  permanecen  solo  en  la  memoria  para  una  actualización  posterior.

Llamar  a  RDB$PROFILER.FINISH_SESSION(TRUE)  tiene  la  misma  semántica  que  llamar  a  RDB$PROFILER.FINISH_SESSION(FALSE)  seguido  de  

RDB$PROFILER.FLUSH  (usando  el  mismo  ATTACHMENT_ID).

Parámetros  de  entrada):

•  FLUSH  tipo  BOOLEAN  NO  NULO  predeterminado  VERDADERO

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

17
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Procedimiento  CANCEL_SESSION

RDB$PROFILER.CANCEL_SESSION  cancela  la  sesión  actual  del  generador  de  perfiles  (del  ATTACHMENT_ID  dado).

Todos  los  datos  de  sesión  presentes  en  el  complemento  del  generador  de  perfiles  se  descartan  y  no  se  eliminarán.

Los  datos  ya  vaciados  no  se  eliminan  automáticamente.

Parámetros  de  entrada):

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

Procedimiento  DESECHAR

RDB$PROFILER.DISCARD  elimina  todas  las  sesiones  (del  ATTACHMENT_ID  dado)  de  la  memoria,  sin  vaciarlas.

Si  hay  una  sesión  activa,  se  cancela.

Parámetros  de  entrada):

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

Procedimiento  LAVADO

RDB$PROFILER.FLUSH  actualiza  las  tablas  de  instantáneas  con  datos  de  las  sesiones  de  perfil  (del  ATTACHMENT_ID  dado)  en  la  memoria.

Después  del  vaciado,  los  datos  se  almacenan  en  las  tablas  PLG$PROF_SESSIONS,  PLG$PROF_STATEMENTS,  PLG$PROF_RECORD_SOURCES,  
PLG$PROF_REQUESTS,  PLG$PROF_PSQL_STATS  y  PLG$PROF_RECORD_SOURCE_STATS  y  pueden  ser  leídos  y  analizados  por  el  usuario.

Los  datos  se  actualizan  mediante  una  transacción  autónoma,  por  lo  que  si  se  llama  al  procedimiento  en  una  transacción  instantánea,  los  datos  no  

se  podrán  leer  directamente  en  la  misma  transacción.

Una  vez  que  ocurre  el  vaciado,  las  sesiones  finalizadas  se  eliminan  de  la  memoria.

Parámetros  de  entrada):

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

Procedimiento  SET_FLUSH_INTERVAL

RDB$PROFILER.SET_FLUSH_INTERVAL  activa  la  descarga  automática  periódica  (cuando  FLUSH_INTERVAL  es  mayor  que  0)  o  desactiva  

(cuando  FLUSH_INTERVAL  es  igual  a  0).

FLUSH_INTERVAL  se  interpreta  como  número  de  segundos.

Parámetros  de  entrada):

•  FLUSH_INTERVAL  tipo  INTEGER  NOT  NULL

•  ATTACHMENT_ID  tipo  BIGINT  NOT  NULL  predeterminado  CURRENT_CONNECTION

18
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Tablas  de  instantáneas

Las  tablas  de  instantáneas  (así  como  las  vistas  y  la  secuencia)  se  crean  automáticamente  en  el  primer  uso  del  generador  de  perfiles.  Son  propiedad  del  

propietario  de  la  base  de  datos,  con  permisos  de  lectura/escritura  para  PÚBLICO.

Cuando  se  elimina  una  sesión,  los  datos  relacionados  en  otras  tablas  de  instantáneas  del  generador  de  perfiles  también  se  eliminan  automáticamente  a  través  

de  claves  externas  con  la  opción  DELETE  CASCADE.

A  continuación  se  muestra  la  lista  de  tablas  que  almacenan  datos  de  perfil.

Tabla  PLG$PROF_SESSIONS

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

ATTACHMENT_ID  tipo  BIGINT ID  de  archivo  adjunto

NOMBRE_USUARIO  tipo  CHAR(63)  CONJUNTO  DE  CARACTERES  UTF8 Nombre  de  usuario

DESCRIPCIÓN  tipo  VARCHAR(255)  CONJUNTO  DE  CARACTERES Descripción  pasada   en
UTF8
RDB$PROFILER.START_SESSION

START_TIMESTAMP  tipo  TIMESTAMP  CON  HORA Momento  en  que  se  inició  la  sesión  de  perfil
ZONA

FINISH_TIMESTAMP  tipo  TIMESTAMP  CON  HORA Momento  en  que  finalizó  la  sesión  de  perfil
ZONA
(NULL  cuando  no  ha  terminado)

Clave  primaria PERFIL  ID

Tabla  PLG$PROF_STATEMENTS

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

STATEMENT_ID  tipo  BIGINT ID  de  estado  de  cuenta

PARENT_STATEMENT_ID  tipo  BIGINT Id.  de  declaración  principal:  relacionado  con  las  subrutinas

STATEMENT_TYPE  tipo  VARCHAR(20)  CARÁCTER BLOQUE,  FUNCIÓN,  PROCEDIMIENTO  o  DISPARADOR
CONJUNTO  UTF8

PACKAGE_NAME  tipo  CHAR(63)  CONJUNTO  DE  CARACTERES Paquete  de  FUNCIÓN  o  PROCEDIMIENTO
UTF8

ROUTINE_NAME  tipo  CHAR(63)  CONJUNTO  DE  CARACTERES Rutina  nombre  de  FUNCIÓN,  PROCEDIMIENTO  o
UTF8
DESENCADENAR

SQL_TEXT  tipo  BLOB  subtipo  TEXTO  CARÁCTER Texto  SQL  para  BLOCK
CONJUNTO  UTF8

Clave  primaria PERFIL_ID,  DECLARACIÓN_ID

Tabla  PLG$PROF_CURSORS

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

STATEMENT_ID  tipo  BIGINT ID  de  estado  de  cuenta

19
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

CURSOR_ID  tipo  INTEGER Identificación  del  cursor

NOMBRE  tipo  CHAR(63)  CONJUNTO  DE  CARACTERES  UTF8  Nombre  del  cursor  explícito

LINE_NUM  tipo  INTEGER Número  de  línea  del  cursor

COLUMN_NUM  tipo  INTEGER Número  de  columna  del  cursor

Clave  primaria PERFIL_ID,  DECLARACIÓN_ID,  CURSOR_ID

Tabla  PLG$PROF_RECORD_SOURCES

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

STATEMENT_ID  tipo  BIGINT ID  de  estado  de  cuenta

CURSOR_ID  tipo  INTEGER Identificación  del  cursor

RECORD_SOURCE_ID  tipo  INTEGER ID  de  fuente  de  registro

PARENT_RECORD_SOURCE_ID  tipo  INTEGER ID  de  fuente  de  registro  principal

ACCESS_PATH  tipo  VARCHAR(255)  CONJUNTO  DE  CARACTERES Ruta  de  acceso  a  la  fuente  de  registro
UTF8

Clave  primaria PERFIL  ID, DECLARACIÓN_ID, CURSOR_ID,


RECORD_SOURCE_ID

Tabla  PLG$PROF_REQUESTS

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

SOLICITUD_ID  tipo  BIGINT Solicitar  identificación

STATEMENT_ID  tipo  BIGINT ID  de  estado  de  cuenta

CALLER_REQUEST_ID  tipo  BIGINT ID  de  solicitud  de  llamada

START_TIMESTAMP  tipo  TIMESTAMP  CON  HORA Momento  en  que  esta  solicitud  se  recopiló  por  primera  vez  los  datos  del  
ZONA
perfil

FINISH_TIMESTAMP  tipo  TIMESTAMP  CON  HORA Momento  en  que  finalizó  esta  solicitud
ZONA

TOTAL_ELAPSED_TIME  tipo  BIGINT Tiempo  transcurrido  acumulado  (en  nanosegundos)  de  la  solicitud

Clave  primaria PERFIL_ID,  SOLICITUD_ID

Tabla  PLG$PROF_PSQL_STATS

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

SOLICITUD_ID  tipo  BIGINT Solicitar  identificación

20
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

LINE_NUM  tipo  INTEGER Número  de  línea  de  la  declaración

COLUMN_NUM  tipo  INTEGER Número  de  columna  de  la  declaración

STATEMENT_ID  tipo  BIGINT ID  de  estado  de  cuenta

CONTADOR  tipo  BIGINT Número  de  veces  ejecutadas  de  la  línea/columna

MIN_ELAPSED_TIME  tipo  BIGINT Tiempo  mínimo  transcurrido  (en  nanosegundos)  de  ejecución  de  una  línea/columna

MAX_ELAPSED_TIME  tipo  BIGINT Tiempo  máximo  transcurrido  (en  nanosegundos)  de  ejecución  de  una  línea/columna

TOTAL_ELAPSED_TIME  tipo  BIGINT  Tiempo  transcurrido  acumulado  (en  nanosegundos)  del
ejecuciones  de  línea/columna

Clave  primaria PERFIL_ID,  SOLICITUD_ID,  LINE_NUM,  COLUMN_NUM

Tabla  PLG$PROF_RECORD_SOURCE_STATS

PROFILE_ID  tipo  BIGINT ID  de  sesión  de  perfil

SOLICITUD_ID  tipo  BIGINT Solicitar  identificación

CURSOR_ID  tipo  INTEGER Identificación  del  cursor

RECORD_SOURCE_ID  tipo  ̀INTEGER ID  de  fuente  de  registro

STATEMENT_ID  tipo  BIGINT ID  de  estado  de  cuenta

OPEN_COUNTER  tipo  BIGINT Número  de  horas  abiertas  de  la  fuente  de  registro

OPEN_MIN_ELAPSED_TIME  tipo  BIGINT Tiempo  mínimo  transcurrido  (en  nanosegundos)  de  un  registro
fuente  abierta

OPEN_MAX_ELAPSED_TIME  tipo  BIGINT Tiempo  máximo  transcurrido  (en  nanosegundos)  de  una  fuente  de  registro  
abierta

OPEN_TOTAL_ELAPSED_TIME  tipo  BIGINT Tiempo  transcurrido  acumulado  (en  nanosegundos)  de  las  aperturas  de  la  
fuente  de  registro

FETCH_COUNTER  tipo  BIGINT Número  de  tiempos  de  recuperación  de  la  fuente  de  registro

FETCH_MIN_ELAPSED_TIME  tipo  BIGINT Tiempo  mínimo  transcurrido  (en  nanosegundos)  de  una  búsqueda  de  
fuente  de  registro

FETCH_MAX_ELAPSED_TIME  tipo  BIGINT Tiempo  máximo  transcurrido  (en  nanosegundos)  de  una  búsqueda  de  
fuente  de  registro

FETCH_TOTAL_ELAPSED_TIME  tipo  BIGINT  Tiempo  transcurrido  acumulado  (en  nanosegundos)  del
búsquedas  de  fuentes  de  registros

21
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Clave  primaria PERFIL_ID,  SOLICITUD_ID,  CURSOR_ID,  RECORD_SOURCE_ID

Vistas  auxiliares
Estas  vistas  ayudan  a  perfilar  la  extracción  de  datos  agregados  a  nivel  de  estado  de  cuenta.

Deben  ser  la  forma  preferida  de  analizar  los  datos  recopilados.  También  se  pueden  usar  junto  con  las  tablas  para  obtener  datos  
adicionales  que  no  están  presentes  en  las  vistas.

Una  vez  que  se  encuentran  los  puntos  de  acceso,  se  pueden  desglosar  los  datos  en  el  nivel  de  solicitud  a  través  de  las  tablas.

Ver  PLG$PROF_STATEMENT_STATS_VIEW

select  req.profile_id,  
     req.statement_id,  
     sta.statement_type,  
     sta.package_name,  
     sta.routine_name,  
     sta.parent_statement_id,  
     sta_parent.statement_type  parent_statement_type,  
     sta_parent.routine_name  parent_routine_name,  
     (seleccione  
     sql_text  de  
     plg$prof_statements  donde  profile_id  =  req.profile_id  y
     statement_id  =  coalesce(sta.parent_statement_id,  req.statement_id) )  
     sql_text,  
     count(*)  counter,  
     min(req.total_elapsed_time)  min_elapsed_time,  
     max(req.total_elapsed_time)  max_elapsed_time,  
     cast(sum(req.total_elapsed_time)  as  bigint)  total_elapsed_time,  
     cast(sum(req.total_elapsed_time) /  count(*)  as  bigint)  avg_elapsed_time  from  
plg$prof_requests  req  join  
plg$prof_statements  sta  on  
sta.profile_id  =  req.profile_id  and  
     sta.statement_id  =  req.statement_id  
left  join  plg$prof_statements  sta_parent  on  
sta_parent.profile_id  =  sta.profile_id  y
     sta_parent.statement_id  =  sta.parent_statement_id  
agrupar  por  req.profile_id,  
     req.statement_id,  
     sta.statement_type,  
     sta.package_name,  
     sta.routine_name,  
     sta.parent_statement_id,  
     sta_parent.statement_type,  
  sta_parent.routine_name  
ordenar  por  sum(req.total_elapsed_time)  desc

22
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Ver  PLG$PROF_PSQL_STATS_VIEW

seleccione  pstat.profile_id,  
     pstat.statement_id,  
     sta.statement_type,  
     sta.package_name,  
     sta.routine_name,  
     sta.parent_statement_id,  
     sta_parent.statement_type  parent_statement_type,  
     sta_parent.routine_name  parent_routine_name,  
     (seleccione  
     sql_text  de  
     plg$prof_statements  donde  profile_id  =  
     pstat.profile_id  y  statement_id  =  coalesce(sta.parent_statement_id,  
    

    

     pstat.statement_id) )  
     sql_text,  pstat.line_num,  pstat.column_num,  
     cast(sum(pstat.counter)  as  bigint)  counter,  
     min(pstat.min_elapsed_time)  min_elapsed_time,  
     max(pstat.max_elapsed_time)  max_elapsed_time ,  
     cast(sum(pstat.total_elapsed_time)  as  bigint)  total_elapsed_time,  

cast(sum(pstat.total_elapsed_time) /  
nullif(sum(pstat.counter),  0)  as  
bigint)  avg_elapsed_time  from  plg$prof_psql_stats  
     pstat  join  plg$prof_statements  sta  on  sta .profile_id  =  pstat.profile_id  y  sta.statement_id  =  pstat.sta
combinación  izquierda  plg$prof_statements  
sta_parent  en  sta_parent.profile_id  =  sta.profile_id  y
     sta_parent.statement_id  =  sta.parent_statement_id  
grupo  por  pstat.profile_id,  
     pstat.statement_id,  
     sta.statement_type,  
     sta.package_name,  
     sta.routine_name,  
     sta.parent_statement_id,  
     sta_parent.statement_type,  
     sta_parent.routine_name,  
     pstat.line_num,  
  pstat.column_num  
ordenar  por  sum(pstat.total_elapsed_time)  desc

Ver  PLG$PROF_RECORD_SOURCE_STATS_VIEW

seleccione  rstat.profile_id,  
     rstat.statement_id,  
     sta.statement_type,  
     sta.package_name,  
  sta.routine_name,

23
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

     sta.parent_statement_id,  
     sta_parent.statement_type  parent_statement_type,  
     sta_parent.routine_name  parent_routine_name,  
     (seleccione  
     sql_text  from  
     plg$prof_statements  where  profile_id  =  
     rstat.profile_id  and  statement_id  =  coalesce(sta.parent_statement_id,  
    

     rstat.statement_id) )  sql_text,  rstat.cursor_id,
     cur.name  
     nombre_cursor,  cur.line_num  
     cursor_line_num,  cur.column_num  
     cursor_column_num,  
     rstat.record_source_id,  
    

     recsrc.parent_record_source_id,  recsrc.access_path,  
     cast(sum(rstat.open_counter)  as  bigint)  open_counter,  
     min(rstat.open_min_elapsed_time)  open_min_elapsed_time,  
     max( rstat.open_max_elapsed_time)  open_max_elapsed_time,  
     cast(sum(rstat.open_total_elapsed_time)  as  bigint)  open_total_elapsed_time,  

cast(sum(rstat.open_total_elapsed_time) /  
    

     nullif(sum(rstat.open_counter),  0)  as  bigint)  
     open_avg_elapsed_time,  cast(sum(rstat.  fetch_counter)  as  
     bigint)  fetch_counter,  min(rstat.fetch_min_elapsed_time)  fetch_min_elapsed_time,  
     max(rstat.fetch_max_elapsed_time)  fetch_max_elapsed_time,  
cast(sum(rstat.fetch_total_elapsed_time)  
     as  bigint)  fetch_total_elapsed_time,  cast(sum(rstat.fetch_total_elapsed_time(sum) /  null .fetch_co
coalesce(sum(rstat.fetch_total_elapsed_time),  0)  as  bigint)  
open_fetch_total_elapsed_time  
from  plg$prof_record_source_stats  rstat  join  
plg$prof_cursors  cur  on  
cur.profile_id  =  rstat.profile_id  y
     cur.statement_id  =  rstat.statement_id  y  
     cur.cursor_id  =  rstat.cursor_id  
unirse  a  plg$prof_record_sources  recsrc  
en  recsrc.profile_id  =  rstat.profile_id  y
     recsrc.statement_id  =  rstat.statement_id  y  
     recsrc.cursor_id  =  rstat.cursor_id  y  
     recsrc.record_source_id  =  rstat.record_source_id  
unirse  a  plg$prof_statements  
sta  on  sta.profile_id  =  rstat.profile_id  y  
     sta.statement_id  =  rstat.statement_id
combinación  izquierda  plg$prof_statements  
sta_parent  en  sta_parent.profile_id  =  sta.profile_id  y
     sta_parent.statement_id  =  sta.parent_statement_id  
grupo  por  rstat.profile_id,  
     rstat.statement_id,  
     sta.statement_type,  
     sta.package_name,  
  sta.routine_name,

24
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

     sta.parent_statement_id,  
     sta_parent.statement_type,  
     sta_parent.routine_name,  
     rstat.cursor_id,
     cur.name,  
     cur.line_num,  
     cur.column_num,  
     rstat.record_source_id,  
     recsrc.parent_record_source_id,  
  recsrc.access_path  
ordenar  por  coalesce(sum(rstat.open_total_elapsed_time),  0)  +  
coalesce(sum(rstat.fetch_total_elapsed_time),  0)  desc

Paquete  RDB$BLOB_UTIL
Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #281

Este  paquete  proporciona  procedimientos  y  funciones  para  manipular  BLOB  de  una  manera  que  las  funciones  estándar  de  Firebird,  
como  BLOB_APPEND  y  SUBSTRING,  no  pueden  hacer  o  son  muy  lentas.

Estas  rutinas  operan  en  datos  binarios  directamente,  incluso  para  BLOB  de  texto.

Paquete  de  rutinas

Función  NUEVO_BLOB

RDB$BLOB_UTIL.NEW_BLOB  se  usa  para  crear  un  nuevo  BLOB.  Devuelve  un  BLOB  adecuado  para  agregar  datos,  como  lo  hace  
BLOB_APPEND.

La  ventaja  sobre  BLOB_APPEND  es  que  es  posible  establecer  opciones  personalizadas  SEGMENTED  y  TEMP_STORAGE.

BLOB_APPEND  siempre  crea  BLOB  en  almacenamiento  temporal,  lo  que  puede  no  ser  siempre  el  mejor  enfoque  si  el  BLOB  
creado  se  va  a  almacenar  en  una  tabla  permanente,  ya  que  requerirá  una  copia.

El  BLOB  devuelto  por  esta  función,  incluso  cuando  TEMP_STORAGE  =  FALSE,  puede  usarse  con  BLOB_APPEND  para  agregar  
datos.

Parámetros  de  entrada):

•  Tipo  SEGMENTADO  BOOLEAN  NO  NULO

•  TEMP_STORAGE  tipo  BOOLEAN  NO  NULO

Tipo  de  valor  devuelto:  BLOB  NO  NULO.

Función  OPEN_BLOB

RDB$BLOB_UTIL.OPEN_BLOB  se  usa  para  abrir  un  BLOB  existente  para  lectura.  Devuelve  un  identificador  (un  número  entero

25
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

vinculado  a  la  transacción)  adecuado  para  usar  con  otras  funciones  de  este  paquete,  como  SEEK,  READ_DATA  y  CLOSE_HANDLE.

Parámetros  de  entrada):

•  Tipo  BLOB  BLOB  NO  NULO

Tipo  de  retorno:  ENTERO  NO  NULO.

Función  IS_WRITABLE

RDB$BLOB_UTIL.IS_WRITABLE  devuelve  TRUE  cuando  BLOB  es  adecuado  para  agregar  datos  sin  copiar  usando  BLOB_APPEND.

Parámetros  de  entrada):

•  Tipo  BLOB  BLOB  NO  NULO

Tipo  de  retorno:  BOOLEAN  NOT  NULL.

Función  LEER_DATOS

RDB$BLOB_UTIL.READ_DATA  se  usa  para  leer  fragmentos  de  datos  de  un  identificador  BLOB  abierto  con  
RDB$BLOB_UTIL.OPEN_BLOB.  Cuando  el  BLOB  se  lee  por  completo  y  no  hay  más  datos,  devuelve  NULL.

Si  se  pasa  LONGITUD  con  un  número  positivo,  devuelve  un  VARBINARIO  con  su  longitud  máxima.

Si  LENGTH  es  NULL,  devuelve  solo  un  segmento  del  BLOB  con  una  longitud  máxima  de  32765.

Parámetros  de  entrada):

•  MANEJO  tipo  ENTERO  NO  NULO

•  LONGITUD  tipo  ENTERO

Tipo  de  valor  devuelto:  VARBINARIO(32767).

Función  BUSCAR

RDB$BLOB_UTIL.SEEK  se  usa  para  establecer  la  posición  para  el  próximo  READ_DATA,  devuelve  la  nueva  posición.

MODE  puede  ser  0  (desde  el  inicio),  1  (desde  la  posición  actual)  o  2  (desde  el  final).

Cuando  MODE  es  2,  OFFSET  debe  ser  cero  o  negativo.

Parámetros  de  entrada):

•  MANEJO  tipo  ENTERO  NO  NULO

•  MODO  tipo  ENTERO  NO  NULO

•  Tipo  de  DESPLAZAMIENTO  ENTERO  NO  NULO

Tipo  de  retorno:  ENTERO  NO  NULO.

26
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

Procedimiento  CANCEL_BLOB

RDB$BLOB_UTIL.CANCEL_BLOB  se  usa  para  liberar  inmediatamente  un  BLOB  temporal,  como  uno  creado  con  BLOB_APPEND.

Tenga  en  cuenta  que  si  se  usa  el  mismo  BLOB  después  de  cancelar,  usando  la  misma  variable  u  otra  con  la  misma  referencia  de  ID  de  
BLOB,  se  generará  un  error  de  ID  de  blob  no  válido.

Procedimiento  CLOSE_HANDLE

RDB$BLOB_UTIL.CLOSE_HANDLE  se  usa  para  cerrar  un  identificador  BLOB  abierto  con  RDB$BLOB_UTIL.OPEN_BLOB.

Los  identificadores  que  no  se  cierran  explícitamente  solo  se  cierran  automáticamente  cuando  finaliza  la  transacción.

Parámetros  de  entrada):

•  MANEJO  tipo  ENTERO  NO  NULO

Ejemplos
Cree  un  BLOB  en  el  espacio  temporal  y  devuélvalo  en  EJECUTAR  BLOQUE

ejecutar  devoluciones  de  bloque  (b  blob)
como

    
comenzar:  crea  un  identificador  BLOB  en  el  espacio  temporal.
b  =  rdb$blob_util.new_blob(falso,  verdadero);

     ­­  Agregar  fragmentos  de  datos.

b  =  blob_append(b,  '12345');  b  =  
blob_append(b,  '67');

suspender;  fin

Abra  un  BLOB  y  devuelva  fragmentos  con  EXECUTE  BLOCK

ejecutar  devoluciones  de  bloque  (s  varchar(10))
como

declarar  b  blob  =  '1234567';  declarar  bhandle  
entero;  begin  ­­  Abra  el  BLOB  y  obtenga  
un  
     identificador  de  BLOB.
bhandle  =  rdb$blob_util.open_blob(b);

     ­­  Obtener  fragmentos  de  datos  como  cadenas  y  devolverlos.

s  =  rdb$blob_util.read_data(bhandle,  3);  suspender;

s  =  rdb$blob_util.read_data(bhandle,  3);

27
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

suspender;

s  =  rdb$blob_util.read_data(bhandle,  3);  suspender;

     ­­  Aquí  se  encuentra  EOF,  por  lo  que  devuelve  
NULL.  s  =  rdb$blob_util.read_data(bhandle,  3);  suspender;

  ­­  Cierre  el  identificador  BLOB.  
ejecutar  el  procedimiento  rdb$blob_util.close_handle(bhandle);  fin

Buscar  en  un  blob

establecer  plazo !;

ejecutar  devoluciones  de  bloque  (s  varchar(10))
como

declarar  b  blob;  declarar  
bhandle  entero;  comenzar:  crea  un  

identificador  BLOB  de  flujo.  b  =  
    

rdb$blob_util.new_blob(falso,  verdadero);

     ­­  Agregar  datos.

b  =  blob_append(b,  '0123456789');

     ­­  Abra  el  BLOB.  
bhandle  =  rdb$blob_util.open_blob(b);

     ­­  Buscar  a  5  desde  el  inicio.  
rdb$blob_util.seek(bhandle,  0,  5);  s  =  
rdb$blob_util.read_data(bhandle,  3);  suspender;

     ­­  Buscar  a  2  desde  el  inicio.  
rdb$blob_util.seek(bhandle,  0,  2);  s  =  
rdb$blob_util.read_data(bhandle,  3);  suspender;

     ­­  Avance  2.
rdb$blob_util.seek(bhandle,  1,  2);  s  =  
rdb$blob_util.read_data(bhandle,  3);  suspender;

     ­­  Buscar  a  ­1  desde  el  final.
rdb$blob_util.seek(bhandle,  2,  ­1);  s  =  
rdb$blob_util.read_data(bhandle,  3);  suspender;

28
Machine Translated by Google
Capítulo  3.  Cambios  en  el  motor  Firebird

¡fin!

establecer  plazo ;!

Comprobar  si  los  blobs  se  pueden  escribir

crear  tabla  t(b  blob);

establecer  plazo !;

ejecutar  devoluciones  de  bloque  (bool  booleano)
como

declarar  b  blob;  comenzar  
b  =  
blob_append(null,  'escribible');  bool  =  
rdb$blob_util.is_writable(b);  suspender;

insertar  en  t  (b)  valores  ('no  escribibles')  que  devuelven  b  en  b;  bool  =  
rdb$blob_util.is_writable(b);  suspender;  ¡fin!

establecer  plazo ;!

29
Machine Translated by Google
Capítulo  4.  Cambios  en  Firebird  API  y  ODS

Capítulo  4.  Cambios  en  Firebird  API  y  ODS

desde  el  lanzamiento  de  Firebird  4.0

Cambios  en  ODS  (estructura  en  disco)
Nuevo  Número  ODS  Menor

Firebird  5.0  crea  bases  de  datos  con  una  versión  ODS  (Estructura  en  disco)  de  13.1.  También  puede  funcionar  con  bases  de  datos  

creadas  en  ODS  13.0  (por  Firebird  4.0),  pero  algunas  características  nuevas  no  estarán  disponibles.

Nuevas  tablas  del  sistema

Tablas  del  sistema  añadidas  en  ODS  13.1:

RDB$  PALABRAS  CLAVE
Tabla  virtual  que  enumera  las  palabras  clave  utilizadas  por  el  analizador  SQL

MON$COMPILED_STATEMENTS  Tabla  virtual  que  informa  declaraciones  compiladas

Nuevas  columnas  en  las  tablas  del  sistema

Se  agregaron  las  columnas  RDB$CONDITION_SOURCE  y  RDB$CONDITION_BLR  a  la  tabla  del  sistema  RDB$INDICES,  pertenecen  
a  la  función  de  índices  parciales.

La  tabla  virtual  MON$ATTACHMENTS  se  amplió  con  la  nueva  columna  MON$SESSION_TIMEZONE.  Además,  se  agregó  la  columna  

MON$COMPILED_STATEMENT_ID  a  las  tablas  del  sistema  MON$STATEMENTS  y  MON$CALL_STACK.  La  tabla  virtual  
SEC$GLOBAL_AUTH_MAPPING  ahora  tiene  la  nueva  columna  SEC$DESCRIPTION.

Interfaces  de  programación  de  aplicaciones
La  versión  del  protocolo  de  conexión  para  la  API  de  Firebird  5.0  es  18.  Las  adiciones  y  los  cambios  se  describen  en  las  secciones  a  
continuación.

Extensiones  principales  de  la  API

Se  han  agregado  varios  métodos  nuevos  a  las  siguientes  interfaces.

Conjunto  resultante

void  getInfo(Status  status,  uint  
     itemsLength,  const  uchar*  items,  uint  
  bufferLength,  uchar*  buffer);

Permite  consultar  la  información  del  cursor.  Actualmente,  solo  se  admite  una  solicitud  de  información,  INF_RECORD_COUNT.  
INF_RECORD_COUNT  devuelve  el  número  de  registros  almacenados  en  caché  por  el  cursor  desplazable,

30
Machine Translated by Google
Capítulo  4.  Cambios  en  Firebird  API  y  ODS

o  ­1  para  un  cursor  unidireccional  (solo  hacia  adelante).

Extensiones  a  varios  métodos  getInfo()

Declaración::getInfo()

Se  agregaron  las  siguientes  acciones:

isc_info_sql_exec_path_blr_bytes  Ruta  de  ejecución  como  BLR  (formato  binario)

isc_info_sql_exec_path_blr_text Ruta  de  ejecución  como  BLR  (formato  textual)

Extensiones  de  API  de  servicios

Soporte  para  operaciones  paralelas

Se  agregó  soporte  para  operaciones  paralelas.

Se  agregaron  las  siguientes  opciones:

isc_spb_bkp_parallel_workers  número  de  trabajadores  paralelos  para  respaldo

isc_spb_res_parallel_workers  número  de  trabajadores  paralelos  para  la  restauración

isc_spb_rpr_par_workers número  de  trabajadores  paralelos  para  el  barrido

Ejemplos  de  uso  de  nuevos  parámetros  en  la  utilidad  fbsvcmgr  (el  inicio  de  sesión  y  la  contraseña  se  omitieron  por  brevedad):

fbsvcmgr  ­action_backup  ­bkp_parallel_workers  4  <dbname>  <backupname>  
fbsvcmgr  ­action_restore  ­res_parallel_workers  4  <backupname>  <dbname>  
fbsvcmgr  ­action_repair  ­rpr_sweep_db  ­rpr_par_workers  4  <dbname>

Soporte  para  gfix  ­upgrade

Se  agregó  soporte  para  actualizaciones  menores  de  ODS.

Se  agregó  la  siguiente  opción:

base  de  datos  de  actualización  isc_spb_rpr_upgrade_db

Ejemplo  de  uso  de  un  nuevo  parámetro  en  la  utilidad  fbsvcmgr  (el  nombre  de  usuario  y  la  contraseña  se  omitieron  por  brevedad):

fbsvcmgr  ­action_repair  ­rpr_upgrade_db  <nombrebd>

31
Machine Translated by Google
Capítulo  5.  Palabras  reservadas  y  cambios

Capítulo  5.  Palabras  reservadas  y  cambios
Nuevas  palabras  clave  en  Firebird  5.0

no  reservado
BLOQUEADO

OBJETIVO

TIMEZONE_NOMBRE

UNICODE_CHAR

UNICODE_VAL

32
Machine Translated by Google
Capítulo  6.  Adiciones  y  cambios  de  configuración

Capítulo  6.  Adiciones  y  cambios  de  
configuración
Nuevos  parámetros  de  configuración:

Parámetros  para  operaciones  paralelas

MaxParallelWorkers

Limita  la  cantidad  total  de  trabajadores  paralelos  que  se  pueden  crear  dentro  de  un  solo  proceso  de  Firebird  para  cada  base  de  datos  adjunta.  Se  permiten  

valores  enteros  en  el  rango  entre  1  (sin  paralelismo)  y  64.

Todos  los  demás  valores  se  ignoran  silenciosamente  y  se  usa  el  valor  predeterminado  de  1.

  Los  trabajadores  se  contabilizan  para  cada  base  de  datos  adjunta  de  forma  independiente.

ParallelWorkers

Especifica  el  número  predeterminado  de  trabajadores  paralelos  para  una  sola  tarea.  Se  permiten  valores  enteros  en  el  rango  entre  1  (sin  paralelismo)  y  

MaxParallelWorkers  (ver  arriba).  Todos  los  demás  valores  se  ignoran  silenciosamente  y  se  usa  el  valor  predeterminado  de  1.

Otros  parámetros

MaxStatementCacheSize

Define  la  cantidad  máxima  de  memoria  utilizada  para  almacenar  en  caché  las  sentencias  compiladas  de  DSQL  no  utilizadas.  El  valor  de  cero  significa  que  

no  se  utiliza  el  almacenamiento  en  caché  de  sentencias.  El  valor  predeterminado  es  de  2  megabytes.

OnDisconnectTriggerTimeout

Configura  un  tiempo  de  espera  (en  segundos)  que  se  aplica  a  la  ejecución  del  disparador  ON  DISCONNECT.  El  disparador  será  cancelado  automáticamente  

por  el  motor  después  de  que  haya  pasado  el  tiempo  especificado.  El  valor  de  cero  ('0')  significa  que  no  se  ha  establecido  ningún  tiempo  de  espera.  El  valor  
predeterminado  es  180  segundos.

Complemento  de  perfil  predeterminado

Especifica  el  complemento  del  generador  de  perfiles  predeterminado  que  se  usa  para  perfilar  las  conexiones  mediante  el  paquete  RDB$PROFILER.

Parámetros  de  configuración  modificados

Complemento  WireCrypt

Se  agregó  una  nueva  variante  (que  usa  un  contador  interno  de  64  bits  en  lugar  de  32  bits)  del  complemento  ChaCha#20.

El  nuevo  valor  predeterminado  de  este  parámetro  ahora  es  ChaCha64,  ChaCha,  Arc4.

33
Machine Translated by Google
Capítulo  6.  Adiciones  y  cambios  de  configuración

Parámetros  de  configuración  eliminados:

RemotePipeName
Este  parámetro  se  eliminó  junto  con  la  eliminación  de  la  compatibilidad  con  el  protocolo  WNET  (también  conocido  como  canalizaciones  con  
nombre)  para  Windows.

TcpLoopbackFastPath
Este  parámetro  se  eliminó  porque  Microsoft  desaconseja  el  uso  de  la  opción  de  socket  SIO_LOOPBACK_FAST_PATH.

Cambios  y  adiciones  a  la  configuración  de  replicación
cascada_replicación
Nuevo  parámetro  que  especifica  si  los  cambios  aplicados  a  la  base  de  datos  de  réplica  también  estarán  sujetos  a  más  replicaciones  (si  se  

configura  alguna).  El  valor  predeterminado  es  falso  (la  cascada  está  deshabilitada).

Permitir  macros  en  replication.conf
Las  macros  de  archivos  de  configuración  ahora  también  son  compatibles  con  replication.conf.

34
Machine Translated by Google
Capítulo  7.  Seguridad

Capítulo  7.  Seguridad
Las  mejoras  de  seguridad  en  Firebird  5  incluyen:

Privilegio  del  sistema  PROFILE_ANY_ATTACHMENT
Se  ha  agregado  el  nuevo  privilegio  de  sistema  PROFILE_ANY_ATTACHMENT  al  motor.

Cuando  se  utiliza  la  generación  de  perfiles  de  SQL  remoto  y  el  archivo  adjunto  que  se  perfila  es  de  un  usuario  diferente,  el  usuario  
que  llama  debe  tener  este  privilegio  del  sistema.

Vea  más  detalles  en  el  capítulo  del  generador  de  perfiles  SQL  y  PSQL .

35
Machine Translated by Google
Capítulo  8.  Lenguaje  de  definición  de  datos  (DDL)

Capítulo  8.  Lenguaje  de  definición  de  datos  (DDL)
enlaces  rápidos

•  Soporte  para  índices  parciales

•  COMENTARIO  SOBRE  EL  MAPEO

Soporte  para  índices  parciales

dmitri  yemanov

Boleto  de  rastreador:  #7257

Esta  característica  permite  indexar  solo  un  subconjunto  de  filas  de  tablas  definidas  por  la  condición  de  búsqueda  especificada  
durante  la  creación  del  índice.

Reglas  de  sintaxis:

CREAR  [ÚNICO]  [{ASC[FINAL]  |  DESC[ENDING]}]  INDEX  <nombre_índice>  ON  <nombre_tabla>  
{ (<lista_columnas>)  |  COMPUTADO  [POR]  ( <valor_expresión> ) }
WHERE  <condición_de_búsqueda>

Ejemplos:

­­  1.
CREAR  ÍNDICE  IT1_COL  EN  T1  (COL)  DONDE  COL  <  100;  
SELECCIONE  *  DESDE  T1  DONDE  COL  <  
100;  ­­  PLAN  (ÍNDICE  T1  (IT1_COL))

­­  2.
CREAR  ÍNDICE  IT1_COL2  EN  T1  (COL)  DONDE  COL  NO  ES  NULO;  
SELECCIONE  *  DESDE  T1  DONDE  COL  >  
100;  PLAN  (ÍNDICE  T1  IT1_COL2)

­­  3.
CREAR  ÍNDICE  IT1_COL3  EN  T1  (COL)  DONDE  COL  =  1  O  COL  =  2;
SELECCIONE  *  DESDE  T1  DONDE  COL  =  2;
PLAN  (ÍNDICE  T1  IT1_COL3)

Notas:

1.  Una  definición  de  índice  parcial  puede  incluir  la  especificación  ÚNICA.  En  este  caso,  se  requiere  que  cada  clave  en  el  índice  
sea  única.  Esto  permite  imponer  la  unicidad  en  algún  subconjunto  de  la  tabla
filas

2.  Un  índice  parcial  solo  se  puede  utilizar  en  los  siguientes  casos:

36
Machine Translated by Google
Capítulo  8.  Lenguaje  de  definición  de  datos  (DDL)

◦  La  condición  WHERE  incluye  exactamente  la  misma  expresión  booleana  que  la  definida  para
El  índice;

◦  La  condición  de  búsqueda  definida  para  el  índice  contiene  expresiones  booleanas  con  OR  y  una  de
ellos  está  explícitamente  incluido  en  la  condición  WHERE;

◦  La  condición  de  búsqueda  definida  para  el  índice  especifica  IS  NOT  NULL  y  la  condición  WHERE
incluye  una  expresión  en  el  mismo  campo  que  se  sabe  que  ignora  NULL.

COMENTARIO  SOBRE  EL  MAPEO

alex  peshkov

Boleto  de  rastreador:  #7046

Se  amplió  la  instrucción  COMMENT  ON  para  poder  agregar  un  comentario  a  un  MAPPING.

EL  COMENTARIO  SOBRE  LA  ASIGNACIÓN  <nombre  de  la  asignación>  ES  {<comentario>  |  NULO};

37
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

Capítulo  9.  Lenguaje  de  manipulación  de  datos  
(DML)

enlaces  rápidos
•  Cláusula  SKIP  LOCKED

•  Compatibilidad  con  CUANDO  NO  COINCIDE  CON  LA  FUENTE  en  la  instrucción  MERGE

•  Admite  múltiples  filas  para  DML  RETURNING

•  Permitir  expresiones  de  consulta  entre  paréntesis

•  Cambios  a  los  literales

•  Nuevas  expresiones  y  funciones  integradas

Cláusula  SKIP  LOCKED
Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #7350

SKIP  LOCKED  se  puede  usar  con  declaraciones  SELECT...  WITH  LOCK,  UPDATE  y  DELETE.  Hace  que  el  motor  omita  los  registros  

bloqueados  por  otras  transacciones  en  lugar  de  esperarlos  o  generar  errores  de  conflicto.

Esto  es  muy  útil  para  implementar  colas  de  trabajo  donde  uno  o  más  procesos  publican  trabajo  en  una  tabla  y  emiten  un  evento,  mientras  que  
los  trabajadores  escuchan  eventos  y  leen/eliminan  elementos  de  la  tabla.  Al  usar  SKIP  LOCKED,  varios  trabajadores  pueden  obtener  
elementos  de  trabajo  exclusivos  de  la  mesa  sin  conflictos.

Sintaxis:

SELECCIONAR

[PRIMERO ...]
[SALTAR ...]
DESDE  <alguna  tabla>  
[DONDE...]
[PLAN ...]
[ORDENAR  POR...]
[{ FILAS ... }  |  {DESPLAZAMIENTO...}  |  {BUSCAR ...}]
[PARA  ACTUALIZAR  [DE...]]
[CON  BLOQUEO  [SALIR  BLOQUEADO]]

ACTUALIZAR  <alguna  
tabla>  SET...
[DÓNDE ...]
[PLAN ...]
[ORDENAR  POR...]
[FILAS...]
[SALTAR  BLOQUEADO]

38
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

[VOLVIENDO...]

DELETE  FROM  <alguna  tabla>  
[DONDE...]
[PLAN ...]
[ORDENAR  POR...]
[FILAS...]
[SALTAR  BLOQUEADO]
[VOLVIENDO...]

Como  sucede  con  las  subcláusulas  FIRST/SKIP/ROWS/OFFSET/FETCH,  el  bloqueo  de  registro  (y  la  
verificación  de  "salto  bloqueado")  se  realiza  entre  el  salto  (SKIP/ROWS/OFFSET/FETCH)  y  el  límite  
(FIRST /ROWS/OFFSET/FETCH )  cheques.

Ejemplos:

•  Preparar  metadatos

crear  tabla  emails_queue  (asunto  
varchar(60)  no  nulo,  texto  blob  sub_tipo  texto  
no  nulo);

establecer  plazo !;

crear  emails_queue_ins  desencadenantes  después  de  insertar  en  emails_queue
como

comenzar  post_event('EMAILS_QUEUE');  
¡fin!

establecer  plazo ;!

•  Aplicación  o  rutina  del  remitente

insertar  en  emails_queue  (asunto,  texto)  valores  
('Asunto  del  correo  electrónico',  'Texto  del  correo  electrónico...');  
comprometerse;

•  Aplicación  de  cliente

­­  La  aplicación  cliente  puede  escuchar  el  evento  ̀EMAILS_QUEUE`  para  enviar  correos  electrónicos  con  esta  
consulta:

eliminar  de  emails_queue  filas  10  
omitir  
bloqueado

39
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

sujeto  recurrente,  texto;

Es  posible  que  se  esté  ejecutando  más  de  una  instancia  de  la  aplicación,  por  ejemplo,  para  equilibrar  la  carga.

Compatibilidad  con  CUANDO  NO  COINCIDE  CON  LA  FUENTE  en  la  
instrucción  MERGE

Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #6681

Sintaxis:

<combinar  cuando> ::=  
     <combinar  cuando  coincida>  |  
     <fusionar  cuando  no  coincida>  <fusionar  
     cuando  no  coincida  con  el  destino>  |  <combinar  cuando  no  
     coincida  con  la  fuente>

<combinar  cuando  no  coincida  con  el  objetivo> ::=
     CUANDO  NO  COINCIDE  [POR  OBJETIVO]  [Y  <condición>]  ENTONCES
     INSERT  [ <paréntesis  izquierdo>  <lista  de  columnas>  <paréntesis  derecho> ]
     VALUES  <paréntesis  izquierdo>  <lista  de  valores>  <paréntesis  derecho>

<combinar  cuando  no  coincide  con  la  fuente> ::=
     CUANDO  NO  COINCIDE  CON  LA  FUENTE  [Y  <condición>]  ENTONCES
  { UPDATE  SET  <lista  de  tareas>  |  BORRAR }

Se  llama  a  <merge  when  not  matched  by  target>  cuando  un  registro  de  origen  no  coincide  con  ningún  registro  en  el  destino.
INSERT  cambiará  la  tabla  de  destino.

Se  llama  a  <merge  when  not  matched  by  source>  cuando  un  registro  de  destino  no  coincide  con  ningún  registro  en  el  origen.
ACTUALIZAR  o  ELIMINAR  cambiará  la  tabla  de  destino.

Ejemplo:

UNIR
EN  clientes  c

UTILIZANDO  new_customers  nc  ON  (c.id  
=  nc.id)
CUANDO  EMPAREJADO  ENTONCES

     ACTUALIZAR  CONJUNTO  nombre  =  cd.nombre

CUANDO  NO  COINCIDE  CON  LA  FUENTE  ENTONCES

  BORRAR

40
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

Admite  múltiples  filas  para  DML  RETURNING
Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #6815

En  DSQL,  la  cláusula  RETURNING  ahora  puede  devolver  varias  filas  para  declaraciones  DML  que  pueden  afectar  a  
varias  filas.

Consulte  las  notas  de  compatibilidad  en  DEVOLUCIÓN  para  obtener  más  información.

Permitir  expresiones  de  consulta  entre  paréntesis
Adriano  dos  Santos  Fernández

Boleto  de  rastreador:  #6740

La  sintaxis  DML  se  amplió  para  permitir  una  expresión  de  consulta  entre  paréntesis  (seleccione  incluyendo  las  
cláusulas  order  by,  offset  y  fetch,  pero  sin  la  cláusula  with)  donde  anteriormente  solo  se  permitía  una  especificación  
de  consulta  (seleccione  sin  las  cláusulas  with,  order  by,  offset  y  fetch) .

Esto  permite  consultas  más  expresivas,  especialmente  en  sentencias  UNION,  y  ofrece  más  compatibilidad  con  
sentencias  generadas  por  ciertos  ORM.

El  uso  de  expresiones  de  consulta  entre  paréntesis  tiene  un  costo,  ya  que  consumen  un  contexto  
de  consulta  adicional  en  comparación  con  una  especificación  de  consulta  simple.  El  número  
máximo  de  contextos  de  consulta  en  una  declaración  es  255.

Ejemplo:

(seleccione  emp_no,  salario,  'más  bajo'  como  
tipo  de  orden  de  
empleado  por  salario  
asc,  obtenga  solo  la  

primera  

fila)  union  all  (seleccione  emp_no,  salario,  'más  
alto'  como  tipo  
de  orden  de  empleado  
por  salario  desc,  obtenga  
solo  la  primera  fila);

Cambios  a  los  literales

41
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

Sintaxis  literal  completa  de  la  cadena  de  caracteres  estándar  de  SQL

Adriano  dos  Santos  Fernández

Ticket  de  seguimiento:  https://github.com/FirebirdSQL/firebird/issues/5589

La  sintaxis  de  los  literales  de  cadena  de  caracteres  se  cambió  para  admitir  la  sintaxis  estándar  de  SQL  completa.  Esto  
significa  que  un  literal  puede  ser  "interrumpido"  por  un  espacio  en  blanco  o  un  comentario.  Esto  se  puede  usar,  por  
ejemplo,  para  dividir  un  literal  largo  en  varias  líneas  o  proporcionar  comentarios  en  línea.

<literal  de  cadena  de  caracteres> ::=  
[ <presentador>  <especificación  de  conjunto  de  
caracteres> ]  <comilla>  [ <representación  de  caracteres>... ]  
<comilla>  [ { <separador>  <comilla>  [ <representación  de  caracteres>... ]  <cita> }... ]

<separador> ::=  
{ <comentario>  |  <espacio  en  blanco> }...

—  ISO/IEC  9075­2:2016  SQL  ­  Parte  2:  Fundamentos

Ejemplos:

­­  espacio  en  blanco  entre  
selección  
 
literal  'ab'  'cd'  de  
RDB$DATABASE;  ­­  salida:  'abcd'

­­  comentario  y  espacio  en  blanco  entre  literal  
select  'ab' /*  comentario  */  'cd'  from  
RDB$DATABASE;  
­­  salida:  'abcd'

Sintaxis  literal  de  cadena  binaria  estándar  de  SQL  completo

Adriano  dos  Santos  Fernández

Ticket  de  seguimiento:  https://github.com/FirebirdSQL/firebird/issues/5588

La  sintaxis  de  los  literales  de  cadenas  binarias  se  cambió  para  admitir  la  sintaxis  estándar  de  SQL  completa.  Esto  
significa  que  un  literal  puede  contener  espacios  para  separar  caracteres  hexadecimales  y  puede  ser  "interrumpido"  por  
espacios  en  blanco  o  un  comentario.  Esto  se  puede  usar,  por  ejemplo,  para  hacer  que  la  cadena  hexadecimal  sea  más  
legible  agrupando  caracteres,  o  para  dividir  un  literal  largo  en  varias  líneas,  o  proporcionar  comentarios  en  línea.

<literal  de  cadena  binaria> ::=  
X  <comilla>  [ <espacio>... ]  [ { <hexágono>  [ <espacio>... ]  <hexágono>  [ <espacio>... ] }... ]  <  
comilla>  
[ { <separador>  <comilla>  [ <espacio>... ]  [ { <hexit>  [ <espacio>... ]

42
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

<hexit>  [ <espacio>... ] }... ]  <comilla> }... ]

—  ISO/IEC  9075­2:2016  SQL  ­  Parte  2:  Fundamentos

Ejemplos

­­  Grupo  por  byte  (espacio  en  blanco  dentro  del  literal)  
seleccione  _win1252  x'42  49  4e  41  52  59'  de  
RDB$DATABASE;  ­­  
salida:  BINARIO

­­  espacio  en  blanco  entre  selección  
literal  _win1252  x'42494e'  
  '415259'  
de  RDB$DATABASE;  
­­  salida:  BINARIO

El  uso  del  introductor  _win1252  en  el  ejemplo  anterior  es  una  extensión  no  estándar  y  
equivalente  a  una  conversión  explícita  a  un  CHAR  de  longitud  adecuada  con  el  juego  de  
caracteres  WIN1252.

Nuevas  expresiones  y  funciones  integradas
UNICODE_CHAR  y  UNICODE_VAL

Adriano  dos  Santos  Fernández

UNICODE_CHAR

Devuelve  el  carácter  UNICODE  con  el  punto  de  código  especificado.

Sintaxis:

UNICODE_CHAR( <número> )

El  argumento  para  UNICODE_CHAR  debe  ser  un  punto  de  código  UNICODE  válido  y  no  estar  
en  el  rango  de  suplentes  alto/bajo  (0xD800  a  0xDFFF),  de  lo  contrario  arroja  un  error.

Ejemplo:

seleccione  unicode_char(x)  de  y;

UNICODE_VAL

Devuelve  el  punto  de  código  UNICODE  del  primer  carácter  de  la  cadena  especificada,  o  cero  si  la  cadena  es

43
Machine Translated by Google
Capítulo  9.  Lenguaje  de  manipulación  de  datos  (DML)

vacío.

Sintaxis:

UNICODE_VAL( <cadena> )

Ejemplo:

seleccione  unicode_val(x)  de  y;

44
Machine Translated by Google
Capítulo  10.  Utilidades  de  supervisión  y  línea  de  comandos

Capítulo  10.  Utilidades  de  supervisión  y  línea  de  
comandos
Las  mejoras  y  adiciones  a  los  servicios  públicos  de  Firebird  continúan.

Supervisión
Nuevas  mesas  virtuales:

RDB$  PALABRAS  CLAVE:

RDB$PALABRA  CLAVE_NOMBRE
nombre  de  la  palabra  clave

RDB$KEYWORD_RESERVED  Si  la  palabra  clave  es  una  palabra  reservada

MON$COMPILED_STATEMENTS:

MON$COMPILED_STATEMENT_ID  ID  de  extracto  compilado

MON$SQL_TEXT Texto  de  la  consulta  SQL

MON$EXPLAINED_PLAN Plan  (en  la  forma  explicada)  de  la  consulta  SQL

MON$OBJECT_NAME Nombre  del  objeto  PSQL

MON$OBJECT_TYPE tipo  de  objeto  PSQL

MON$PAQUETE_NOMBRE Nombre  del  paquete  del  objeto  PSQL

MON$STAT_ID ID  de  estadísticas  de  tiempo  de  ejecución  (hace  referencia  a  las  tablas  MON$*_STATS)

Nuevas  columnas  en  las  tablas:

En  MON$ADJUNTOS:

MON$SESSION_TIMEZONE Zona  horaria  real  de  la  sesión

En  MON$DECLARACIONES:

MON$COMPILED_STATEMENT_ID  ID  de  declaración  compilada  (referencias  MON$COMPILED_STATEMENTS)

En  MON$CALL_STACK:

MON$COMPILED_STATEMENT_ID  ID  de  declaración  compilada  (referencias  MON$COMPILED_STATEMENTS)

En  SEC$GLOBAL_AUTH_MAPPING:

SEC$DESCRIPTION  Descripción  textual

45
Machine Translated by Google
Capítulo  10.  Utilidades  de  supervisión  y  línea  de  comandos

isql

Unifique  la  visualización  de  los  procedimientos  y  paquetes  del  sistema  con  otros  objetos  del  sistema

alex  peshkov

Boleto  de  rastreador:  #7411

El  comando  SHOW  SYSTEM  de  isql  ahora  enumera  los  paquetes  del  sistema  y  sus  procedimientos.

  Actualmente  no  se  muestran  las  funciones  de  los  paquetes  del  sistema.  Esto  es  rastreado  por  #7475.

gbak

Copia  de  seguridad/restauración  en  paralelo

Vlad  Khorsun

Boletos  de  seguimiento:  #1783,  #3374

Se  ha  agregado  un  nuevo  modificador  de  línea  de  comandos  a  gbak:  ­PAR[ALLEL]  <N>.

Define  cuántos  trabajadores  paralelos  se  utilizarán  para  la  tarea  solicitada.

Ejemplos  de  uso:

gbak  ­b  ­par  4  ­user  <nombre  de  usuario>  ­pass  <contraseña>  <nombre  de  base  de  datos>  <nombre  de  copia  de  seguridad>  

gbak  ­r  ­par  4  ­user  <nombre  de  usuario>  ­pass  <contraseña>  <nombre  de  copia  de  seguridad>  <nombre  de  base  de  datos>

arreglar

barrido  paralelo

Vlad  Khorsun

Boletos  de  seguimiento:  #7447

Se  ha  agregado  un  nuevo  modificador  de  línea  de  comandos  a  gfix:  ­PAR[ALLEL]  <N>.

Define  cuántos  trabajadores  paralelos  se  utilizarán  para  la  tarea  solicitada.

Ejemplo  de  uso:

gfix  ­sweep  ­par  4  ­user  <nombre  de  usuario>  ­pass  <contraseña>  <nombre  de  base  de  datos>

46
Machine Translated by Google
Capítulo  10.  Utilidades  de  supervisión  y  línea  de  comandos

actualización  SAO

dmitri  yemanov

Boletos  de  seguimiento:  #7397

Se  ha  agregado  un  nuevo  modificador  de  línea  de  comandos  a  gfix:  ­UP[GRADE].

Permite  actualizar  ODS  de  la  base  de  datos  a  la  última  versión  secundaria  admitida  (dentro  de  la  versión  principal  admitida).

Ejemplo(s)  de  uso:

gfix  ­upgrade  <nombrebd>  ­user  <nombre  de  usuario>  ­pass  <contraseña>

47
Machine Translated by Google
Capítulo  11.  Problemas  de  compatibilidad

Capítulo  11.  Problemas  de  compatibilidad
Esta  sección  enumera  las  funciones  y  modificaciones  que  pueden  afectar  la  forma  en  que  ha  instalado  y  utilizado  Firebird  en  
versiones  anteriores.

sql
Cambios  que  pueden  afectar  el  código  SQL  existente:

Comportamiento  de  RETORNO  de  varias  filas

INSERTAR  del  lado  del  cliente...  Las  consultas  SELECCIONAR,  ACTUALIZAR,  ELIMINAR,  COMBINAR  y  ACTUALIZAR  O  
INSERTAR  que  contienen  la  cláusula  RETURNING  ahora  pueden  devolver  varios  registros  en  lugar  de  generar  el  error  
"múltiples  filas  en  selección  de  singleton"  como  sucedió  antes.

Estas  consultas  ahora  se  describen  como  isc_info_sql_stmt_select  durante  la  preparación,  mientras  que  en  versiones  anteriores  
se  describían  como  isc_info_sql_stmt_exec_procedure.

Las  sentencias  Singleton  INSERT  …  VALUES,  así  como  las  sentencias  UPDATE  y  DELETE  posicionadas  (es  decir,  las  que  
contienen  la  cláusula  WHERE  CURRENT  OF)  conservan  el  comportamiento  existente  y  se  describen  como  
isc_info_sql_stmt_exec_procedure.  También  conservan  la  capacidad  de  ejecutarse  dentro  de  un  solo  protocolo  de  ida  y  vuelta  
al  servidor.

Sin  embargo,  todas  estas  consultas,  si  se  usan  en  PSQL  y  se  aplica  la  cláusula  RETURNING,  aún  se  tratan  como  singleton.

Eliminación  del  protocolo  WNET
El  protocolo  de  red  WNET  (también  conocido  como  Named  Pipes,  también  conocido  como  NetBEIU)  que  anteriormente  era  
compatible  con  la  plataforma  Windows  se  eliminó  en  Firebird  5.0.  Aquellos  usuarios  de  Windows  que  operaron  con  cualquier  
cadena  de  conexión  WNET  (\\servidor\nombrebd  o  wnet://servidor/nombrebd)  deberían  cambiar  al  protocolo  INET  (TCP)  en  su  
lugar  (cadena  de  conexión  servidor:nombrebd,  servidor/puerto:nombrebd,  inet:/ /servidor/nombrebd,  o  inet://servidor:puerto/
nombrebd).

Eliminación  de  QLI
La  utilidad  de  línea  de  comandos  QLI  se  eliminó  en  Firebird  5.0,  de  acuerdo  con  su  anuncio  de  obsolescencia  publicado  en  las  
notas  de  la  versión  de  Firebird  4.0.

48
Machine Translated by Google
Capítulo  12.  Errores  corregidos

Capítulo  12.  Errores  corregidos

Versión  Firebird  5.0  Beta  1:  Corrección  de  errores

Esta  sección  enumera  solo  las  correcciones  de  errores  que  aún  no  se  han  solucionado  en  versiones  anteriores  de  Firebird.

motor  central

#7422  —  Buscar  en  el  nivel  de  blob  temporal  0  hace  que  la  lectura  devuelva  datos  incorrectos

Arreglado  por  Adriano  dos  Santos  Fernandes

#7388  —  Optimización  de  diferentes  invariantes  entre  vistas  y  CTE

Reparado  por  Dmitry  Yemanov

#7304  —  Los  eventos  en  los  archivos  adjuntos  del  sistema  (como  el  recolector  de  basura)  no  se  rastrean

Reparado  por  Alex  Peshkov

#7227  —  Las  dependencias  de  las  subrutinas  no  se  conservan  después  de  la  restauración  de  la  copia  de  seguridad

Arreglado  por  Adriano  dos  Santos  Fernandes

#7220  —  Dependencia  de  TIPO  DE  COLUMNA  no  rastreada  en  el  encabezado  del  paquete  y  rutinas  externas

Arreglado  por  Adriano  dos  Santos  Fernandes

#7183  —  Regresión  cuando  la  tabla  derivada  tiene  una  columna  evaluada  como  resultado  de  una  subconsulta  con  predicado  IN,  ANY  o  ALL:  "BLR  no  

válido  en  el  desplazamiento.../el  contexto  ya  está  en  uso"

Arreglado  por  Adriano  dos  Santos  Fernandes

#7164  —  Las  combinaciones  multidireccionales  hash/merge  son  imposibles  para  las  claves  basadas  en  expresiones

Reparado  por  Dmitry  Yemanov

#7133  —  ORDER  BY  para  valores  int128  grandes  (>34  dígitos)  se  interrumpe  cuando  se  usa  el  índice  en  ese  campo

49
Machine Translated by Google
Capítulo  12.  Errores  corregidos

Reparado  por  Alex  Peshkov

#7077  —  EJECUTAR  BLOQUE  (sin  DEVOLUCIONES)  no  funciona  con  lotes

Arreglado  por  Adriano  dos  Santos  Fernandes

#7009  —  IReplicatedTransaction  recibe  un  evento  de  punto  de  guardado  incorrecto

Reparado  por  Dimitry  Sibiryakov,  Dmitry  Yemanov

#6942  —  Error  de  singleton  incorrecto  con  MERGE  y  RETURNING

Arreglado  por  Adriano  dos  Santos  Fernandes

#6869  —  La  expresión  CHECK  del  dominio  se  puede  ignorar  cuando  DROP  objetos  que  están  involucrados  en  él

Arreglado  por  Adriano  dos  Santos  Fernandes

#6807  —  Regresión:  error  "Fin  de  comando  inesperado"  con  información  de  línea/columna  incorrecta

Arreglado  por  Adriano  dos  Santos  Fernandes

#5749  —  Error  de  "Token  desconocido"  en  el  formulario  de  la  consulta

Arreglado  por  Adriano  dos  Santos  Fernandes

#3812  —  La  consulta  con  un  procedimiento  almacenado  no  acepta  un  plan  explícito

Reparado  por  Dmitry  Yemanov

#3218  —  Optimizer  falla  al  aplicar  predicados  locales  de  flujo  antes  de  la  fusión

Reparado  por  Dmitry  Yemanov

El  servidor  se  bloquea/colga

#7195  —  Bloqueo  al  acceder  a  la  memoria  ya  borrada  en  el  módulo  de  clasificación

50
Machine Translated by Google
Capítulo  12.  Errores  corregidos

Reparado  por  Andrey  Kravchenko

Utilidades

gbak

#7436  —  Error  de  copia  de  seguridad  para  tabla  ancha

Reparado  por  Alex  Peshkov

51
Machine Translated by Google
Capítulo  13.  Equipos  de  proyecto  Firebird  5.0

Capítulo  13.  Equipos  de  proyecto  Firebird  5.0
Tabla  1.  Equipos  de  desarrollo  de  Firebird

Desarrollador País Tareas  principales

dmitri  yemanov ruso Ingeniero/implementador  de  base  de  datos  de  tiempo  completo;  líder  del  


Federación equipo  central

Alejandro  Peshkov ruso Coordinador  de  funciones  de  seguridad  a  tiempo  completo;  maestro  de  


Federación construcción;  autoridad  portuaria

Vladyslav  Khorsun Ucrania Ingeniero  de  base  de  datos  a  tiempo  completo;  Diseñador/

implementador  de  características  SQL

Adriano  dos  Santos Brasil manejo  de  juegos  de  caracteres  internacionales;  texto  y  texto


fernandes mejoras  de  BLOB;  nuevas  características  de  DSQL;  
verificación  de  código

simakov  romano ruso Contribuciones  del  motor


Federación

dimitry  sibiryakov checo Contribuciones  de  motor  y  replicación


República

Ilia  Eremin ruso Contribuciones  del  motor


Federación

Playa  de  Pablo Francia Gerente  de  lanzamiento;  Compilaciones  de  MacOS;

pavel  cisar checo diseñador/coordinador  de  herramientas  QA;  coordinador  de  


República Firebird  Butler;  Desarrollador  de  controladores  Python

pavel  zotov ruso QA  tester  y  desarrollador  de  herramientas


Federación

pablo  reeves Francia Instaladores  y  compilaciones  de  Windows

Marcos  Rotteveel El implementador  y  co­coordinador  de  Jaybird;
Países  Bajos Escritor  de  documentación

Jiri  Cincura checo Desarrollador  y  coordinador  de  proveedores .NET


República

Martín  Koeditz Alemania  Desarrollador  y  coordinador  del  controlador  PHP
Traductor  de  documentación

Alexey  Kovyazin ruso coordinador  del  sitio  web


Federación

Helena  Borrie Australia Editor  de  notas  de  lanzamiento;  Jefe  de  la  Policía  del  Pensamiento

52
Machine Translated by Google
Apéndice  A:  Aviso  de  licencia

Apéndice  A:  Aviso  de  licencia
El  contenido  de  esta  Documentación  está  sujeto  a  la  Licencia  de  Documentación  Pública  Versión  1.0  (la  “Licencia”);  solo  puede  
usar  esta  Documentación  si  cumple  con  los  términos  de  esta  Licencia.
Las  copias  de  la  Licencia  están  disponibles  en  https://www.firebirdsql.org/pdfmanual/pdl.pdf  (PDF)  y  https://www.firebirdsql.org/
manual/pdl.html  (HTML).

La  documentación  original  se  titula  Firebird  5.0  Release  Notes.

El  escritor  inicial  de  la  documentación  original  es:  Helen  Borrie.  Las  personas  nombradas  en  las  atribuciones  son  Contribuyentes.

Derechos  de  autor  ©  2004­2023.  Reservados  todos  los  derechos.  Contacto  inicial  del  escritor:  helebor  at  users  punto  sourceforge  
punto  net.

53

También podría gustarte