On 7-2-2015 15:54, Dimitry Sibiryakov wrote:
> 07.02.2015 14:40, Mark Rotteveel wrote:
>> Warnings are an existing feature in Firebird and I see no reason why
>> they should be removed.
>
>     Because they make API inconsistent and complicate application development.
>     Modern programming ideology is that function must returning only one 
> result and any
> unexpected thing is thrown as an exception. Warnings break that.

The differences is that an exception is a failure condition, while a 
warning signals that the action completed successfully, but it might not 
have been what the user intended or wanted.

And yes, with production use of an application you'd likely ignore (or 
only log) the warnings, but during development they might be very useful 
to detect **potential** problems. Similar when executing queries 
directly in flamerobin or isql.

>> If anything, Firebird should return more
>> warnings (eg connecting without an explicit character set, truncation
>> during select, etc).
>
>     All that you listed, are, actually, errors.

Regarding not specifying a connection character set: not specifying a 
character set implies NONE. It is something that works, but might not be 
what the user actually wanted to do: so it should be a warning.
Regarding truncation (or conversions) during select: it is a warning 
according to the SQL standard (and existing behavior in Firebird is wrong!).

As a simplified example:
SELECT CAST('abcdefgh' AS VARCHAR(1)) FROM RDB$DATABASE
currently fails in Firebird, while according to the SQL standard **it 
should succeed and raise a warning**.

To quote a few usages of warnings in the SQL standard (some of which are 
not currently supported by Firebird):

"With two exceptions, a character string expression is assignable only 
to sites of a character string type whose character set is the same. The 
exceptions are as specified in Subclause 4.2.8, “Universal character 
sets”, and such other cases as may be implementation-defined. If a store 
assignment would result in the loss of non-<space> characters due to 
truncation, then an exception condition is raised. If a retrieval 
assignment or evaluation of a <cast specification> would result in the 
loss of characters due to truncation, then **a warning condition is 
raised**." (SQL:2011 Foundation 4.2.1)

"A binary string is assignable only to sites of binary string type. If a 
store assignment would result in the loss of non-zero octets due to 
truncation, then an exception condition is raised. If a retrieval 
assignment would result in the loss of octets due to truncation, then 
**a warning condition is raised**." (SQL:2011 Foudation 4.3.1)

"If a condition is raised that causes a statement to have no effect 
other than that associated with raising the condition (that is, not a 
completion condition), then the condition is said to be an exception 
condition or exception. If a condition is raised that permits a 
statement to have an effect other than that associated with raising the 
condition (corresponding to an SQLSTATE class value of successful 
completion, warning, or no data), then the condition is said to be a 
completion condition.
...
The completion condition warning is broadly defined as **completion in 
which the effects are correct, but there is reason to caution the user 
about those effects**. It is raised for implementation-defined 
conditions as well as conditions specified in this part of ISO/IEC 9075. 
The completion condition no data has special significance and is used to 
indicate an empty result. The completion condition successful completion 
is defined to indicate a completion condition that does not correspond 
to warning or no data. This includes conditions in which the
SQLSTATE subclass provides implementation-defined information of a 
non-cautionary nature." (SQL:2011 Foundation 4.30.2)

"If the length in characters of SV is larger than LTD, then TV is the 
first LTD characters of SV. If any of the remaining characters of SV are 
non-<space> characters, then a completion condition is raised: warning — 
string data, right truncation." (SQL:2011 Foundation 6.13; + similar 
other statements)

"If FRL is greater than FRML, then the result of the <fold> is the first 
FRML characters of FR with length FRML. If any of the right-most (FRL – 
FRML) characters of FR are not <space> characters, then a completion 
condition is raised: warning — string data, right truncation." (SQL:2011 
Foundation 6.30; + similar other statements)

"If the declared type of T is fixed-length character string with length 
in characters L, and the length in characters of V is greater than L, 
then the value of T is set to the first L characters of V and a 
completion condition is raised: warning — string data, right 
truncation." (SQL:2011 Foundation, 9.1; + similar other statements)

"Let TX be the single-column table that is the result of applying the 
<value expression> to each row of T1 and eliminating null values. If one 
or more null values are eliminated, then a completion condition is 
raised: warning — null value eliminated in set function." (SQL:2011 
Foundation, 10.9)

-- 
Mark Rotteveel

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to