Pb SQL sur PostgreSQL : operator does not exist: character varying = integer

Bonjour,

Voici la version et la révision de l’instance

``
[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-03-05 23:18 (revision 40c7997ef4ecb7b5cf073d0427e387a478b0eb96)
Encoding=UTF-8
EndpointIP=172.17.0.7
EndpointURL=http://b7fd5ea8e9b2:8080
TimeZone=Europe/Paris
SystemDate=2020-03-26 11:02:42

``

j’ai deux objets liés : accessPoint et accessPointBusinessIdentifier.

j’ai mis à “Yes” la “cascade copy” afin de pouvoir copier les business identifiers d’un accessPoint lors d’une copie d’un access point. J’ai ensuite fait un rebuild index (j’aurai peut être pas du) et depuis, un message d’erreur s’affiche :
``
2020-03-26 11:10:32,106 ERROR [com.simplicite.util.engine.ObjectManager] SIMPLICITE|http://b7fd5ea8e9b2:8080||ECOREDB001|system|com.simplicite.util.engine.ObjectManager|query||Error SQL query: jdbc/simplicite: select t.row_id, t.api_acp_id, t_sitesApiAcpId.acp_identifier, t_sitesApiAcpId.acp_type, t.api_identifier, t.api_idt_id, t_sitesApiIdtId.idt_name, t_sitesApiSysId.sys_name, t.api_sys_id, t.api_value, t.api_effectivedate, t.api_enddate, t.created_dt, t.created_by, t.updated_dt, t.updated_by from sites_accesspointidentifiervalue t inner join sites_accesspoint t_sitesApiAcpId on (t.api_acp_id=t_sitesApiAcpId.row_id) inner join sites_realestateassetidentifiertype t_sitesApiIdtId on (t.api_idt_id=t_sitesApiIdtId.row_id) left outer join sites_sourcesystem t_sitesApiSysId on (t.api_sys_id=t_sitesApiSysId.row_id) where (t.row_id=?) order by t.row_id asc
org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = integer
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Position: 393
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2510)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2245)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:311)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:447)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:368)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:159)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:109)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:122)
at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:122)
at com.simplicite.util.engine.DBAccess.query(DBAccess.java:843)
at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:425)
at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:358)
at com.simplicite.util.engine.ObjectManager.search(ObjectManager.java:342)
at com.simplicite.util.engine.ObjectManager.select(ObjectManager.java:1309)
at com.simplicite.util.ObjectDirect.select(ObjectDirect.java:341)
at com.simplicite.util.ObjectDB.select(ObjectDB.java:792)
at com.simplicite.util.tools.JSONTool.get(JSONTool.java:2456)
at com.simplicite.webapp.tools.JSONServletTool.create(JSONServletTool.java:979)
at com.simplicite.webapp.ObjectJson.create(ObjectJson.java:276)
at com.simplicite.webapp.tools.JSONServletTool.businessObjectService(JSONServletTool.java:543)
at com.simplicite.webapp.servlets.AbstractJSONServlet.service(AbstractJSONServlet.java:68)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:77)
at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.simplicite.webapp.filters.AuthMethodFilter.doFilter(AuthMethodFilter.java:133)
at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at com.simplicite.tomcat.valves.APISessionValve.invoke(APISessionValve.java:187)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:830)

``
De plus je n’arrive plus à créer un business identifier :

Auriez vous une idée?

En vous remerciant d’avance

Bonjour,

PostgreSQL n’autorise pas les égalités entre 2 types différents, dans votre cas varchar et integer :

  • Il faut trouver la colonne row_id ou foreign-key ou host value qui n’est pas un integer dans cette requete
  • Faire des ALTER via DBAccess pour corriger (vérifier aussi les types des attributs en FK), et comprendre pourquoi ce n’est pas le bon type.

Je vais regarder au niveau de la copy du socle, s’il n’y a pas une erreur de type sur postgreSQL (les autres bases savent caster ce genre de cas).

J’ai effectivement vérifié ce point. l’erreur, vue la position, (et après vérification de la requête ligne par ligne directement via le DBAccess) se situe au niveau de
t.api_acp_id=t_sitesApiAcpId.row_id
alors que le type de l’attribut api_acp_id est Internal ID, ce qui doit logiquement correspondre au même type que row_id

Quelle est votre version de PG ?

Sur un postgreSQL v12, je n’ai pas ce problème de cast en comparant un int avec une chaine de caractères :

select * from m_user where row_id='1'

Le row_id est bien un integer au niveau physique :

Le problème apparait si on compare 2 colonnes de types différents, exemple :

select * from m_user t where t.row_id = t.created_by

Faites un ALTER en integer de votre colonne api_acp_id, je ne vois pas du tout pourquoi ce n’est pas le bon type : vous l’avez d’abord créé en string, puis changé en Internal Id ? ou quelque chose du genre ?

Si l’ALTER ne marche pas, il faudra faire un DROP COLUMN puis ADD COLUMN au bon type.
Simplicité ne sait pas corriger tout seul ce genre de cas.

Non, je ne l’ai pas créé en string.
Pour info, j’ai fait la meme procédure (cascade copy) dans l’environnement d’integration, tout est nickel sans aucune erreur. la seule différence entre les deux environnement c’est que j’ai fait le 'rebuild index" uniquement sur la recette. Je ne sais pas si ceci est lié au problème
je vais essayer de faire un ALTER

Bizarre,

on va vérifier si le rebuild index fait des ALTER en ce sens sur PG.
Son rôle est normalement de juste (re)créer l’index unique sur la clé fonctionnelle + les index non uniques sur les FK.

Le problème est résolu en faisant un ALTER en integer de la colonne api_acp_id

Merci beaucoup pour votre support!