1 #include "Sql.h"
2 
3 namespace Upp {
4 
SetTrue()5 void SqlBool::SetTrue() {
6 	priority = TRUEVAL;
7 	text = "0=0";
8 }
9 
SetFalse()10 void SqlBool::SetFalse() {
11 	priority = FALSEVAL;
12 	text = "0!=0";
13 }
14 
SetBool(bool b)15 void SqlBool::SetBool(bool b) {
16 	if(b) SetTrue();
17 	else  SetFalse();
18 }
19 
operator !(const SqlBool & a)20 SqlBool operator!(const SqlBool& a) {
21 	if(a.IsBool())  return !a.AsBool();
22 	return SqlBool(" not " + a(SqlS::UNARY), SqlS::UNARY);
23 }
24 
operator <(const SqlVal & a,const SqlVal & b)25 SqlBool operator<(const SqlVal& a, const SqlVal& b) {
26 	return SqlBool(a, " < ", b, SqlS::COMP);
27 }
28 
operator >(const SqlVal & a,const SqlVal & b)29 SqlBool operator>(const SqlVal& a, const SqlVal& b) {
30 	return SqlBool(a, " > ", b, SqlS::COMP);
31 }
32 
operator <=(const SqlVal & a,const SqlVal & b)33 SqlBool operator<=(const SqlVal& a, const SqlVal& b) {
34 	return SqlBool(a, " <= ", b, SqlS::COMP);
35 }
36 
operator >=(const SqlVal & a,const SqlVal & b)37 SqlBool operator>=(const SqlVal& a, const SqlVal& b) {
38 	return SqlBool(a, " >= ", b, SqlS::COMP);
39 }
40 
operator ==(const SqlVal & a,const SqlVal & b)41 SqlBool operator==(const SqlVal& a, const SqlVal& b) {
42 	return a.IsNull() ? b.IsNull() ? true : SqlIsNull(b)
43 		              : b.IsNull() ? SqlIsNull(a) : SqlBool(a, " = ", b, SqlS::COMP);
44 }
45 
operator !=(const SqlVal & a,const SqlVal & b)46 SqlBool operator!=(const SqlVal& a, const SqlVal& b) {
47 	return a.IsNull() ? b.IsNull() ? false : NotNull(b)
48 		              : b.IsNull() ? NotNull(a) : SqlBool(a, " != ", b, SqlS::COMP);
49 
50 }
51 
IsSame(const SqlVal & a,const SqlVal & b)52 SqlBool IsSame(const SqlVal& a, const SqlVal& b)
53 {
54 	return SqlBool(a, SqlCode(MY_SQL, "<=>")(" is not distinct from "), b, SqlS::COMP);
55 }
56 
operator &&(const SqlBool & a,const SqlBool & b)57 SqlBool operator&&(const SqlBool& a, const SqlBool& b) {
58 	if(a.IsEmpty() || a.IsTrue())  return b;
59 	if(b.IsEmpty() || b.IsTrue())  return a;
60 	if(a.IsFalse() || b.IsFalse()) return false;
61 	return SqlBool(a, " and ", b, SqlS::LAND);
62 }
63 
operator -(const SqlBool & a,const SqlBool & b)64 SqlBool operator- (const SqlBool& a, const SqlBool& b) {
65 	if(a.IsFalse() || b.IsTrue() || b.IsEmpty()) return SqlBool(false);
66 	if(b.IsFalse()) return a;
67 	return SqlBool(a, " and not ", SqlS(b(SqlS::COMP), SqlS::HIGH), SqlS::LAND);
68 }
69 
operator ||(const SqlBool & a,const SqlBool & b)70 SqlBool operator||(const SqlBool& a, const SqlBool& b) {
71 	if(a.IsEmpty() || a.IsFalse()) return b;
72 	if(b.IsEmpty() || b.IsFalse()) return a;
73 	if(a.IsTrue() || b.IsTrue())   return true;
74 	return SqlBool(a, " or ", b, SqlS::LOR);
75 }
76 
operator |=(SqlBool & a,const SqlBool & b)77 SqlBool operator|=(SqlBool& a, const SqlBool& b) { return a = a || b; }
78 
operator &=(SqlBool & a,const SqlBool & b)79 SqlBool operator&=(SqlBool& a, const SqlBool& b) { return a = a && b; }
80 
SqlIsNull(const SqlVal & a)81 SqlBool SqlIsNull(const SqlVal& a) {
82 	return a.IsNull() ? true : SqlBool(a(SqlS::COMP) + " is NULL", SqlS::COMP);
83 }
84 
NotNull(const SqlVal & a)85 SqlBool NotNull(const SqlVal& a) {
86 	return a.IsNull() ? false : SqlBool(a(SqlS::COMP) + " is not NULL", SqlS::COMP);
87 }
88 
SqlFirstRow()89 SqlBool SqlFirstRow() {
90 	return SqlRowNum() == 1;
91 }
92 
Like(const SqlVal & a,const SqlVal & b,bool cs)93 SqlBool Like(const SqlVal& a, const SqlVal& b, bool cs) {
94 	return SqlBool(a, SqlCode
95 			(MY_SQL, cs ? " like binary " : " like ")
96 			(PGSQL, cs ? " like " : " ilike ")
97 			(" like "),	b, SqlS::COMP);
98 }
99 
LikeUpperAscii(const SqlVal & a,const SqlVal & b)100 SqlBool LikeUpperAscii(const SqlVal& a, const SqlVal& b) {
101 	return Like(UpperAscii(a), UpperAscii(b));
102 }
103 
NotLike(const SqlVal & a,const SqlVal & b,bool cs)104 SqlBool NotLike(const SqlVal& a, const SqlVal& b, bool cs) {
105 	return SqlBool(a, SqlCode
106 			(PGSQL, cs ? " not like " : " not ilike ")
107 			(" not like "), b, SqlS::COMP);
108 }
109 
Between(const SqlVal & a,const SqlVal & l,const SqlVal & h)110 SqlBool Between(const SqlVal& a, const SqlVal& l, const SqlVal& h) {
111 	return SqlBool(a(SqlS::COMP) + " between " + l(SqlS::COMP) + " and " + h(SqlS::COMP),
112 		           SqlS::COMP);
113 }
114 
NotBetween(const SqlVal & a,const SqlVal & l,const SqlVal & h)115 SqlBool NotBetween(const SqlVal& a, const SqlVal& l, const SqlVal& h) {
116 	return SqlBool(a(SqlS::COMP) + " not between " + l(SqlS::COMP) + " and " + h(SqlS::COMP),
117 		           SqlS::COMP);
118 }
119 
In(const SqlVal & a,const SqlSet & b)120 SqlBool In(const SqlVal& a, const SqlSet& b) {
121 	if(a.IsNull() || b.IsEmpty()) return false;
122 	return SqlBool(a(SqlS::COMP) + " in " + b(), SqlS::COMP);
123 }
124 
NotIn(const SqlVal & a,const SqlSet & b)125 SqlBool NotIn(const SqlVal& a, const SqlSet& b) {
126 	if(a.IsNull() || b.IsEmpty()) return true;
127 	return SqlBool(a(SqlS::COMP) + " not in " + b(), SqlS::COMP);
128 }
129 
Exists(const SqlSet & set)130 SqlBool Exists(const SqlSet& set) {
131 	return SqlBool("exists " + set(), SqlS::COMP);
132 }
133 
NotExists(const SqlSet & set)134 SqlBool NotExists(const SqlSet& set) {
135 	return SqlBool("not exists " + set(), SqlS::COMP);
136 }
137 
LeftJoin(SqlVal v1,SqlVal v2)138 SqlBool LeftJoin(SqlVal v1, SqlVal v2) {
139 	return SqlId(~v1 + "(+)") == v2;
140 }
141 
RightJoin(SqlVal v1,SqlVal v2)142 SqlBool RightJoin(SqlVal v1, SqlVal v2) {
143 	return v1 == SqlId(~v2 + "(+)");
144 }
145 
Join(SqlId tab1,SqlId tab2,SqlId key)146 SqlBool Join(SqlId tab1, SqlId tab2, SqlId key) {
147 	return key.Of(tab1) == key.Of(tab2);
148 }
149 
LeftJoin(SqlId tab1,SqlId tab2,SqlId key)150 SqlBool LeftJoin(SqlId tab1, SqlId tab2, SqlId key) {
151 	return SqlId(key.Of(tab1).Quoted() + "(+)") == key.Of(tab2).Quoted();
152 }
153 
RightJoin(SqlId tab1,SqlId tab2,SqlId key)154 SqlBool RightJoin(SqlId tab1, SqlId tab2, SqlId key) {
155 	return key.Of(tab1).Quoted() == SqlId(key.Of(tab2).Quoted() + "(+)");
156 }
157 
158 }
159