<p>The problem appears when doing a count(distinct x) operation. All platforms return the null as a distinct value while Greenplum ignores it. I&#39;ll double check everything and revert if necessary. Thanks for the warning.</p>

<p>Luc</p>
<div class="gmail_quote">On Oct 6, 2011 9:12 PM, &quot;Julian Hyde&quot; &lt;<a href="mailto:julian@hydromatic.net">julian@hydromatic.net</a>&gt; wrote:<br type="attribution">&gt; It&#39;s standard behavior that databases don&#39;t count nulls. For example, given table t with one column c and values null, 1, 2, then &#39;select count(*) from t&#39; will return 3 and &#39;select count(c) from t&#39; will return 2.<br>
&gt; <br>&gt; Sounds like Greenplum complies with the standard, so you shouldn&#39;t need to do anything special in the dialect. I think there might be some other problem.<br>&gt; <br>&gt; Julian<br>&gt; <br>&gt; On Oct 6, 2011, at 5:58 PM, Luc Boudreau wrote:<br>
&gt; <br>&gt;&gt; <a href="http://p4web.eigenbase.org/@md=d&amp;c=6PU@/14675?ac=10">http://p4web.eigenbase.org/@md=d&amp;c=6PU@/14675?ac=10</a><br>&gt;&gt; <br>&gt;&gt; Change 14675 by lucboudreau@luc-mondrian-3.2 on 2011/10/06 17:56:36<br>
&gt;&gt; <br>&gt;&gt;         MONDRIAN: Fixes an issue with Greenplum. A null value can be returned by the driver, thus creating an NPE when comparing values. Also fixes an issue where COUNT() in Greenplum doesn&#39;t count null values.<br>
&gt;&gt; <br>&gt;&gt; Affected files ...<br>&gt;&gt; <br>&gt;&gt; ... //open/mondrian/src/main/mondrian/rolap/SqlMemberSource.java#122 edit<br>&gt;&gt; ... //open/mondrian/src/main/mondrian/spi/Dialect.java#27 edit<br>&gt;&gt; ... //open/mondrian/src/main/mondrian/spi/impl/GreenplumDialect.java#5 edit<br>
&gt;&gt; ... //open/mondrian/src/main/mondrian/spi/impl/JdbcDialectImpl.java#34 edit<br>&gt;&gt; <br>&gt;&gt; Differences ...<br>&gt;&gt; <br>&gt;&gt; ==== //open/mondrian/src/main/mondrian/rolap/SqlMemberSource.java#122 (ktext) ====<br>
&gt;&gt; <br>&gt;&gt; 2c2<br>&gt;&gt; &lt; // $Id: //open/mondrian/src/main/mondrian/rolap/SqlMemberSource.java#121 $<br>&gt;&gt; ---<br>&gt;&gt;&gt; // $Id: //open/mondrian/src/main/mondrian/rolap/SqlMemberSource.java#122 $<br>
&gt;&gt; 41c41<br>&gt;&gt; &lt;  * @version $Id: //open/mondrian/src/main/mondrian/rolap/SqlMemberSource.java#121 $<br>&gt;&gt; ---<br>&gt;&gt;&gt; * @version $Id: //open/mondrian/src/main/mondrian/rolap/SqlMemberSource.java#122 $<br>
&gt;&gt; 136c136<br>&gt;&gt; &lt;                         if (!colStr.equals(colStrings[i])) {<br>&gt;&gt; ---<br>&gt;&gt;&gt;                        if (!Util.equals(colStr, colStrings[i])) {<br>&gt;&gt; 230,231c230,233<br>
&gt;&gt; &lt;                     sqlQuery.addSelect(colDef, null);<br>&gt;&gt; &lt;                     sqlQuery.addOrderBy(colDef, true, false, true);<br>&gt;&gt; ---<br>&gt;&gt;&gt;                    final String exp =<br>
&gt;&gt;&gt;                        sqlQuery.getDialect().generateCountExpression(colDef);<br>&gt;&gt;&gt;                    sqlQuery.addSelect(exp, null);<br>&gt;&gt;&gt;                    sqlQuery.addOrderBy(exp, true, false, true);<br>
&gt;&gt; 240c242,244<br>&gt;&gt; &lt;                     sb.append(colDef);<br>&gt;&gt; ---<br>&gt;&gt;&gt;                    sb.append(<br>&gt;&gt;&gt;                        sqlQuery.getDialect()<br>&gt;&gt;&gt;                            .generateCountExpression(colDef));<br>
&gt;&gt; <br>&gt;&gt; ==== //open/mondrian/src/main/mondrian/spi/Dialect.java#27 (ktext) ====<br>&gt;&gt; <br>&gt;&gt; 86c86<br>&gt;&gt; &lt;  * @version $Id: //open/mondrian/src/main/mondrian/spi/Dialect.java#26 $<br>&gt;&gt; ---<br>
&gt;&gt;&gt; * @version $Id: //open/mondrian/src/main/mondrian/spi/Dialect.java#27 $<br>&gt;&gt; 718a719,728<br>&gt;&gt;&gt;     * Some databases, like Greenplum, don&#39;t include nulls as part<br>&gt;&gt;&gt;     * of the results of a COUNT sql call. This allows dialects<br>
&gt;&gt;&gt;     * to wrap the count expression in something before it is used<br>&gt;&gt;&gt;     * in the query.<br>&gt;&gt;&gt;     * @param exp The expression to wrap.<br>&gt;&gt;&gt;     * @return A valid expression to use for a count operation.<br>
&gt;&gt;&gt;     */<br>&gt;&gt;&gt;    String generateCountExpression(String exp);<br>&gt;&gt;&gt; <br>&gt;&gt;&gt;    /**<br>&gt;&gt; <br>&gt;&gt; ==== //open/mondrian/src/main/mondrian/spi/impl/GreenplumDialect.java#5 (ktext) ====<br>
&gt;&gt; <br>&gt;&gt; 20c20<br>&gt;&gt; &lt;  * @version $Id: //open/mondrian/src/main/mondrian/spi/impl/GreenplumDialect.java#4 $<br>&gt;&gt; ---<br>&gt;&gt;&gt; * @version $Id: //open/mondrian/src/main/mondrian/spi/impl/GreenplumDialect.java#5 $<br>
&gt;&gt; 76a77,80<br>&gt;&gt;&gt;    public String generateCountExpression(String exp) {<br>&gt;&gt;&gt;        return caseWhenElse( exp + &quot; ISNULL&quot;, &quot;&#39;0&#39;&quot;, &quot;TEXT(&quot; + exp + &quot;)&quot;);<br>
&gt;&gt;&gt;    }<br>&gt;&gt;&gt; <br>&gt;&gt; <br>&gt;&gt; ==== //open/mondrian/src/main/mondrian/spi/impl/JdbcDialectImpl.java#34 (ktext) ====<br>&gt;&gt; <br>&gt;&gt; 32c32<br>&gt;&gt; &lt;  * @version $Id: //open/mondrian/src/main/mondrian/spi/impl/JdbcDialectImpl.java#33 $<br>
&gt;&gt; ---<br>&gt;&gt;&gt; * @version $Id: //open/mondrian/src/main/mondrian/spi/impl/JdbcDialectImpl.java#34 $<br>&gt;&gt; 871a872,875<br>&gt;&gt;&gt;    public String generateCountExpression(String exp) {<br>&gt;&gt;&gt;        return exp;<br>
&gt;&gt;&gt;    }<br>&gt;&gt;&gt; <br>&gt;&gt; <br>&gt; <br></div>