Thank you very much, Igor. I knew there would be a simple explanation, but I was focused on operand affinities instead of order of operations. So, I have to be careful about combining mathematical expressions with the concatenation operator. I am so used to thinking of exponentiation, multiplication and division having higher precedence than anything else in an expression (PEMDAS) that I got blind-sided by the fact that concatenation has even higher precedence than those. I will use parentheses more liberally in the future to specify exactly what I want. Thank you again.
Balaji Ramanathan From: Igor Tandetnik <i...@tandetnik.org> > To: email@example.com > Cc: > Bcc: > Date: Sat, 11 Nov 2017 21:17:24 -0500 > Subject: Re: [sqlite] Can someone explain these outputs for me? > On 11/11/2017 8:55 PM, Balaji Ramanathan wrote: > >> 3. When there is a mathematical expression after the string, I get a 0. >> My string is nowhere to be seen in the output >> SQLite> select '- '||cast(-1.5 as integer)*-1 >> 0 >> > > || has the highest precedence. Your expression is interpreted as ( '- > '||cast(-1.5 as integer) ) * -1 . The string produced by the stuff in > parentheses doesn't look like a valid number, and so becomes 0 when coerced > to the same. Basically, you are doing > > select 'foobar' * -1 > > 4. But when I add 1 instead of multiplying, it produces output that >> seems to evaluate everything before the addition to zero >> SQLite> select '- '||cast(-1.5 as integer)+1 >> 1 >> > > 0 * -1 == 0 > 0 + 1 == 1 > > 5. Enclosing the mathematical expression in a printf produces the >> correct output >> SQLite> select '- '|| printf(cast(-1.5 as integer)*-1) >> - 1 >> > > So would enclosing in parentheses. The point is not printf() call, but > changing the order of evaluation. > > 6. If the output starts with a number, then it doesn't seem to matter >> what follows. Notice that the last part of the expression below is the >> same as the expression in query number 3 above, but it works fine now >> whereas previously it produced a zero as the output >> SQLite> select cast(1.5 as integer)||'-'||(cast(-1.5 as integer)*-1) >> 1-1 >> > > The last part is parenthesized here, whereas it wasn't in prior examples. > That makes all the difference. > > I am sure it has something to do with order of operations and the affinity >> of the operands, but can someone give me a summary that I can understand >> readily? The only mentions of the "||" operator on the SQLite website ( >> https://sqlite.org/lang_expr.html) don't really explain what is going on >> in >> the above examples. >> > > The part of the article you quote that you seem to overlook is "in order > from highest to lowest precedence" > -- > Igor Tandetnik > > _______________________________________________ sqlite-users mailing list firstname.lastname@example.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users