Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    SQLDataSource: row count query generates extra 'AND' at the end of where clause

    SmartClient Version: v10.1p_2016-03-14/Enterprise Deployment (built 2016-03-14)

    Hello, I'm struggling to make a test case for an issue I have, but without success.
    Now I've found an (easy) workaround, but I want to let you know anyway.

    The query was working with 10.0. The problem appeared with 10.1, from v101p_2015-12-10 (the oldest I've got at hand) to the latest.

    The operationBinding is part of a pretty complicated dataSource, stripping almost all of it solves the problem, but I couldn't identify from what originates.

    The fetch is issued by a grid.summaryRow, and generates a row count query with an extra 'AND' at the end:

    Code:
    2016-03-15 12:10:18,336 DEBUG RPCManager Request #1 (DSRequest) payload: {
        criteria:{
            ID_STAGIONI_FK:913383
        },
        operationConfig:{
            dataSource:"LEG_ORDINE",
            repo:null,
            operationType:"fetch",
            textMatchStyle:"substring"
        },
        startRow:0,
        endRow:1,
        componentId:"gestReportPagamentiListOrdini_summaryRow",
        appID:"builtinApplication",
        operation:"fetchTotaliPagamCCList",
        oldValues:{
            ID_STAGIONI_FK:913383
        }
    }
    2016-03-15 12:10:18,336 INFO  IDACall Performing 1 operation(s)
    2016-03-15 12:10:18,336 DEBUG DeclarativeSecurity Processing security checks for DataSource null, field null
    2016-03-15 12:10:18,336 DEBUG DeclarativeSecurity DataSource LEG_ORDINE is not in the pre-checked list, processing...
    2016-03-15 12:10:18,336 DEBUG DeclarativeSecurity Processing security checks for DataSource LEG_FASCE_PREZZO, field ID_REC
    2016-03-15 12:10:18,336 DEBUG DeclarativeSecurity DataSource LEG_FASCE_PREZZO is not in the pre-checked list, processing...
    2016-03-15 12:10:18,336 DEBUG DeclarativeSecurity Processing security checks for DataSource LEG_FASCE_PREZZO, field PREZZO_LORDO
    2016-03-15 12:10:18,336 DEBUG DeclarativeSecurity DataSource LEG_FASCE_PREZZO is not in the pre-checked list, processing...
    2016-03-15 12:10:18,337 DEBUG DeclarativeSecurity Processing security checks for DataSource LEG_FASCE_PREZZO, field ID_REC
    2016-03-15 12:10:18,337 DEBUG DeclarativeSecurity Processing security checks for DataSource LEG_FASCE_PREZZO, field TICKETING_LORDO
    2016-03-15 12:10:18,337 DEBUG DeclarativeSecurity Processing security checks for DataSource JPC_LISTINI, field ID_REC
    2016-03-15 12:10:18,337 DEBUG DeclarativeSecurity DataSource JPC_LISTINI is not in the pre-checked list, processing...
    2016-03-15 12:10:18,337 DEBUG DeclarativeSecurity Processing security checks for DataSource JPC_LISTINI, field DATA_INIZIO
    2016-03-15 12:10:18,337 DEBUG DeclarativeSecurity DataSource JPC_LISTINI is not in the pre-checked list, processing...
    2016-03-15 12:10:18,340 DEBUG AppBase [builtinApplication.fetchTotaliPagamCCList] No userTypes defined, allowing anyone access to all operations for this application
    2016-03-15 12:10:18,340 DEBUG AppBase [builtinApplication.fetchTotaliPagamCCList] No public zero-argument method named '_fetchTotaliPagamCCList' found, performing generic datasource operation
    2016-03-15 12:10:18,347 DEBUG PoolableSQLConnectionFactory [builtinApplication.fetchTotaliPagamCCList] makeObject() created an unpooled Connection '789182145'
    2016-03-15 12:10:18,347 DEBUG SQLConnectionManager [builtinApplication.fetchTotaliPagamCCList] Borrowed connection '789182145'
    2016-03-15 12:10:18,347 DEBUG SQLTransaction [builtinApplication.fetchTotaliPagamCCList] Started new dbJpcEP transaction "789182145"
    2016-03-15 12:10:18,347 INFO  SQLDriver [builtinApplication.fetchTotaliPagamCCList] Executing SQL query on 'dbJpcEP' using connection '789182145': SELECT COUNT(*) FROM DBSALES.JPC_CONTRATTI, LEG_FASCE_PREZZO, JPC_STATI_CONTRATTO, JPC_ANAGRAFICA_CLIENTI, JPC_TIPI_SOGGETTO, JPC_FATTURE WHERE
                    (JPC_CONTRATTI.ID_STAGIONI_FK=913383)
                    AND JPC_ANAGRAFICA_CLIENTI.ID_REC = JPC_CONTRATTI.ID_ANAGRAFICA_CLIENTI_FK
                    AND JPC_ANAGRAFICA_CLIENTI.ID_TIPI_SOGGETTO_FK = JPC_TIPI_SOGGETTO.ID_REC
                    AND JPC_CONTRATTI.ID_STATO_CONTRATTO_FK = JPC_STATI_CONTRATTO.ID_REC
                    AND JPC_CONTRATTI.IS_ANNULLATO = 'F'
                    AND JPC_CONTRATTI.TIPO = 'LEG'
                    AND JPC_CONTRATTI.ID_REC = JPC_FATTURE.ID_CONTRATTI_FK(+)
                    AND JPC_STATI_CONTRATTO.CODICE IN ('INC', 'ACC', 'TKT')
                    AND JPC_CONTRATTI.ID_FASCIA_PREZZO_LEG_FK = LEG_FASCE_PREZZO.ID_REC
                 AND  
    2016-03-15 12:10:18,354 DEBUG DSRequest freeOnExecute is false for request of type fetch on DataSource LEG_ORDINE - not freeing resources!
    2016-03-15 12:10:18,354 WARN  RequestContext dsRequest.execute() failed:  
    java.sql.SQLSyntaxErrorException: ORA-00936: espressione mancante
    If I add skipRowCount="true" to the operationBinding, the generated query is correct.

    The operationBinding is:

    Code:
            <operationBinding operationType="fetch" operationId="fetchTotaliPagamCCList"
                              customFields="DATA_INCASSO,VALORE_SERVIZI_LORDO,VALORE_TICKETING_PER_POSTI,VALORE_ORDINE,SERVIZI_NETTI,VALORE_ORDINE_SCONTATO"
            >
                <selectClause>
                    'Totale' AS SOGGETTO_DESC,
                    NVL(SUM((LEG_FASCE_PREZZO.TICKETING_LORDO * JPC_CONTRATTI.QTA_POSTI)), 0) AS VALORE_TICKETING_PER_POSTI,
                    NVL(SUM(LEG_FASCE_PREZZO.SERVIZI_LORDO * JPC_CONTRATTI.QTA_POSTI),0) AS VALORE_SERVIZI_LORDO,
                    NVL(SUM(LEG_FASCE_PREZZO.PREZZO_LORDO * JPC_CONTRATTI.QTA_POSTI), 0) AS VALORE_ORDINE,
                    NVL(SUM(JPC_CONTRATTI.SCONTO_INCONDIZIONATO_VALORE), 0) AS SCONTO_INCONDIZIONATO_VALORE,
                    NVL(SUM(NVL(((LEG_FASCE_PREZZO.PREZZO_LORDO * JPC_CONTRATTI.QTA_POSTI) - JPC_CONTRATTI.SCONTO_INCONDIZIONATO_VALORE),
                        (LEG_FASCE_PREZZO.PREZZO_LORDO * JPC_CONTRATTI.QTA_POSTI))), 0) as VALORE_ORDINE_SCONTATO,
                    NVL(SUM(
                        (
                            DECODE(
                                ((LEG_FASCE_PREZZO.SERVIZI_LORDO * JPC_CONTRATTI.QTA_POSTI) - JPC_CONTRATTI.SCONTO_INCONDIZIONATO_VALORE),
                                NULL, (LEG_FASCE_PREZZO.SERVIZI_LORDO * JPC_CONTRATTI.QTA_POSTI),
                                ((LEG_FASCE_PREZZO.SERVIZI_LORDO * JPC_CONTRATTI.QTA_POSTI) - JPC_CONTRATTI.SCONTO_INCONDIZIONATO_VALORE)
                            )
                        )
                    ), 0) AS SERVIZI_NETTI
                </selectClause>
                <tableClause>$defaultTableClause, LEG_FASCE_PREZZO, JPC_STATI_CONTRATTO, JPC_ANAGRAFICA_CLIENTI, JPC_TIPI_SOGGETTO, JPC_FATTURE</tableClause>
                <whereClause>
                    $defaultWhereClause
                    AND JPC_ANAGRAFICA_CLIENTI.ID_REC = JPC_CONTRATTI.ID_ANAGRAFICA_CLIENTI_FK
                    AND JPC_ANAGRAFICA_CLIENTI.ID_TIPI_SOGGETTO_FK = JPC_TIPI_SOGGETTO.ID_REC
                    AND JPC_CONTRATTI.ID_STATO_CONTRATTO_FK = JPC_STATI_CONTRATTO.ID_REC
                    AND JPC_CONTRATTI.IS_ANNULLATO = 'F'
                    AND JPC_CONTRATTI.TIPO = 'LEG'
                    AND JPC_CONTRATTI.ID_REC = JPC_FATTURE.ID_CONTRATTI_FK(+)
                    AND JPC_STATI_CONTRATTO.CODICE IN ('INC', 'ACC', 'TKT')
                    AND JPC_CONTRATTI.ID_FASCIA_PREZZO_LEG_FK = LEG_FASCE_PREZZO.ID_REC
                </whereClause>
            </operationBinding>
    the customFields are from the LEG_FASCE_PREZZO table, (they have a customSelectExpression) joined via this foreignKey:
    Code:
            <field name="ID_FASCIA_PREZZO_LEG_FK" type="integer" foreignKey="LEG_FASCE_PREZZO.ID_REC" relatedTableAlias="LEG_FASCE_PREZZO"></field>
    Note: the relatedTableAlias is equal to the table name/dataSource ID. It could be the problem?

    there are also a couple of fields 'included from' LEG_FASCE_PREZZO, but with customSQL="true" and not mentioned in customFields:
    Code:
            <field name="VALORE_BIGLIETTO" type="localeFloat" format=",##0.00 €" customSQL="true" includeFrom="LEG_FASCE_PREZZO.PREZZO_LORDO"
                   includeVia="ID_FASCIA_PREZZO_LEG_FK"/>
            <field name="VALORE_TICKETING" type="float" customSQL="true" includeFrom="LEG_FASCE_PREZZO.TICKETING_LORDO"
                   includeVia="ID_FASCIA_PREZZO_LEG_FK"/>
    Anyway, if I'll succeed in putting together a test case, I'll update this thread.
    Last edited by claudiobosticco; 15 Mar 2016, 03:44.

    #2
    same behavior with 11.0:
    SmartClient Version: SNAPSHOT_v11.0d_2016-03-14/EVAL Deployment (expires 2016.05.13_22.37.14) Licensed to: Isomorphic Software (#ISC_EVAL_NIGHTLY)

    Comment


      #3
      and this is the complete stacktrace of the error:
      Code:
      2016-03-15 15:50:12,543 WARN  RequestContext dsRequest.execute() failed:  
      java.sql.SQLSyntaxErrorException: ORA-00936: espressione mancante
      
          at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
          at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
          at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
          at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
          at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
          at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
          at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:202)
          at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:45)
          at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:766)
          at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897)
          at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034)
          at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1244)
          at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:420)
          at com.isomorphic.sql.SQLDriver.getTransformedResults(SQLDriver.java:642)
          at com.isomorphic.sql.SQLDriver.getTransformedResults(SQLDriver.java:566)
          at com.isomorphic.sql.SQLDriver.getTransformedResults(SQLDriver.java:559)
          at com.isomorphic.sql.SQLDriver.getScalarResult(SQLDriver.java:752)
          at com.isomorphic.sql.SQLDriver.executeScalar(SQLDriver.java:1047)
          at com.isomorphic.sql.SQLDataSource.runRowCountQuery(SQLDataSource.java:3198)
          at com.isomorphic.sql.SQLDataSource.executeWindowedSelect(SQLDataSource.java:2583)
          at com.isomorphic.sql.SQLDataSource.SQLExecute(SQLDataSource.java:2009)
          at com.isomorphic.sql.SQLDataSource.processRequest(SQLDataSource.java:447)
          at com.isomorphic.sql.SQLDataSource.executeFetch(SQLDataSource.java:392)
          at com.isomorphic.datasource.DataSource.execute(DataSource.java:2236)
          at com.isomorphic.application.AppBase.executeDefaultDSOperation(AppBase.java:735)
          at com.isomorphic.application.AppBase.executeAppOperation(AppBase.java:652)
          at com.isomorphic.application.AppBase.execute(AppBase.java:493)
          at com.isomorphic.datasource.DSRequest.execute(DSRequest.java:2694)
          at com.isomorphic.servlet.IDACall.handleDSRequest(IDACall.java:228)
          at com.isomorphic.servlet.IDACall.processRPCTransaction(IDACall.java:187)
          at com.isomorphic.servlet.IDACall.processRequest(IDACall.java:152)
          at com.isomorphic.servlet.IDACall._processRequest(IDACall.java:119)
          at com.isomorphic.servlet.IDACall.doPost(IDACall.java:79)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
          at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:162)
          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 net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:200)
          at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
          at com.juve.utils.Log4jSessionFilter.doFilter(Log4jSessionFilter.java:65)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
          at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
          at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:109)
          at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
          at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
          at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
          at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
          at com.isomorphic.servlet.CompressionFilter._doFilter(CompressionFilter.java:260)
          at com.isomorphic.servlet.BaseFilter.doFilter(BaseFilter.java:88)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
          at com.isomorphic.js.JSSyntaxScannerFilter._doFilter(JSSyntaxScannerFilter.java:262)
          at com.isomorphic.servlet.BaseFilter.doFilter(BaseFilter.java:88)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
          at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
          at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
          at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
          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:222)
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
          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:99)
          at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
          at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
          at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
          at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
          at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
          at java.lang.Thread.run(Thread.java:744)

      Comment


        #4
        I don't know if I'm doing something legit if I try to step thru the decompiled SQLDataSource class with the Intellij debugger, let me know if I can, maybe I could give you some hints on what's going wrong...

        Comment


          #5
          We have to technically forbid reverse engineering in our license files to help prevent abuses like teams that want to decompile our source and sell a near-clone of our product, however, we hereby grant you (user claudiobosticco) the right to reverse engineer the product, solely for the purpose of discovering and reporting bugs to Isomorphic.
          Last edited by Isomorphic; 15 Mar 2016, 08:13.

          Comment


            #6
            ok, thanks, may I post here what I'm observing (with decompiled code fragments) or do you prefer to start a private conversation?

            Comment


              #7
              Posting here is fine. Hardly needs to be said, but just avoid posting multiple whole source files and stick to fragments, as you already suggested.

              Comment


                #8
                Fine. The problem seems that in method getRowCountQueryString of SQLDriver class:
                Code:
                context.get("defaultJoinWhereClause")
                is equal to empty String, but it's tested for null, so the code flow enters here:
                Code:
                        if(!emittedJoinClause && (!"$defaultJoinWhereClause".equals(joinWhere) || context.get("defaultJoinWhereClause") != null)) {
                            if(!emittedWhere) {
                                qry = qry + " WHERE " + joinWhere;
                            } else {
                                qry = qry + " AND " + joinWhere;
                            }
                        }
                and appends
                Code:
                AND $defaultJoinWhereClause
                to the end of the where clause.

                Please let me know if you need more in-depth details.

                Comment


                  #9
                  I forgot to mention another detail. In the first post I wrote the query was working with 10.0.

                  BUT, when switching to 10.1, I had to modify that (and some other) query: I added LEG_FASCE_PREZZO in the tableClause, and the join condition in the where clause:
                  Code:
                  AND JPC_CONTRATTI.ID_FASCIA_PREZZO_LEG_FK = LEG_FASCE_PREZZO.ID_REC
                  With 10.0, they were added automatically, thanks to the includeFrom fields which I already mention above:
                  Code:
                  <field name="VALORE_BIGLIETTO" type="localeFloat" format=",##0.00 €" customSQL="true" includeFrom="LEG_FASCE_PREZZO.PREZZO_LORDO"              
                            includeVia="ID_FASCIA_PREZZO_LEG_FK"/>
                  <field name="VALORE_TICKETING" type="float" customSQL="true" includeFrom="LEG_FASCE_PREZZO.TICKETING_LORDO"              
                            includeVia="ID_FASCIA_PREZZO_LEG_FK"/>

                  Comment


                    #10
                    Thank you for your effort to give us so much details. It is appreciated. This issue though appears to be not a regression, but a bug. It is fixed now and will be available for download in nightly builds since Mar 26 (tomorrow).

                    Comment


                      #11
                      SmartClient Version: v10.1p_2016-03-29/Enterprise Deployment (built 2016-03-29)

                      I can confirm it's fixed, thank you very much!

                      Comment

                      Working...
                      X