Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL evaluation of IF clauses

Apologies if this is not suitable, but really this is a 'why' rather than a 'how'. Not sure that is suitable, but don't know a better place to ask and I can't think how to phrase a google to get what I am looking for.

    IF 'hell' = 'freezing over'
    BEGIN
    SELECT log(0)
    END

Look at that statement. There is no world in which the IF clause will be true. If I attempt to run it I am expecting SQL to jump past the IF clause and move to the end. Instead I get:

An invalid floating point operation occurred.

This is bizarre. So I guess that is just the way that SQL does it's thing. Except...

    IF 'hell' = 'freezing over'
    BEGIN
    SELECT 1/0
    END

There is no error here. The statement in the IF clause should still generate an error. Could anyone explain why this is not happening?

This came up whilst debuggging a massive set of SQL calcs where EXP(SUM(LOG())) is used to accumulate data within an if clause. I can alter the code to stop that happening again, but why is it evaluating something within an IF clause that is not met.

Cheers.

EDIT: Additional amusement. Try catch? Pffft

    IF 1=2
    BEGIN
        BEGIN TRY
            SELECT SQRT(-1)
        END TRY
        BEGIN CATCH
        END CATCH
    END

Non mathematical:

    IF 1=2
    BEGIN
    SELECT SUBSTRING('hello',-1,-1)
    END
like image 653
N t Avatar asked May 22 '12 14:05

N t


1 Answers

My guess would be that log(0) is effectively evaluated prematurely due to constant-folding whereas 1/0 is not, either due to its cardinality estimation or more likely the fact that the ANSI_WARNINGS setting will affect the desired result of a divide by zero (overflow vs NULL).

like image 104
Alex K. Avatar answered Oct 06 '22 04:10

Alex K.