Hi Even,<div><br></div><div>Thanks for the valuable comments, I&#39;ve modified the patch in accordance with your suggestions.</div><div><a href="http://trac.osgeo.org/gdal/attachment/ticket/4259/swq_op_general.cpp.patch">http://trac.osgeo.org/gdal/attachment/ticket/4259/swq_op_general.cpp.patch</a></div>
<div><br></div><div>Let me know if you find something else that can be changed. I&#39;ve just added a warning if the conversion fails, but I&#39;m not quite sure if we can easily generate errors at this state of the processing.</div>
<div><br></div><div>Best regards,</div><div><br></div><div>Tamas</div><div><br></div><div><br><br><div class="gmail_quote">2011/9/23 Even Rouault <span dir="ltr">&lt;<a href="mailto:even.rouault@mines-paris.org">even.rouault@mines-paris.org</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Le mercredi 21 septembre 2011 19:20:17, Tamas Szekeres a écrit :<br>
<div class="im">&gt; Hi Devs,<br>
&gt;<br>
&gt; We have some problems due to the recent changes in the SQL expression<br>
&gt; parser which is related to the change in the implicit type conversion<br>
&gt; behaviour.<br>
&gt;<br>
&gt; Formerly we could safely use the following statement:<br>
&gt;<br>
&gt; select * from mytable where ogr_fid in (&#39;1100&#39;,&#39;1101&#39;,&#39;1102&#39;)<br>
&gt;<br>
&gt; If the data type of ogr_fid is an integer or float then the expression<br>
&gt; evaluator has converted the string constants to numeric values implicitly.<br>
&gt;<br>
&gt; As of 1.8 the parser reports an error due to the incompatible types in the<br>
&gt; expression.<br>
&gt;<br>
</div>&gt; I&#39;ve added a ticket #4259 &lt;<a href="http://trac.osgeo.org/gdal/ticket/4259" target="_blank">http://trac.osgeo.org/gdal/ticket/4259</a>&gt; related<br>
<div class="im">&gt; to this problem including a patch to handle these string to numeric<br>
&gt; conversions.<br>
<br>
</div>You didn&#39;t mention that the patch only applies to the comparison operators (<br>
&gt;, &gt;=, &lt;, &lt;=, =, &lt;&gt;, IN and BETWEEN ), which I think is an appropriate<br>
restriction. I was a bit skeptical at the beginning if it would also apply to<br>
+, - operators for example where it is not obvious in which way the conversion<br>
should be done.<br>
<br>
I have done a bit of testing with PostgreSQL, MySQL and SQLite and, and they<br>
indeed do the conversions you suggest.<br>
<br>
I&#39;ve noticed that PostgreSQL issues an error when the conversion fails because<br>
the string constant isn&#39;t a numeric value.<br>
<br>
$ ogrinfo pg:dbname=autotest -sql &quot;select * from poly where eas_id = &#39;a&#39;&quot;<br>
INFO: Open of `pg:dbname=autotest&#39;<br>
      using driver `PostgreSQL&#39; successful.<br>
ERROR 1: ERROR: invalid input syntax for double precision type : « a »<br>
LINE 1: ...cuteSQLCursor CURSOR for select * from poly where eas_id = &#39;a&#39;...<br>
<br>
MySQL is much more silent about failed conversions however. With the MySQL OGR<br>
driver, nothing is emitted, but in the mysql console client, I could see a<br>
difference :<br>
<br>
mysql&gt; select * from poly where eas_id = &#39;a&#39;;<br>
Empty set, 10 warnings (0.00 sec)<br>
<br>
sqlite is completely silent in similar situations.<br>
<br>
Personnaly, I think it would be appropriate for the OGR SQL engine to also<br>
emit an error/warning for failed conversions (or perhaps just a CPLDebug() if<br>
we feel that there&#39;s no reason to be too verbose in such situations), but<br>
obviously there doesn&#39;t seem to be a consensus on that among SQL vendors.<br>
<br>
I believe this can be detected with something like :<br>
<br>
val = strtod(pszVal, &amp;endptr);<br>
if (endptr != pszVal + strlen(pszVal))<br>
{<br>
        CPLError(...)<br>
}<br>
<br>
<br>
As far as the proposed patch is concerned, a bit of comment in the new<br>
function to explain shortly that it converts string constants to float<br>
constants when there is a mix of arguments of type numeric and string. In<br>
which case, integer constants will also be promoted to float. But that last<br>
part happens to be what SWQAutoPromoteIntegerToFloat() does already, so<br>
perhaps you could drop that part and just call SWQAutoConvertStringToNumeric()<br>
before SWQAutoPromoteIntegerToFloat(), so that<br>
SWQAutoConvertStringToNumeric() only does what its name suggests (perhaps<br>
renaming it to SWQAutoConvertStringToFloat() would be more consistant by the<br>
way) ? I have tested that quickly and it seems to work, but more extensive<br>
testing would be welcome.<br>
<br>
On a stylistic note, I&#39;ve had a hard time figuring out the operator precedence<br>
when reading the test :<br>
<br>
        if( (eArgType == SWQ_STRING<br>
            &amp;&amp; (poSubNode-&gt;field_type == SWQ_INTEGER<br>
                || poSubNode-&gt;field_type == SWQ_FLOAT)) ||<br>
            (eArgType == SWQ_INTEGER || eArgType == SWQ_FLOAT)<br>
            &amp;&amp; (poSubNode-&gt;field_type == SWQ_STRING) )<br>
<br>
So, I&#39;d suggest to move the ( parenthesis of the last line on the line before<br>
(please check that it was indeed your intent) :<br>
<br>
        if( (eArgType == SWQ_STRING<br>
            &amp;&amp; (poSubNode-&gt;field_type == SWQ_INTEGER<br>
                || poSubNode-&gt;field_type == SWQ_FLOAT)) ||<br>
            ((eArgType == SWQ_INTEGER || eArgType == SWQ_FLOAT)<br>
            &amp;&amp; poSubNode-&gt;field_type == SWQ_STRING) )<br>
<br>
Extending ogr_sql_rfc28.py with a new test for the new behaviour would also be<br>
great.<br>
<br>
So, all in all, I&#39;m in favor of your approach and I&#39;d suggest you should go<br>
ahead with it<br>
<div class="im"><br>
&gt;<br>
&gt; However I&#39;m a bit uncertain whether some other conversions should also be<br>
&gt; supported or not. Having a larger number of conversion rules we might<br>
&gt; probably think about rewriting the current approach by using a more generic<br>
&gt; implementation.<br>
&gt;<br>
&gt; Any ideas?<br>
<br>
</div>Not really...<br>
<br>
&gt;<br>
&gt;<br>
&gt; Best regards,<br>
&gt;<br>
&gt; Tamas<br>
</blockquote></div><br></div>