{"id":8037,"date":"2019-10-09T09:14:23","date_gmt":"2019-10-09T08:14:23","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=8037"},"modified":"2019-10-09T10:12:03","modified_gmt":"2019-10-09T09:12:03","slug":"error-xx000-cache-lookup-failed-for-function-1-avec-create-extension","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/","title":{"rendered":"ERROR:  XX000: cache lookup failed for function 1 avec CREATE EXTENSION"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8037&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8037&#038;title=ERROR%3A%20%20XX000%3A%20cache%20lookup%20failed%20for%20function%201%20avec%20CREATE%20EXTENSION\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=ERROR%3A%20%20XX000%3A%20cache%20lookup%20failed%20for%20function%201%20avec%20CREATE%20EXTENSION&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8037\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p><em>Avec le concours de <a href=\"https:\/\/www.linkedin.com\/in\/r%C3%A9mi-vidier-835a37138\/\" target=\"_blank\" rel=\"noopener noreferrer\">R\u00e9mi Vidier<\/a>. <\/em><\/p>\n<table border=0>\n<tr>\n<td bgcolor=\"#DDDDDD\"><i>Disclaimer : Attention cet article utilise des outils de d\u00e9bogage qui sont intrusifs, et qui stoppent notamment l&#8217;ex\u00e9cution du processus qui est trac\u00e9, donc <b>A NE PAS UTILISER EN PRODUCTION !!!<\/b><\/i><i><\/i><\/td>\n<\/tr>\n<\/table>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau-1024x293.png\" alt=\"\" width=\"640\" height=\"183\" class=\"aligncenter size-large wp-image-8039\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau-1024x293.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau-300x86.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau-768x220.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau.png 1048w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><br \/>\nCette semaine nous devions d\u00e9ployer notre solution d&#8217;administration \u00e0 distance <a href=\"https:\/\/www.capdata.fr\/#expertise\" target=\"_blank\" rel=\"noopener noreferrer\">AllDB<\/a> sur une instance PostgreSQL 11.5 chez un de nos clients. La partie qui g\u00e8re ce que l&#8217;on appelle en interne le &#8216;<em>palmar\u00e8s<\/em>&#8216; des requ\u00eates lentes se base sur l&#8217;extension <a href=\"https:\/\/blog.capdata.fr\/index.php\/requetes-consommatrices-sous-postgresql-episode-1\/\" target=\"_blank\" rel=\"noopener noreferrer\">pg_stat_statements<\/a>, ce qui implique l&#8217;installation des contribs en pr\u00e9requis. <\/p>\n<p>Lorsque nous avons voulu cr\u00e9er l&#8217;extension apr\u00e8s avoir ajout\u00e9 les diff\u00e9rents param\u00e8tres dans postgresql.conf:<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n(...)\r\nshared_preload_libraries = '\/usr\/pgsql-11\/lib\/pg_stat_statements.so'    # (change requires restart)\r\npg_stat_statements.max = 4000\r\npg_stat_statements.track = all\r\npg_stat_statements.track_utility = on\r\npg_stat_statements.save = on\r\ntrack_activity_query_size = 4096\r\n(...)\r\n<\/pre>\n<p>&#8230;le CREATE EXTENSION est sorti en erreur:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\npostgres=# create extension pg_stat_statements ;\r\nERROR:  XX000: cache lookup failed for function 1\r\nLOCATION:  fmgr_info_cxt_security, fmgr.c:181\r\n<\/pre>\n<p>On s&#8217;est rapidement rendu compte qu&#8217;en fait le probl\u00e8me n&#8217;\u00e9tait pas li\u00e9 \u00e0 l&#8217;extension en elle-m\u00eame, car toutes les extensions des contribs \u00e9taient concern\u00e9es:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\npostgres=# create extension hstore ;\r\nERROR:  XX000: cache lookup failed for function 1\r\nLOCATION:  fmgr_info_cxt_security, fmgr.c:181\r\nTime: 10.104 ms\r\n<\/pre>\n<p>OK, donc cette fonction <a href=\"https:\/\/doxygen.postgresql.org\/fmgr_8c_source.html#l00144\" target=\"_blank\" rel=\"noopener noreferrer\">fmgr_info_cxt_security()<\/a> doit v\u00e9rifier que l&#8217;oid d&#8217;une fonction non built-in qui lui est pass\u00e9e en argument se trouve bien dans <a href=\"https:\/\/www.postgresql.org\/docs\/11\/catalog-pg-proc.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_proc<\/a>, sinon cette erreur est renvoy\u00e9e:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nfmgr_info_cxt_security(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt,\r\n                        bool ignore_security)\r\n { (...)\r\n    if ((fbp = fmgr_isbuiltin(functionId)) != NULL)\r\n     {\r\n         \/*\r\n          * Fast path for builtin functions: don't bother consulting pg_proc\r\n          *\/\r\n         finfo-&gt;fn_nargs = fbp-&gt;nargs;\r\n         finfo-&gt;fn_strict = fbp-&gt;strict;\r\n         finfo-&gt;fn_retset = fbp-&gt;retset;\r\n         finfo-&gt;fn_stats = TRACK_FUNC_ALL;   \/* ie, never track *\/\r\n         finfo-&gt;fn_addr = fbp-&gt;func;\r\n         finfo-&gt;fn_oid = functionId;\r\n         return;\r\n     }\r\n \r\n     \/* Otherwise we need the pg_proc entry *\/\r\n     procedureTuple = SearchSysCache1(PROCOID, ObjectIdGetDatum(functionId));\r\n     if (!HeapTupleIsValid(procedureTuple))\r\n         elog(ERROR, &quot;cache lookup failed for function %u&quot;, functionId);\r\n     procedureStruct = (Form_pg_proc) GETSTRUCT(procedureTuple);\r\n(...)\r\n<\/pre>\n<p>Dans notre cas l&#8217;oid pass\u00e9 en argument est 1, ce qui effectivement n&#8217;existe pas dans pg_proc, d&#8217;o\u00f9 l&#8217;erreur. <\/p>\n<p>Si on s&#8217;int\u00e9resse \u00e0 la s\u00e9quence lors de laquelle cet oid=1 est remont\u00e9, il nous faut attacher <a href=\"https:\/\/www.gnu.org\/software\/gdb\/\" target=\"_blank\" rel=\"noopener noreferrer\">gdb <\/a>\u00e0 l&#8217;ex\u00e9cution du backend qui g\u00e9n\u00e8re l&#8217;erreur. Il porte le PID 9599, on s&#8217;attache et on pose un bp sur errfinish pour stopper l&#8217;ex\u00e9cution sur notre erreur: <\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\nroot@centos7 ~]# ps -fu postgres \r\nUID        PID  PPID  C STIME TTY          TIME CMD\r\npostgres  2821  2820  0 oct.07 pts\/1   00:00:00 -bash\r\npostgres  3234     1  0 oct.07 ?       00:00:01 \/usr\/pgsql-11\/bin\/postmaster -D \/var\/lib\/pgsql\/11\/data\/\r\npostgres  3236  3234  0 oct.07 ?       00:00:00 postgres: logger   \r\npostgres  3512  3234  0 oct.07 ?       00:00:00 postgres: checkpointer   \r\npostgres  3513  3234  0 oct.07 ?       00:00:01 postgres: background writer   \r\npostgres  3514  3234  0 oct.07 ?       00:00:01 postgres: walwriter   \r\npostgres  3515  3234  0 oct.07 ?       00:00:01 postgres: autovacuum launcher   \r\npostgres  3516  3234  0 oct.07 ?       00:00:02 postgres: stats collector   \r\npostgres  3517  3234  0 oct.07 ?       00:00:00 postgres: logical replication launcher   \r\npostgres  9598  2821  0 14:44 pts\/1    00:00:00 psql\r\npostgres  9599  3234  0 14:44 ?        00:00:00 postgres: postgres postgres [local] idle\r\n\r\nroot@centos7 ~]# gdb -p 9599\r\nGNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-115.el7\r\nCopyright (C) 2013 Free Software Foundation, Inc.\r\nLicense GPLv3+: GNU GPL version 3 or later &lt;http:\/\/gnu.org\/licenses\/gpl.html&gt;\r\nThis is free software: you are free to change and redistribute it.\r\nThere is NO WARRANTY, to the extent permitted by law.  Type &quot;show copying&quot;\r\nand &quot;show warranty&quot; for details.\r\nThis GDB was configured as &quot;x86_64-redhat-linux-gnu&quot;.\r\nFor bug reporting instructions, please see:\r\n&lt;http:\/\/www.gnu.org\/software\/gdb\/bugs\/&gt;.\r\nAttaching to process 9599\r\nReading symbols from \/usr\/pgsql-11\/bin\/postgres...Reading symbols from \/usr\/lib\/debug\/usr\/pgsql-11\/bin\/postgres.debug...done.\r\ndone.\r\n(gdb) set pagination off\r\n(gdb) set logging file debug.log\r\n(gdb) set logging on\r\nCopying output to debug.log.\r\n(gdb) break errfinish\r\nBreakpoint 1 at 0x84e250: file elog.c, line 414.\r\n(gdb) cont\r\nContinuing.\r\n<\/pre>\n<p>Une fois le bp pos\u00e9, dans le backend on force l&#8217;erreur \u00e0 nouveau, et avec les symboles de PG11 install\u00e9s (postgresql11-debuginfo.x86_64) on r\u00e9cup\u00e8re la backtrace suivante :<\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\r\n\r\nBreakpoint 1, errfinish (dummy=dummy@entry=0) at elog.c:414\r\n414     elog.c: Aucun fichier ou dossier de ce type.\r\n(gdb) ^CQuit\r\n(gdb) bt\r\n#0  errfinish (dummy=dummy@entry=0) at elog.c:414\r\n#1  0x0000000000851fa8 in elog_finish (elevel=elevel@entry=20, fmt=fmt@entry=0x898698 &quot;cache lookup failed for function %u&quot;) at elog.c:1376\r\n#2  0x0000000000853fce in fmgr_info_cxt_security (functionId=1, functionId@entry=42165528, finfo=finfo@entry=0x7fff47c08f80, mcxt=&lt;optimized out&gt;, ignore_security=ignore_security@entry=false) at fmgr.c:181\r\n#3  0x0000000000855532 in fmgr_info (finfo=0x7fff47c08f80, functionId=42165528) at fmgr.c:126\r\n#4  OidFunctionCall1Coll (functionId=functionId@entry=1, collation=collation@entry=0, arg1=arg1@entry=24583) at fmgr.c:1411\r\n#5  0x000000000053ba61 in ProcedureCreate (procedureName=&lt;optimized out&gt;, procNamespace=procNamespace@entry=2200, replace=&lt;optimized out&gt;, returnsSet=returnsSet@entry=false, returnType=returnType@entry=2278, proowner=10, languageObjectId=languageObjectId@entry=13, languageValidator=languageValidator@entry=1, prosrc=prosrc@entry=0x282b830 &quot;pg_stat_statements_reset&quot;, probin=probin@entry=0x282b938 &quot;$libdir\/pg_stat_statements&quot;, prokind=prokind@entry=102 'f', security_definer=security_definer@entry=false, isLeakProof=isLeakProof@entry=false, isStrict=isStrict@entry=false, volatility=volatility@entry=118 'v', parallel=parallel@entry=115 's', parameterTypes=parameterTypes@entry=0x2836500, allParameterTypes=allParameterTypes@entry=0, parameterModes=parameterModes@entry=0, parameterNames=parameterNames@entry=0, parameterDefaults=parameterDefaults@entry=0x0, trftypes=trftypes@entry=0, proconfig=proconfig@entry=0, procost=procost@entry=1, prorows=prorows@entry=0) at pg_proc.c:703\r\n#6  0x00000000005b0460 in CreateFunction (pstate=pstate@entry=0x2836350, stmt=stmt@entry=0x282d080) at functioncmds.c:1094\r\n#7  0x000000000074a267 in ProcessUtilitySlow (pstate=pstate@entry=0x2836350, pstmt=pstmt@entry=0x282b2c8, queryString=queryString@entry=0x2831398 &quot;\/* contrib\/pg_stat_statements\/pg_stat_statements--1.4.sql *\/\\n\\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\\n\\n\\n-- Register functions.\\nCREATE FUNCTION pg_stat_statements_res&quot;..., context=context@entry=PROCESS_UTILITY_QUERY, params=params@entry=0x0, queryEnv=queryEnv@entry=0x0, completionTag=completionTag@entry=0x0, dest=0xcf13a0 &lt;donothingDR&gt;) at utility.c:1473\r\n#8  0x0000000000749356 in standard_ProcessUtility (pstmt=pstmt@entry=0x282b2c8, queryString=queryString@entry=0x2831398 &quot;\/* contrib\/pg_stat_statements\/pg_stat_statements--1.4.sql *\/\\n\\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\\n\\n\\n-- Register functions.\\nCREATE FUNCTION pg_stat_statements_res&quot;..., context=context@entry=PROCESS_UTILITY_QUERY, params=params@entry=0x0, queryEnv=queryEnv@entry=0x0, dest=dest@entry=0xcf13a0 &lt;donothingDR&gt;, completionTag=completionTag@entry=0x0) at utility.c:923\r\n#9  0x00007fddf8482025 in pgss_ProcessUtility (pstmt=0x282b2c8, queryString=0x2831398 &quot;\/* contrib\/pg_stat_statements\/pg_stat_statements--1.4.sql *\/\\n\\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\\n\\n\\n-- Register functions.\\nCREATE FUNCTION pg_stat_statements_res&quot;..., context=PROCESS_UTILITY_QUERY, params=0x0, queryEnv=0x0, dest=0xcf13a0 &lt;donothingDR&gt;, completionTag=0x0) at pg_stat_statements.c:1005\r\n#10 0x00000000005a708c in execute_sql_string (filename=0x281d7f0 &quot;\/usr\/pgsql-11\/share\/extension\/pg_stat_statements--1.4.sql&quot;, sql=0x2831398 &quot;\/* contrib\/pg_stat_statements\/pg_stat_statements--1.4.sql *\/\\n\\n-- complain if script is sourced in psql, rather than via CREATE EXTENSION\\n\\n\\n-- Register functions.\\nCREATE FUNCTION pg_stat_statements_res&quot;...) at extension.c:763\r\n#11 execute_extension_script (extensionOid=extensionOid@entry=24582, control=control@entry=0x282d2b0, from_version=from_version@entry=0x0, version=version@entry=0x281d368 &quot;1.4&quot;, requiredSchemas=requiredSchemas@entry=0x0, schemaName=schemaName@entry=0x282ac68 &quot;public&quot;, schemaOid=&lt;optimized out&gt;) at extension.c:924\r\n#12 0x00000000005a7b0d in CreateExtensionInternal (extensionName=0x275c0c8 &quot;pg_stat_statements&quot;, schemaName=0x282ac68 &quot;public&quot;, schemaName@entry=0x0, versionName=0x281d368 &quot;1.4&quot;, versionName@entry=0x0, oldVersionName=oldVersionName@entry=0x0, cascade=&lt;optimized out&gt;, parents=parents@entry=0x0, is_create=is_create@entry=true) at extension.c:1536\r\n#13 0x00000000005a8017 in CreateExtension (pstate=pstate@entry=0x2814940, stmt=stmt@entry=0x275c0f8) at extension.c:1725\r\n#14 0x000000000074a617 in ProcessUtilitySlow (pstate=pstate@entry=0x2814940, pstmt=pstmt@entry=0x275c1a8, queryString=queryString@entry=0x275b6e0 &quot;create extension pg_stat_statements ;&quot;, context=context@entry=PROCESS_UTILITY_TOPLEVEL, params=params@entry=0x0, queryEnv=queryEnv@entry=0x0, completionTag=completionTag@entry=0x7fff47c0a8d0 &quot;&quot;, dest=0x275c468) at utility.c:1392\r\n#15 0x0000000000749356 in standard_ProcessUtility (pstmt=pstmt@entry=0x275c1a8, queryString=queryString@entry=0x275b6e0 &quot;create extension pg_stat_statements ;&quot;, context=context@entry=PROCESS_UTILITY_TOPLEVEL, params=params@entry=0x0, queryEnv=queryEnv@entry=0x0, dest=dest@entry=0x275c468, completionTag=completionTag@entry=0x7fff47c0a8d0 &quot;&quot;) at utility.c:923\r\n#16 0x00007fddf8482025 in pgss_ProcessUtility (pstmt=0x275c1a8, queryString=0x275b6e0 &quot;create extension pg_stat_statements ;&quot;, context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x275c468, completionTag=0x7fff47c0a8d0 &quot;&quot;) at pg_stat_statements.c:1005\r\n#17 0x0000000000746b96 in PortalRunUtility (portal=0x27c4860, pstmt=0x275c1a8, isTopLevel=&lt;optimized out&gt;, setHoldSnapshot=&lt;optimized out&gt;, dest=0x275c468, completionTag=0x7fff47c0a8d0 &quot;&quot;) at pquery.c:1178\r\n#18 0x00000000007475e7 in PortalRunMulti (portal=portal@entry=0x27c4860, isTopLevel=isTopLevel@entry=true, setHoldSnapshot=setHoldSnapshot@entry=false, dest=dest@entry=0x275c468, altdest=altdest@entry=0x275c468, completionTag=completionTag@entry=0x7fff47c0a8d0 &quot;&quot;) at pquery.c:1331\r\n#19 0x00000000007481d5 in PortalRun (portal=&lt;optimized out&gt;, count=9223372036854775807, isTopLevel=&lt;optimized out&gt;, run_once=&lt;optimized out&gt;, dest=0x275c468, altdest=0x275c468, completionTag=0x7fff47c0a8d0 &quot;&quot;) at pquery.c:799\r\n#20 0x0000000000744287 in exec_simple_query (query_string=&lt;optimized out&gt;) at postgres.c:1145\r\n#21 0x0000000000745552 in PostgresMain (argc=&lt;optimized out&gt;, argv=&lt;optimized out&gt;, dbname=&lt;optimized out&gt;, username=&lt;optimized out&gt;) at postgres.c:4182\r\n#22 0x0000000000480571 in BackendRun (port=0x277ad80) at postmaster.c:4358\r\n#23 BackendStartup (port=0x277ad80) at postmaster.c:4030\r\n#24 ServerLoop () at postmaster.c:1707\r\n#25 0x00000000006d8639 in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0x2756280) at postmaster.c:1380\r\n#26 0x00000000004813cf in main (argc=3, argv=0x2756280) at main.c:228\r\n(gdb) detach\r\nDetaching from program: \/usr\/pgsql-11\/bin\/postgres, process 9599\r\n<\/pre>\n<p>On retrouve bien fmgr_info_cxt_security() sur le haut de la pile. Regardons de pr\u00e8s la s\u00e9quence ProcedureCreate() -> OidFunctionCall1Coll(), dans le code l&#8217;appel se passe de la mani\u00e8re suivante (pg_proc.c):<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nObjectAddress\r\n ProcedureCreate(const char *procedureName,\r\n(...)\r\n        OidFunctionCall1(languageValidator, ObjectIdGetDatum(retval));\r\n(...)\r\n<\/pre>\n<p>OidFunctionCall1() est un alias pointant sur OidFunctionCall1Coll() dans fmgr.h:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n(...)\r\n #define OidFunctionCall1(functionId, arg1) \\\r\n     OidFunctionCall1Coll(functionId, InvalidOid, arg1)\r\n(...)\r\n<\/pre>\n<p>et dans OidFunctionCall1Coll() dans fmgr.c, l&#8217;appel \u00e0 fmgr_info() qui d\u00e9clenche l&#8217;exception finale:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n Datum\r\n OidFunctionCall1Coll(Oid functionId, Oid collation, Datum arg1)\r\n {\r\n     FmgrInfo    flinfo;\r\n \r\n     fmgr_info(functionId, &amp;flinfo);\r\n \r\n     return FunctionCall1Coll(&amp;flinfo, collation, arg1);\r\n }\r\n<\/pre>\n<p>Donc l&#8217;argument Oid functionId qui est \u00e9gal \u00e0 1 et fait planter notre CREATE EXTENSION est une r\u00e9f\u00e9rence au d\u00e9part \u00e0 <i>languageValidator<\/i>, qui est une colonne de <a href=\"https:\/\/www.postgresql.org\/docs\/11\/catalog-pg-language.html\" target=\"_blank\" rel=\"noopener noreferrer\">pg_language<\/a>. <\/p>\n<p>Dans les faits dans le catalogue syst\u00e8me, la valeur de lanvalidator pour le langage &#8216;c&#8217; qui est le langage de nos extensions, est \u00e0 1:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\npostgres=# select * from pg_language ;\r\n lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl\r\n----------+----------+---------+--------------+---------------+-----------+--------------+--------\r\n internal |       10 | f       | f            |             0 |         0 |         2246 | NULL\r\n sql      |       10 | f       | t            |             0 |         0 |         2248 | NULL\r\n plpgsql  |       10 | t       | t            |         13868 |     13869 |        13870 | NULL\r\n c        |       10 | f       | f            |             0 |         0 |            1 | NULL\r\n(4 rows)\r\nTime: 5.114 ms\r\n<\/pre>\n<p>D&#8217;apr\u00e8s la <a href=\"https:\/\/www.postgresql.org\/docs\/11\/catalog-pg-language.html\" target=\"_blank\" rel=\"noopener noreferrer\">doc<\/a>, le lanvalidator doit pointer vers la fonction de validation du langage lanname. Dans le cas du &#8216;c&#8217;, ce devrait \u00eatre fmgr_c_validator:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\npostgres=# select oid, proname from pg_proc where proname='fmgr_c_validator' ;\r\n oid  |     proname      \r\n------+------------------\r\n 2247 | fmgr_c_validator\r\n(1 ligne)\r\n<\/pre>\n<p>Au final si on update la colonne dans pg_language, le CREATE EXTENSION va fonctionner de nouveau:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\npostgres=# update pg_language set lanvalidator=2247 where lanname='c' ;\r\nUPDATE 1\r\npostgres=# create extension pg_stat_statements ;\r\nCREATE EXTENSION\r\n<\/pre>\n<p>Mais la question reste de savoir pourquoi la valeur se retrouve \u00e0 1 en premier lieu. On s&#8217;est \u00e9galement rendu compte que lanvalidator \u00e9tait aussi \u00e0 1 dans template1 et le probl\u00e8me se propage \u00e0 chaque nouvelle cr\u00e9ation de base. Il n&#8217;y a qu&#8217;un CREATE DATABASE &#8230; TEMPLATE template0 qui ne posera pas le probl\u00e8me. <\/p>\n<p>Est-ce un probl\u00e8me au moment de l&#8217;initdb qui modifie cette valeur ? Toujours est-il que le probl\u00e8me n&#8217;est pas nouveau, plusieurs threads sur le forum g\u00e9n\u00e9ral le mentionnent, notamment ici : <a href=\"https:\/\/www.postgresql.org\/message-id\/b7082510-b2a1-acbe-dc79-d4492eccacc4%40gmail.com\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.postgresql.org\/message-id\/b7082510-b2a1-acbe-dc79-d4492eccacc4%40gmail.com<\/a><\/p>\n<p>Affaire \u00e0 suivre, bonne journ\u00e9e \u00e0 toutes \/ tous, \u00e0+<br \/>\nDavid. <\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8037&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8037&#038;title=ERROR%3A%20%20XX000%3A%20cache%20lookup%20failed%20for%20function%201%20avec%20CREATE%20EXTENSION\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=ERROR%3A%20%20XX000%3A%20cache%20lookup%20failed%20for%20function%201%20avec%20CREATE%20EXTENSION&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8037\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Avec le concours de R\u00e9mi Vidier. Disclaimer : Attention cet article utilise des outils de d\u00e9bogage qui sont intrusifs, et qui stoppent notamment l&#8217;ex\u00e9cution du processus qui est trac\u00e9, donc A NE PAS UTILISER EN PRODUCTION !!! Cette semaine nous&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":8039,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[266],"tags":[],"class_list":["post-8037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Avec le concours de R\u00e9mi Vidier. Disclaimer : Attention cet article utilise des outils de d\u00e9bogage qui sont intrusifs, et qui stoppent notamment l&#8217;ex\u00e9cution du processus qui est trac\u00e9, donc A NE PAS UTILISER EN PRODUCTION !!! Cette semaine nous&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-09T08:14:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-10-09T09:12:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1048\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"David Baffaleuf\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"David Baffaleuf\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\"},\"author\":{\"name\":\"David Baffaleuf\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf\"},\"headline\":\"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION\",\"datePublished\":\"2019-10-09T08:14:23+00:00\",\"dateModified\":\"2019-10-09T09:12:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\"},\"wordCount\":2100,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\",\"name\":\"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2019-10-09T08:14:23+00:00\",\"dateModified\":\"2019-10-09T09:12:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf\",\"name\":\"David Baffaleuf\",\"sameAs\":[\"http:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/dbaffaleuf\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/","og_locale":"fr_FR","og_type":"article","og_title":"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION - Capdata TECH BLOG","og_description":"Avec le concours de R\u00e9mi Vidier. Disclaimer : Attention cet article utilise des outils de d\u00e9bogage qui sont intrusifs, et qui stoppent notamment l&#8217;ex\u00e9cution du processus qui est trac\u00e9, donc A NE PAS UTILISER EN PRODUCTION !!! Cette semaine nous&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2019-10-09T08:14:23+00:00","article_modified_time":"2019-10-09T09:12:03+00:00","og_image":[{"width":1048,"height":300,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2019\/10\/puzzle_bandeau.png","type":"image\/png"}],"author":"David Baffaleuf","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"David Baffaleuf","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/"},"author":{"name":"David Baffaleuf","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf"},"headline":"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION","datePublished":"2019-10-09T08:14:23+00:00","dateModified":"2019-10-09T09:12:03+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/"},"wordCount":2100,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"articleSection":["PostgreSQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/","url":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/","name":"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2019-10-09T08:14:23+00:00","dateModified":"2019-10-09T09:12:03+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/error-xx000-cache-lookup-failed-for-function-1-avec-create-extension\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"ERROR: XX000: cache lookup failed for function 1 avec CREATE EXTENSION"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/136297da9f61d6e4878abe0f48bc5fbf","name":"David Baffaleuf","sameAs":["http:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/dbaffaleuf\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=8037"}],"version-history":[{"count":20,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8037\/revisions"}],"predecessor-version":[{"id":8048,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8037\/revisions\/8048"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/8039"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=8037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=8037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=8037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}