CMDBuild Forum

BadSqlGrammarException prendendo la lista di schede di una classe astratta che ha sotto sia classi astratte che concrete

Ho un problemino che non e' che abbia particolare impatto, ma forse vi puo' servire ad evidenziare qualcosa di interesse generale.

Sto usando cmdbuild 2.1.2 (27/5/2013) con postgresql-9.1-901.jdbc4.jar, postgres 9.1.9 e tomcat 7.

Ho una classe astratta "Asset", sotto la quale ho diverse classi concrete ed una classe astratta "Server", sotto quest'ultima a sua volta ci sono altre classi concrete.

Se entro come admin non ho nessun problema ed in particolare se vado sulla classe Asset, vedo tutte le schede delle sottoclassi.

Se entro come un utente che ha i permessi di lettura e scrittura su tutte le classi, ma non e' admin, posso andare sulla tabella Server e su tutte le tabelle concrete senza problemi, ma se vado su Asset mi arriva un traceback. Non posso mettere qui tutto il SQL, ma il senso e' che nel SELECT ci sono i campi delle classi concrete, nel WHERE ci sono varie cose tra cui:

"Server"."IdClass" = ?

e statement simili per tutte le sottoclassi di Asset, e nel FROM non c'e' la tabella "Server" (ci sono invece tutti i left join tra Asset e le classi concrete).

Al gruppo ho dato i permessi di scrittura su tutte le classi, e non ho usato altri tipi piu' complicati di permessi per colonne o righe.

Ho provato a seguire il sorgente per trovare dov'e' che mette la sottoclasse astratta nella lista dei join, ma ne sono uscito sconfitto. Spero che questo resoconto vi possa essere utile in qualche modo.

Saluti,

                                       Michele Bergonzoni

Call: services/json/management/modcard/getcardlist?_dc=1371550960472
---------------------------------------------------------------------
Error: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar (omissis) nested exception is org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "Server"
  Position: 11333
	at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:233)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:685)
	at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:693)
	at org.cmdbuild.dao.driver.postgres.EntryQueryCommand.run(EntryQueryCommand.java:61)
	at org.cmdbuild.dao.driver.postgres.PostgresDriver.query(PostgresDriver.java:179)
	at org.cmdbuild.dao.view.DBDataView.executeNonEmptyQuery(DBDataView.java:394)
	at org.cmdbuild.dao.view.user.UserDataView.executeNonEmptyQuery(UserDataView.java:214)
	at org.cmdbuild.dao.view.user.UserDataView.executeNonEmptyQuery(UserDataView.java:37)
	at org.cmdbuild.dao.view.AbstractDataView.executeQuery(AbstractDataView.java:30)
	at org.cmdbuild.dao.query.QuerySpecsBuilder.run(QuerySpecsBuilder.java:318)
	at org.cmdbuild.logic.data.access.DataViewCardFetcher.fetch(DataViewCardFetcher.java:190)
	at org.cmdbuild.logic.data.access.DefaultDataAccessLogic.fetchCardsWithClassName(DefaultDataAccessLogic.java:332)
	at org.cmdbuild.logic.data.access.DefaultDataAccessLogic.fetchCards(DefaultDataAccessLogic.java:321)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
	at sun.proxy.$Proxy124.fetchCards(Unknown Source)
	at org.cmdbuild.servlets.json.management.ModCard.getCardList(ModCard.java:186)
	at org.cmdbuild.servlets.json.management.ModCard.getCardList(ModCard.java:96)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.cmdbuild.servlets.JSONDispatcher.dispatch(JSONDispatcher.java:94)
	at org.cmdbuild.servlets.JSONDispatcher.doGet(JSONDispatcher.java:60)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.ExpiresFilter.doFilter(ExpiresFilter.java:1179)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.cmdbuild.filters.AuthFilter.doFilter(AuthFilter.java:133)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.cmdbuild.filters.PatchManagerFilter.doFilter(PatchManagerFilter.java:33)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.cmdbuild.filters.ConfCheckFilter.doFilter(ConfCheckFilter.java:31)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.cmdbuild.filters.TranslationFilter.doFilter(TranslationFilter.java:39)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:679)
Caused by: org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "Server"
  Position: 11333
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
	at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
	at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:643)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586)
	... 62 more

What you described is a bug in version 2.1.2 that we have already fixed.
This Friday (June 21) we will release the minor version 2.1.3 which fixes some bugs (including this one) and introduces a couple of new features.
CMDBuild Team

I confirm thath in 2.1.3 this problem is fixed. Thanks!