Les fonctions SQL selon les versions d'Oracle V$SQLFN_METADATA - SQL functions according to Oracle versions V$SQLFN_METADATA
Introduction
Le dictionnaire de données d'Oracle renferme des milliers et des milliers de vues, certaines fondamentales comme DBA_TABLES, DBA_USERS alors que d'autres sont beaucoup plus anecdotiques voir quasi inconnues, comme V$SQLFN_METADATA.
Selon la doc Oracle "V$SQLFN_METADATA contains metadata about operators and built-in functions." De façon plus précise, elle contient l'historique d'apparition des opérateurs et fonctions SQL selon les versions d'Oracle!
OK, cette vue n'est pas importante mais c'est intéressant de fouiner dans ces petites vues, ne serait-ce que pour voir tout ce que Oracle mémorise comme infos. Et puis, qui sait quelles surprises on peut avoir...
Points d'attention
Aucun.
Base de tests
N'importe quelle base Oracle.
Exemples
============================================================================================
Répartition des fonctions par version d'Oracle
============================================================================================
Ma base est une Oracle 12.2.
SQL> select banner from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE 12.2.0.1.0 Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production
La structure de V$SQLFN_METADATA est la suivante; le champ qui nous importe est VERSION "Minimum version of the database that has this function."
SQL> desc V$SQLFN_METADATA
Name Null? Type
----------------------------------------------------------------------------------------------
FUNC_ID NUMBER
NAME VARCHAR2(128)
MINARGS NUMBER
MAXARGS NUMBER
DATATYPE VARCHAR2(8)
VERSION VARCHAR2(12)
ANALYTIC VARCHAR2(3)
AGGREGATE VARCHAR2(3)
OFFLOADABLE VARCHAR2(3)
DISP_TYPE VARCHAR2(13)
USAGE VARCHAR2(128)
DESCR VARCHAR2(4000)
CON_ID NUMBER
Voici une répartition des fonctions SQL par version d'Oracle. Le ORDER BY posant problème avec les enregistrements commençant à la version 10, j'ai modifié manuellement le résultat.
Tiens, Oracle remonte jusqu'à la version 6, alors que dans la plupart des livres ou des sites web, la version 7 est considérée comme une "limite"; pour rappel, la V7 a introduit les contraintes d'intégrité, les procédures stockées et les triggers. On note les points suivants : 132 fonctions déjà présentes en V6, que 4 nouvelles en V7, plus de 350 autres en V8 (version des fonctions analytiques), très peu d'ajout en 9, une nouvelle explosion en 10 et peu de nouveautés en 11. Étonnamment la V12 n'est pas présente alors qu'on retrouve bien ses fonctions dans cette vue, dans la partie dite INVALID.
SQL> select version, count(*) from V$SQLFN_METADATA group by version order by substr(version, 2, 2);
VERSION COUNT(*)
------------ ----------
V6 Oracle 132
V71 Oracle 1
V73 Oracle 4
V80 Oracle 49
V81 Oracle 72
V816 Oracle 117
V82 Oracle 123
V92 Oracle 39
V10 Oracle 326
V10R2 Oracle 22
V11R1 Oracle 80
INVALID 120
SQL/DS 41
SQL/DS est un data type lié à la base DB2 de IBM. Voici ce que j'ai trouvé comme info sur le net :
"ANSI, DB2, and SQL/DS Data Types
SQL statements that create tables and clusters can also use ANSI data types and data types from the IBM products SQL/DS and DB2. Oracle recognizes the ANSI or IBM data type name that differs from the Oracle Database data type name. It converts the data type to the equivalent Oracle data type, records the Oracle data type as the name of the column data type, and stores the column data in the Oracle data type based on the conversions shown in the tables that follow.
Table 2-7 SQL/DS and DB2 Data Types Converted to Oracle Data Types
SQL/DS or DB2 Data Type Oracle Data Type
CHARACTER(n) CHAR(n)
VARCHAR(n) VARCHAR(n)
LONG VARCHAR LONG
DECIMAL(p,s) NUMBER(p,s)
INTEGER NUMBER(p,0)
SMALLINT NUMBER(p,0)
FLOAT (Note 2) NUMBER"
============================================================================================
Fonctions par version d'Oracle
============================================================================================
Regardons cela dans le détail ce que nous avons pour la version 6. Nous voyons que les opérateurs != et autres sont mentionnés, que beaucoup de fonctions commençant par OPT alors que je n'en ai jamais entendu parler.
SQL> break on "VERSION" skip 1
SQL> select distinct version, name, datatype from V$SQLFN_METADATA where version in ('V6 Oracle') order by version, name;
VERSION NAME DATATYPE
------------ ------------------------------ --------
V6 Oracle != UNKNOWN
< UNKNOWN
<= UNKNOWN
= UNKNOWN
> UNKNOWN
>= UNKNOWN
ABS NUMERIC
ADD_MONTHS DATETYPE
ASCII NUMERIC
AVG ARG 1
BITAND NUMERIC
CEIL NUMERIC
CHARTOROWID BINARY
CHR STRING
CONCAT STRING
CONVERT STRING
COUNT NUMERIC
DATAOBJ_TO_MAT_PARTITION UNKNOWN
DATAOBJ_TO_PARTITION UNKNOWN
DECODE ARG 3
DUMP STRING
FLOOR NUMERIC
GREATEST ARG 1
HEXTORAW BINARY
INITCAP STRING
INSTR NUMERIC
LAST_DAY DATETYPE
LEAST ARG 1
LENGTH NUMERIC
LNNVL UNKNOWN
LOWER STRING
LPAD STRING
LTRIM STRING
MAX ARG 1
MERGE$ACTIONS UNKNOWN
MIN ARG 1
MOD NUMERIC
MONTHS_BETWEEN NUMERIC
NEW_TIME DATETYPE
NEXT_DAY DATETYPE
NLSSORT STRING
NVL ARG 1
NVL2 ARG 2
OPTBTR UNKNOWN
OPTCDY UNKNOWN
OPTCNVTLAB UNKNOWN
OPTCTZ UNKNOWN
OPTDAN DATETYPE
OPTDDI UNKNOWN
OPTDDJ UNKNOWN
OPTDDS STRING
OPTDESC UNKNOWN
OPTDID UNKNOWN
OPTDIF UNKNOWN
OPTDIJ UNKNOWN
OPTDIS UNKNOWN
OPTDJN UNKNOWN
OPTDJS UNKNOWN
OPTDNJ UNKNOWN
OPTDOF UNKNOWN
OPTDPC UNKNOWN
OPTDRO DATETYPE
OPTDSD DATETYPE
OPTDSI UNKNOWN
OPTDSN DATETYPE
OPTDSU NUMERIC
OPTDSY DATETYPE
OPTITN UNKNOWN
OPTLKO UNKNOWN
OPTNDY UNKNOWN
OPTNM2BOL UNKNOWN
OPTNTI UNKNOWN
OPTR2C UNKNOWN
OPTRTB UNKNOWN
OPTSDV_OLD NUMERIC
OPTTAD NUMERIC
OPTTDI NUMERIC
OPTTIS ARG 1
OPTTLK UNKNOWN
OPTTMI ARG 1
OPTTMU NUMERIC
OPTTNG NUMERIC
OPTTNK UNKNOWN
OPTTNN UNKNOWN
OPTTNS UNKNOWN
OPTTNU UNKNOWN
OPTTSTCF UNKNOWN
OPTTSU NUMERIC
OPTTUC UNKNOWN
OPTTUN ARG 1
OPTVAR_OLD NUMERIC
PART$NUM$INST UNKNOWN
POWER NUMERIC
RAWTOHEX STRING
REPLACE STRING
REVERSE UNKNOWN
ROUND NUMERIC
ROWIDTOCHAR STRING
RPAD STRING
RTRIM STRING
SIGN NUMERIC
SOUNDEX STRING
SQRT NUMERIC
STDDEV NUMERIC
SUBSTR STRING
SUM ARG 1
SYS_OP_CEG UNKNOWN
SYS_OP_COMP UNKNOWN
SYS_OP_DECOMP UNKNOWN
SYS_OP_OPNSIZE UNKNOWN
SYS_OP_TPR UNKNOWN
TBL$OR$IDX$PART$NUM UNKNOWN
TO_BINARY_DOUBLE NUMERIC
TO_BINARY_FLOAT NUMERIC
TO_CHAR STRING
TO_DATE DATETYPE
TO_NUMBER NUMERIC
TRANSLATE STRING
TRUNC DATETYPE
TRUNC NUMERIC
UPPER STRING
USERENV STRING
VARIANCE NUMERIC
VSIZE NUMERIC
124 rows selected.
Affichons les rares nouveautés de la version 7.
SQL> select version, name, datatype from V$SQLFN_METADATA where version in ('V71 Oracle', 'V73 Oracle') order by version, name;
VERSION NAME DATATYPE
------------ ------------------------------ --------
V71 Oracle OPTPLS UNKNOWN
V73 Oracle ACOS NUMERIC
ASIN NUMERIC
ATAN NUMERIC
ATAN2 NUMERIC
Pour la version 8 je filtre sur le dataype car autrement il y en a trop. Nous voyons que c'est dans cette version que les fonctions LEAD, LAG sont apparues et que, comme je le disais, ce sont des fonctions analytiques.
SQL> select distinct version, name, datatype from V$SQLFN_METADATA where version in ('V80 Oracle', 'V81 Oracle', 'V816 Oracle', 'V82 Oracle') AND datatype <> 'UNKNOWN' order by version, name;
VERSION NAME DATATYPE
------------ ------------------------------ --------
V80 Oracle BFILENAME BINARY
EMPTY_BLOB BINARY
EMPTY_CLOB BINARY
MAKE_REF BINARY
NLS_CHARSET_DECL_LEN NUMERIC
NLS_CHARSET_ID NUMERIC
NLS_CHARSET_NAME STRING
REFTOHEX BINARY
V81 Oracle CAST ARG 2
GROUPING NUMERIC
SYS_GUID BINARY
TO_LOB BINARY
TRIM STRING
V816 Oracle AVG NUMERIC
CORR NUMERIC
COUNT NUMERIC
COVAR_POP NUMERIC
COVAR_SAMP NUMERIC
DENSE_RANK NUMERIC
FIRST_VALUE ARG 1
FROM_TZ DATETYPE
LAG ARG 1
LAST_VALUE ARG 1
LEAD ARG 1
MAX ARG 1
MIN ARG 1
NTILE NUMERIC
OPTCOVARP_OLD NUMERIC
OPTCOVARS_OLD NUMERIC
OPTFDCOVARP_OLD NUMERIC
OPTFDCOVARS_OLD NUMERIC
OPTFDWNCOVARP_OLD NUMERIC
OPTFDWNCOVARS_OLD NUMERIC
OPTFFCOVARP_OLD NUMERIC
OPTFFCOVARS_OLD NUMERIC
OPTFFWNCOVARP_OLD NUMERIC
OPTFFWNCOVARS_OLD NUMERIC
OPTWNCOVARP_OLD NUMERIC
OPTWNCOVARS_OLD NUMERIC
OPTWNSTD_OLD NUMERIC
OPTWNVAR_OLD NUMERIC
PERCENT_RANK NUMERIC
RANK NUMERIC
RATIO_TO_REPORT NUMERIC
REGR_AVGX NUMERIC
REGR_AVGY NUMERIC
REGR_COUNT NUMERIC
REGR_INTERCEPT NUMERIC
REGR_R2 NUMERIC
REGR_SLOPE NUMERIC
REGR_SXX NUMERIC
REGR_SXY NUMERIC
REGR_SYY NUMERIC
ROW_NUMBER NUMERIC
SESSIONTIMEZONE DATETYPE
STDDEV NUMERIC
STDDEV_POP NUMERIC
STDDEV_SAMP NUMERIC
SUM NUMERIC
SYS_CONNECT_BY_PATH STRING
SYS_EXTRACT_UTC DATETYPE
TO_DSINTERVAL DATETYPE
TO_TIMESTAMP DATETYPE
TO_TIMESTAMP_TZ DATETYPE
TO_YMINTERVAL DATETYPE
VARIANCE NUMERIC
VAR_POP NUMERIC
VAR_SAMP NUMERIC
V82 Oracle ASCIISTR STRING
BIN_TO_NUM NUMERIC
COALESCE ARG 1
COMPOSE STRING
CUME_DIST NUMERIC
DECOMPOSE STRING
DENSE_RANK NUMERIC
DENSE_RANKM NUMERIC
GROUPING_ID NUMERIC
GROUP_ID NUMERIC
INSTR2 NUMERIC
INSTR4 NUMERIC
INSTRC NUMERIC
LENGTH2 NUMERIC
LENGTH4 NUMERIC
LENGTHC NUMERIC
NCHR STRING
NULLIF ARG 1
OPTLICSCNVTST NUMERIC
OPTLINS NUMERIC
OPTLINSB NUMERIC
OPTLLEN NUMERIC
OPTLLENB NUMERIC
PERCENTILE_CONT NUMERIC
PERCENTILE_DISC NUMERIC
PERCENT_RANK NUMERIC
PERCENT_RANKM NUMERIC
RANK NUMERIC
RANKM NUMERIC
RAWTONHEX STRING
ROWIDTONCHAR STRING
SUBSTR2 STRING
SUBSTR4 STRING
SUBSTRC STRING
TO_CLOB STRING
TO_NCHAR STRING
TO_NCLOB STRING
UNISTR STRING
WIDTH_BUCKET NUMERIC
107 rows selected.
============================================================================================
Autres informations
============================================================================================
Dans INVALID on a la famille des fonctions APPROX_xxx qui sont spécifiques à la version 12.
SQL> select distinct version, name, datatype from V$SQLFN_METADATA where version in ('SQL/DS', 'INVALID') order by version, name;
VERSION NAME DATATYPE
------------ ------------------------------ --------
INVALID APPROX_COUNT_DISTINCT NUMERIC
APPROX_COUNT_DISTINCT_AGG UNKNOWN
APPROX_COUNT_DISTINCT_DETAIL UNKNOWN
APPROX_MEDIAN NUMERIC
APPROX_PERCENTILE NUMERIC
APPROX_PERCENTILE_AGG UNKNOWN
APPROX_PERCENTILE_DETAIL UNKNOWN
AVERAGE_RANK NUMERIC
CLASSIFIER ARG 1
COALESCE ARG 1
COLLATE STRING
COLLATION STRING
COLUMNS UNKNOWN
CON_DBID_TO_ID UNKNOWN
CON_GUID_TO_ID UNKNOWN
CON_ID_TO_DBID UNKNOWN
CON_NAME_TO_ID UNKNOWN
CON_UID_TO_ID UNKNOWN
DENSE_RANK NUMERIC
FEATURE_COMPARE UNKNOWN
FIRST ARG 1
HIER_CAPTION STRING
HIER_CHILD_COUNT NUMERIC
HIER_DEPTH NUMERIC
HIER_DESCRIPTION STRING
HIER_HAS_CHILDREN UNKNOWN
HIER_LEVEL STRING
HIER_MEMBER_NAME STRING
HIER_MEMBER_UNIQUE_NAME STRING
HIER_ORDER NUMERIC
HIER_PARENT_LEVEL STRING
HIER_PARENT_UNIQUE_NAME STRING
LAG NUMERIC
LAG_DIFF NUMERIC
LAG_DIFF_PERCENT NUMERIC
LAST ARG 1
LEAD NUMERIC
LEAD_DIFF NUMERIC
LEAD_DIFF_PERCENT NUMERIC
MATCH_NUMBER ARG 1
NEXT ARG 1
NLS_COLLATION_ID NUMERIC
NLS_COLLATION_NAME STRING
OBJ_ID UNKNOWN
OPT1034 UNKNOWN
OPTCAPVC UNKNOWN
OPTCSEE UNKNOWN
OPTHCSWIN UNKNOWN
OPTHRANC UNKNOWN
OPTHRLDLG UNKNOWN
OPTHRMBRALL UNKNOWN
OPTHRMBRCURR UNKNOWN
OPTHRMBRLIT UNKNOWN
OPTHRMBRNULL UNKNOWN
OPTHRPAR UNKNOWN
OPTHRRELCOND UNKNOWN
OPTHRWINDOW UNKNOWN
OPTILMROWTR UNKNOWN
OPTKDUSTOOPN UNKNOWN
OPTLBL2V UNKNOWN
OPTLV2BL UNKNOWN
OPTLVCDA BINARY
OPTLVCDMLBUF UNKNOWN
OPTLVCPY UNKNOWN
OPTLVEVA UNKNOWN
OPTMRVAR ARG 1
OPTOLSDML UNKNOWN
OPTXID UNKNOWN
OPTXLGK UNKNOWN
OPTXLJK UNKNOWN
OPTXLP UNKNOWN
ORA_CHECK_ACL UNKNOWN
ORA_CHECK_PRIVILEGE UNKNOWN
ORA_CHECK_SYS_PRIVILEGE UNKNOWN
ORA_CLUSTERING BINARY
ORA_CONCAT_RWKEY BINARY
ORA_DM_PARTITION_NAME UNKNOWN
ORA_RAWCOMPARE NUMERIC
ORA_RAWCONCAT BINARY
ORA_SEARCH_RWKEY BINARY
PREV ARG 1
QUALIFY NUMERIC
RANK NUMERIC
RAWTOREF UNKNOWN
REFTORAW BINARY
ROW_NUMBER NUMERIC
SDO_GEOM_KEY BINARY
SDO_GEOM_MBB BINARY
SDO_GEOM_MBR UNKNOWN
SHARE_OF NUMERIC
SUM ARG 1
SUM NUMERIC
SYS_CHECK_PRIVILEGE UNKNOWN
SYS_CTXINFOPK UNKNOWN
SYS_DM_RXFORM_LAB UNKNOWN
SYS_FILTER_ACLS UNKNOWN
SYS_MKXTI UNKNOWN
SYS_OP_CYCLED_SEQ UNKNOWN
SYS_OP_KEY_VECTOR_CREATE NUMERIC
SYS_OP_KEY_VECTOR_FILTER UNKNOWN
SYS_OP_KEY_VECTOR_FILTER_LIST UNKNOWN
SYS_OP_KEY_VECTOR_SUCCEEDED ARG 1
SYS_OP_KEY_VECTOR_USE NUMERIC
SYS_OP_VECTOR_GROUP_BY UNKNOWN
SYS_OP_XTNN UNKNOWN
SYS_PLSQL_COUNT NUMERIC
SYS_PLSQL_CPU NUMERIC
SYS_PLSQL_IO NUMERIC
SYS_RAW_TO_XSID UNKNOWN
SYS_XSID_TO_RAW UNKNOWN
TO_ACLID UNKNOWN
TO_APPROX_COUNT_DISTINCT NUMERIC
TO_APPROX_PERCENTILE NUMERIC
VALIDATE_CONVERSION NUMERIC
VECTOR_ENCODE UNKNOWN
SQL/DS != UNKNOWN
< UNKNOWN
<= UNKNOWN
= UNKNOWN
> UNKNOWN
>= UNKNOWN
COS NUMERIC
COSH NUMERIC
EXP NUMERIC
INSTRB NUMERIC
LENGTHB NUMERIC
LN NUMERIC
LOG NUMERIC
NLS_INITCAP STRING
NLS_LOWER STRING
NLS_UPPER STRING
OPTBTUR UNKNOWN
OPTCFX UNKNOWN
OPTCTUR UNKNOWN
OPTNLS UNKNOWN
OPTRTUR UNKNOWN
OPTTLK2 UNKNOWN
OPTTNK2 UNKNOWN
OPTTUA UNKNOWN
OPTTVLCF UNKNOWN
OPTTVLCF_CONVERR UNKNOWN
OPTUREQ UNKNOWN
OPTURGE UNKNOWN
OPTURGT UNKNOWN
OPTURLE UNKNOWN
OPTURLT UNKNOWN
OPTURNE UNKNOWN
OPTURTB UNKNOWN
OPTURTC UNKNOWN
SIN NUMERIC
SINH NUMERIC
SUBSTRB STRING
TAN NUMERIC
TANH NUMERIC
TO_MULTI_BYTE STRING
TO_SINGLE_BYTE STRING
156 rows selected.
A noter que la fonction APPROX_COUNT_DISTINCT fonctionne très bien même si elle est classée Invalid.
SQL> SELECT APPROX_COUNT_DISTINCT(OBJECT_NAME) FROM DBA_OBJECTS;
APPROX_COUNT_DISTINCT(OBJECT_NAME)
----------------------------------
65951
Vous aurez remarqué que certaines fonctions apparaissent plusieurs fois. Ce n'est pas une erreur, c'est juste qu'il s'agit de versions différentes de la même fonction par le ou les arguments. Examinons la fonction AVG qui est présente 6 fois dans notre historique.
SQL> select VERSION, NAME, MINARGS, MAXARGS, DATATYPE, ANALYTIC, AGGREGATE, OFFLOADABLE, DISP_TYPE, DESCR from V$SQLFN_METADATA where name = 'AVG';
VERSION NAME MINARGS MAXARGS DATATYPE ANA AGG OFF DISP_TYPE DESCR
------------ ------------------------------ ---------- ---------- -------- ------
V6 Oracle AVG 1 1 ARG 1 NO YES NO NORMAL AVG
V816 Oracle AVG 1 1 NUMERIC YES NO NO NORMAL AVG
V10 Oracle AVG 1 1 NUMERIC NO YES NO NORMAL AVG
AVG 1 1 NUMERIC NO YES NO NORMAL AVG
AVG 1 1 NUMERIC YES NO NO NORMAL AVG(FLOAT) (Windows)
AVG 1 1 NUMERIC YES NO NO NORMAL AVG(DOUBLE) (Windows)
Le record de la fonction la plus présente est 9, pour SUM!
SQL> break on "COUNT(*)" skip 1
SQL> select count(*), name from V$SQLFN_METADATA group by name having count(*) > 1 order by count(*) DESC, name;
COUNT(*) NAME
---------- --------------------
9 SUM
6 AVG
COVAR_POP
COVAR_SAMP
STDDEV
TO_NUMBER
VARIANCE
5 TO_BINARY_DOUBLE
TO_BINARY_FLOAT
TO_CHAR
4 TRUNC
3 ABS
CEIL
DENSE_RANK
FLOOR
MOD
NANVL
RANK
REMAINDER
ROUND
SIGN
SQRT
TO_NCHAR
TRIM
2 !=
<
<=
=
>
>=
ACOS
APPROX_MEDIAN
APPROX_PERCENTILE
APPROX_PERCENTILE_AGG
APPROX_PERCENTILE_DETAIL
ASIN
ATAN
ATAN2
COALESCE
COS
COSH
COUNT
CUME_DIST
EXP
JSON
JSON_QUERY
JSON_VALUE
LAG
LEAD
LISTAGG
LN
LOG
MAX
MIN
PERCENTILE_CONT
PERCENTILE_DISC
PERCENT_RANK
POWER
ROW_NUMBER
SIN
SINH
TAN
TANH
TO_DATE
TO_DSINTERVAL
TO_TIMESTAMP
TO_TIMESTAMP_TZ
TO_YMINTERVAL
68 rows selected.
Regardons maintenant les opérateurs.
SQL> select NAME, VERSION, MINARGS, MAXARGS, DATATYPE, ANALYTIC, AGGREGATE, OFFLOADABLE, DISP_TYPE, DESCR from V$SQLFN_METADATA where name IN ('!=', '<', '<=', '=', '>', '>=') order by name, version;
NAME VERSION MINARGS MAXARGS DATATYPE ANA AGG OFF DISP_TYPE DESCR
------------------------------ ------------ ---------- ---------- -------- --- --- --- -------------
!= SQL/DS 2 0 UNKNOWN NO NO YES REL-OP <>
V6 Oracle 2 0 UNKNOWN NO NO YES REL-OP <>
< SQL/DS 2 0 UNKNOWN NO NO YES REL-OP <
V6 Oracle 2 0 UNKNOWN NO NO YES REL-OP <
<= SQL/DS 2 0 UNKNOWN NO NO YES REL-OP <=
V6 Oracle 2 0 UNKNOWN NO NO YES REL-OP <=
= SQL/DS 2 0 UNKNOWN NO NO YES REL-OP =
V6 Oracle 2 0 UNKNOWN NO NO YES REL-OP =
> SQL/DS 2 0 UNKNOWN NO NO YES REL-OP >
V6 Oracle 2 0 UNKNOWN NO NO YES REL-OP >
>= SQL/DS 2 0 UNKNOWN NO NO YES REL-OP >=
V6 Oracle 2 0 UNKNOWN NO NO YES REL-OP >=
12 rows selected.
Voilà, ce petit tour est terminé; certains diront que c'était inutile et je rétorque que c'était donc indispensable :-)