Merge lp:~zorba-coders/zorba/markos-scratch into lp:zorba
- markos-scratch
- Merge into trunk
Proposed by
Markos Zaharioudakis
Status: | Merged |
---|---|
Approved by: | Markos Zaharioudakis |
Approved revision: | 11139 |
Merged at revision: | 11500 |
Proposed branch: | lp:~zorba-coders/zorba/markos-scratch |
Merge into: | lp:zorba |
Diff against target: |
2148 lines (+586/-637) 15 files modified
ChangeLog (+2/-0) src/compiler/translator/translator.cpp (+17/-44) src/functions/func_booleans_impl.cpp (+2/-2) src/runtime/booleans/BooleanImpl.cpp (+52/-73) src/runtime/core/arithmetic_impl.cpp (+39/-37) src/runtime/indexing/index_ddl.cpp (+14/-13) src/runtime/maths/maths_impl.cpp (+25/-49) src/runtime/numerics/NumericsImpl.cpp (+33/-31) src/runtime/numerics/NumericsImpl.h (+2/-2) src/runtime/numerics/numerics_impl.cpp (+151/-171) src/runtime/sequences/SequencesImpl.cpp (+87/-112) src/runtime/sequences/sequences_impl.cpp (+89/-72) src/runtime/store/maps_impl.cpp (+2/-8) src/types/typeops.cpp (+66/-23) src/types/typeops.h (+5/-0) |
To merge this branch: | bzr merge lp:~zorba-coders/zorba/markos-scratch |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Markos Zaharioudakis | Approve | ||
Review via email: mp+168595@code.launchpad.net |
Commit message
1. optimization: replaced use of create_value_type() in runtime with getTypeCode()
2. optimized switch expression
Description of the change
1. optimization: replaced use of create_value_type() in runtime with getTypeCode()
2. optimized switch expression
To post a comment you must log in.
- 11139. By Markos Zaharioudakis
-
optimized switch expression
Revision history for this message
Markos Zaharioudakis (markos-za) : | # |
review:
Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote : | # |
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote : | # |
Validation queue job markos-
All tests succeeded!
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'ChangeLog' | |||
2 | --- ChangeLog 2013-06-08 05:33:57 +0000 | |||
3 | +++ ChangeLog 2013-06-11 09:57:50 +0000 | |||
4 | @@ -13,6 +13,8 @@ | |||
5 | 13 | * Optimized implementation of fn:deep-equal | 13 | * Optimized implementation of fn:deep-equal |
6 | 14 | * No need to apply document ordering on the domain expression of a FOR clause | 14 | * No need to apply document ordering on the domain expression of a FOR clause |
7 | 15 | if the FOR clause is followed by an orderby or groupby clause. | 15 | if the FOR clause is followed by an orderby or groupby clause. |
8 | 16 | * Replaced use of create_value_type() in runtime with getTypeCode(). | ||
9 | 17 | * Optimized switch expression | ||
10 | 16 | 18 | ||
11 | 17 | Bug Fixes/Other Changes: | 19 | Bug Fixes/Other Changes: |
12 | 18 | * Fixed bug #1117952 (Improve XML error output format) | 20 | * Fixed bug #1117952 (Improve XML error output format) |
13 | 19 | 21 | ||
14 | === modified file 'src/compiler/translator/translator.cpp' | |||
15 | --- src/compiler/translator/translator.cpp 2013-06-09 08:09:40 +0000 | |||
16 | +++ src/compiler/translator/translator.cpp 2013-06-11 09:57:50 +0000 | |||
17 | @@ -7977,41 +7977,16 @@ | |||
18 | 7977 | 7977 | ||
19 | 7978 | se = wrap_in_atomization(se); | 7978 | se = wrap_in_atomization(se); |
20 | 7979 | 7979 | ||
54 | 7980 | // atomizedFlwor = [let $atomv := data(E) return NULL] | 7980 | se = CREATE(treat)(theRootSctx, theUDF, loc, |
55 | 7981 | var_expr* atomv = create_temp_var(v.get_switch_expr()->get_location(), | 7981 | se, |
56 | 7982 | var_expr::let_var); | 7982 | theRTM.ANY_ATOMIC_TYPE_QUESTION, |
57 | 7983 | 7983 | TREAT_TYPE_MATCH, | |
58 | 7984 | expr* atomizedFlwor = wrap_in_let_flwor(se, atomv, NULL); | 7984 | false); |
59 | 7985 | 7985 | ||
60 | 7986 | // TODO: cast as xs:string should not really be necessary | 7986 | // flworExpr = [let $sv := data(E) treat as xs:anyAtomicType? return NULL] |
28 | 7987 | // atomizedFlwor = | ||
29 | 7988 | // [let $atomv := data(E) | ||
30 | 7989 | // return | ||
31 | 7990 | // let $sv := | ||
32 | 7991 | // if ($atomv instanceof xs:untypedAtomic) | ||
33 | 7992 | // then $atomv cast as xs:string | ||
34 | 7993 | // else $atomv | ||
35 | 7994 | // return NULL] | ||
36 | 7995 | static_cast<flwor_expr*>(atomizedFlwor)->set_return_expr( | ||
37 | 7996 | CREATE(if)(theRootSctx, | ||
38 | 7997 | theUDF, | ||
39 | 7998 | loc, | ||
40 | 7999 | CREATE(instanceof)(theRootSctx, | ||
41 | 8000 | theUDF, | ||
42 | 8001 | loc, | ||
43 | 8002 | atomv, | ||
44 | 8003 | theRTM.UNTYPED_ATOMIC_TYPE_ONE), | ||
45 | 8004 | CREATE(cast)(theRootSctx, | ||
46 | 8005 | theUDF, | ||
47 | 8006 | loc, | ||
48 | 8007 | atomv, | ||
49 | 8008 | theRTM.STRING_TYPE_ONE, | ||
50 | 8009 | false), | ||
51 | 8010 | atomv)); | ||
52 | 8011 | |||
53 | 8012 | // flworExpr = [let $sv := atomizedFlwor return NULL] | ||
61 | 8013 | var_expr* sv = create_temp_var(v.get_switch_expr()->get_location(), var_expr::let_var); | 7987 | var_expr* sv = create_temp_var(v.get_switch_expr()->get_location(), var_expr::let_var); |
63 | 8014 | expr* flworExpr = wrap_in_let_flwor(atomizedFlwor, sv, NULL); | 7988 | |
64 | 7989 | expr* flworExpr = wrap_in_let_flwor(se, sv, NULL); | ||
65 | 8015 | 7990 | ||
66 | 8016 | // retExpr = [Ed] | 7991 | // retExpr = [Ed] |
67 | 8017 | v.get_default_expr()->accept(*this); | 7992 | v.get_default_expr()->accept(*this); |
68 | @@ -8039,7 +8014,7 @@ | |||
69 | 8039 | operand->accept(*this); | 8014 | operand->accept(*this); |
70 | 8040 | 8015 | ||
71 | 8041 | expr* operandExpr = pop_nodestack(); | 8016 | expr* operandExpr = pop_nodestack(); |
73 | 8042 | operandExpr = wrap_in_atomization(operandExpr); | 8017 | |
74 | 8043 | operandExpr = CREATE(fo)(theRootSctx, | 8018 | operandExpr = CREATE(fo)(theRootSctx, |
75 | 8044 | theUDF, | 8019 | theUDF, |
76 | 8045 | loc, | 8020 | loc, |
77 | @@ -8047,6 +8022,8 @@ | |||
78 | 8047 | sv, | 8022 | sv, |
79 | 8048 | operandExpr); | 8023 | operandExpr); |
80 | 8049 | 8024 | ||
81 | 8025 | normalize_fo(static_cast<fo_expr*>(operandExpr)); | ||
82 | 8026 | |||
83 | 8050 | condOperands.push_back(operandExpr); | 8027 | condOperands.push_back(operandExpr); |
84 | 8051 | } // for | 8028 | } // for |
85 | 8052 | 8029 | ||
86 | @@ -8056,20 +8033,15 @@ | |||
87 | 8056 | } | 8033 | } |
88 | 8057 | else if (condOperands.size() > 1) | 8034 | else if (condOperands.size() > 1) |
89 | 8058 | { | 8035 | { |
96 | 8059 | condExpr = theExprManager-> | 8036 | condExpr = CREATE(fo)(theRootSctx, theUDF, loc, |
97 | 8060 | create_fo_expr(theRootSctx, | 8037 | BUILTIN_FUNC(OP_OR_N), condOperands); |
92 | 8061 | theUDF, | ||
93 | 8062 | loc, | ||
94 | 8063 | BUILTIN_FUNC(OP_OR_N), | ||
95 | 8064 | condOperands); | ||
98 | 8065 | } | 8038 | } |
99 | 8066 | 8039 | ||
100 | 8067 | switchCaseClause->get_return_expr()->accept(*this); | 8040 | switchCaseClause->get_return_expr()->accept(*this); |
101 | 8068 | expr* caseReturnExpr = pop_nodestack(); | 8041 | expr* caseReturnExpr = pop_nodestack(); |
102 | 8069 | 8042 | ||
103 | 8070 | // retExpr = [if (condExpr) then caseReturnExpr else retExpr] | 8043 | // retExpr = [if (condExpr) then caseReturnExpr else retExpr] |
106 | 8071 | retExpr = theExprManager-> | 8044 | retExpr = CREATE(if)(theRootSctx, theUDF, loc, condExpr, caseReturnExpr, retExpr); |
105 | 8072 | create_if_expr(theRootSctx, theUDF, loc, condExpr, caseReturnExpr, retExpr); | ||
107 | 8073 | 8045 | ||
108 | 8074 | } // for | 8046 | } // for |
109 | 8075 | 8047 | ||
110 | @@ -8088,6 +8060,7 @@ | |||
111 | 8088 | ZORBA_ASSERT (false); | 8060 | ZORBA_ASSERT (false); |
112 | 8089 | } | 8061 | } |
113 | 8090 | 8062 | ||
114 | 8063 | |||
115 | 8091 | void* begin_visit(const SwitchCaseClause& v) | 8064 | void* begin_visit(const SwitchCaseClause& v) |
116 | 8092 | { | 8065 | { |
117 | 8093 | TRACE_VISIT(); | 8066 | TRACE_VISIT(); |
118 | @@ -8095,7 +8068,7 @@ | |||
119 | 8095 | return NULL; | 8068 | return NULL; |
120 | 8096 | } | 8069 | } |
121 | 8097 | 8070 | ||
123 | 8098 | void end_visit (const SwitchCaseClause& v, void* /*visit_state*/) | 8071 | void end_visit(const SwitchCaseClause& v, void* /*visit_state*/) |
124 | 8099 | { | 8072 | { |
125 | 8100 | TRACE_VISIT_OUT (); | 8073 | TRACE_VISIT_OUT (); |
126 | 8101 | // shouldn't get here, begin_visit() rejects visitor | 8074 | // shouldn't get here, begin_visit() rejects visitor |
127 | 8102 | 8075 | ||
128 | === modified file 'src/functions/func_booleans_impl.cpp' | |||
129 | --- src/functions/func_booleans_impl.cpp 2013-02-07 17:24:36 +0000 | |||
130 | +++ src/functions/func_booleans_impl.cpp 2013-06-11 09:57:50 +0000 | |||
131 | @@ -868,8 +868,8 @@ | |||
132 | 868 | // http://www.w3.org/TR/xquery-11/#dt-equivalence-two-atomic-values | 868 | // http://www.w3.org/TR/xquery-11/#dt-equivalence-two-atomic-values |
133 | 869 | DECL(sctx, op_atomic_values_equivalent, | 869 | DECL(sctx, op_atomic_values_equivalent, |
134 | 870 | (createQName(zorba_ns, "", "atomic-values-equivalent"), | 870 | (createQName(zorba_ns, "", "atomic-values-equivalent"), |
137 | 871 | GENV_TYPESYSTEM.ANY_ATOMIC_TYPE_STAR, | 871 | GENV_TYPESYSTEM.ANY_ATOMIC_TYPE_QUESTION, |
138 | 872 | GENV_TYPESYSTEM.ANY_ATOMIC_TYPE_STAR, | 872 | GENV_TYPESYSTEM.ANY_ATOMIC_TYPE_QUESTION, |
139 | 873 | GENV_TYPESYSTEM.BOOLEAN_TYPE_ONE)); | 873 | GENV_TYPESYSTEM.BOOLEAN_TYPE_ONE)); |
140 | 874 | 874 | ||
141 | 875 | } | 875 | } |
142 | 876 | 876 | ||
143 | === modified file 'src/runtime/booleans/BooleanImpl.cpp' | |||
144 | --- src/runtime/booleans/BooleanImpl.cpp 2013-05-08 20:14:47 +0000 | |||
145 | +++ src/runtime/booleans/BooleanImpl.cpp 2013-06-11 09:57:50 +0000 | |||
146 | @@ -121,7 +121,6 @@ | |||
147 | 121 | // node => true | 121 | // node => true |
148 | 122 | result = negate ^ true; | 122 | result = negate ^ true; |
149 | 123 | } | 123 | } |
150 | 124 | #ifdef ZORBA_WITH_JSON | ||
151 | 125 | else if (item->isJSONItem()) | 124 | else if (item->isJSONItem()) |
152 | 126 | { | 125 | { |
153 | 127 | xqtref_t type = tm->create_value_type(item); | 126 | xqtref_t type = tm->create_value_type(item); |
154 | @@ -129,7 +128,6 @@ | |||
155 | 129 | RAISE_ERROR(err::FORG0006, loc, | 128 | RAISE_ERROR(err::FORG0006, loc, |
156 | 130 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), *type, "fn:boolean" )); | 129 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), *type, "fn:boolean" )); |
157 | 131 | } | 130 | } |
158 | 132 | #endif | ||
159 | 133 | else | 131 | else |
160 | 134 | { | 132 | { |
161 | 135 | store::SchemaTypeCode type = item->getTypeCode(); | 133 | store::SchemaTypeCode type = item->getTypeCode(); |
162 | @@ -1221,86 +1219,67 @@ | |||
163 | 1221 | store::Item_t& result, | 1219 | store::Item_t& result, |
164 | 1222 | PlanState& planState) const | 1220 | PlanState& planState) const |
165 | 1223 | { | 1221 | { |
169 | 1224 | store::Item_t lItem0, lItem1, tItem0, tItem1; | 1222 | store::Item_t lItem0, lItem1; |
170 | 1225 | int count0, count1; | 1223 | store::SchemaTypeCode type0; |
171 | 1226 | xqtref_t type0, type1; | 1224 | store::SchemaTypeCode type1; |
172 | 1227 | bool are_equivalent; | 1225 | bool are_equivalent; |
173 | 1228 | 1226 | ||
174 | 1229 | RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
175 | 1230 | TypeManager* tm = theSctx->get_typemanager(); | ||
176 | 1231 | |||
177 | 1232 | PlanIteratorState* state; | 1227 | PlanIteratorState* state; |
178 | 1233 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 1228 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
179 | 1234 | 1229 | ||
180 | 1235 | count0 = 0; | ||
181 | 1236 | count1 = 0; | ||
182 | 1237 | |||
183 | 1238 | if (consumeNext(lItem0, theChild0.getp(), planState)) | 1230 | if (consumeNext(lItem0, theChild0.getp(), planState)) |
204 | 1239 | count0 = 1; | 1231 | { |
205 | 1240 | 1232 | if (consumeNext(lItem1, theChild1.getp(), planState)) | |
206 | 1241 | if (count0 && consumeNext(tItem0, theChild0.getp(), planState)) | 1233 | { |
207 | 1242 | throw XQUERY_EXCEPTION( | 1234 | type0 = lItem0->getTypeCode(); |
208 | 1243 | err::XPTY0004, | 1235 | type1 = lItem1->getTypeCode(); |
209 | 1244 | ERROR_PARAMS( ZED( NoSeqTestedForAtomicEquiv ) ), | 1236 | |
210 | 1245 | ERROR_LOC( loc ) | 1237 | if ((TypeOps::is_subtype(type0, store::XS_FLOAT) || |
211 | 1246 | ); | 1238 | TypeOps::is_subtype(type0, store::XS_DOUBLE)) |
212 | 1247 | 1239 | && | |
213 | 1248 | if (consumeNext(lItem1, theChild1.getp(), planState)) | 1240 | (TypeOps::is_subtype(type1, store::XS_FLOAT) || |
214 | 1249 | count1 = 1; | 1241 | TypeOps::is_subtype(type1, store::XS_DOUBLE)) |
215 | 1250 | 1242 | && | |
216 | 1251 | if (count1 && consumeNext(tItem1, theChild1.getp(), planState)) | 1243 | lItem0->isNaN() && lItem1->isNaN()) |
217 | 1252 | throw XQUERY_EXCEPTION( | 1244 | { |
218 | 1253 | err::XPTY0004, | 1245 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, true), state); |
219 | 1254 | ERROR_PARAMS( ZED( NoSeqTestedForAtomicEquiv ) ), | 1246 | } |
220 | 1255 | ERROR_LOC( loc ) | 1247 | else |
221 | 1256 | ); | 1248 | { |
222 | 1257 | 1249 | try | |
223 | 1258 | if (count0 == 0 && count1 == 0) | 1250 | { |
224 | 1251 | are_equivalent = CompareIterator::valueEqual(loc, | ||
225 | 1252 | lItem0, | ||
226 | 1253 | lItem1, | ||
227 | 1254 | theTypeManager, | ||
228 | 1255 | theTimezone, | ||
229 | 1256 | theCollation); | ||
230 | 1257 | } | ||
231 | 1258 | catch (ZorbaException const& e) | ||
232 | 1259 | { | ||
233 | 1260 | if (e.diagnostic() == err::XPTY0004) | ||
234 | 1261 | are_equivalent = false; | ||
235 | 1262 | else | ||
236 | 1263 | throw; | ||
237 | 1264 | } | ||
238 | 1265 | |||
239 | 1266 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, are_equivalent), | ||
240 | 1267 | state); | ||
241 | 1268 | } | ||
242 | 1269 | } | ||
243 | 1270 | else | ||
244 | 1271 | { | ||
245 | 1272 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, false), state); | ||
246 | 1273 | } | ||
247 | 1274 | } | ||
248 | 1275 | else if (consumeNext(lItem1, theChild1.getp(), planState)) | ||
249 | 1276 | { | ||
250 | 1277 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, false), state); | ||
251 | 1278 | } | ||
252 | 1279 | else | ||
253 | 1259 | { | 1280 | { |
254 | 1260 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, true), state); | 1281 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, true), state); |
255 | 1261 | } | 1282 | } |
256 | 1262 | else if ((count0 == 0 && count1 == 1) || (count0 == 1 && count1 == 0)) | ||
257 | 1263 | { | ||
258 | 1264 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, false), state); | ||
259 | 1265 | } | ||
260 | 1266 | else | ||
261 | 1267 | { | ||
262 | 1268 | type0 = theTypeManager->create_value_type(lItem0.getp()); | ||
263 | 1269 | type1 = theTypeManager->create_value_type(lItem1.getp()); | ||
264 | 1270 | |||
265 | 1271 | if ((TypeOps::is_subtype(tm, *type0, *rtm.FLOAT_TYPE_ONE) || | ||
266 | 1272 | TypeOps::is_subtype(tm, *type0, *rtm.DOUBLE_TYPE_ONE)) | ||
267 | 1273 | && | ||
268 | 1274 | (TypeOps::is_subtype(tm, *type1, *rtm.FLOAT_TYPE_ONE) || | ||
269 | 1275 | TypeOps::is_subtype(tm, *type1, *rtm.DOUBLE_TYPE_ONE)) | ||
270 | 1276 | && | ||
271 | 1277 | lItem0->isNaN() && lItem1->isNaN()) | ||
272 | 1278 | { | ||
273 | 1279 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, true), state); | ||
274 | 1280 | } | ||
275 | 1281 | else | ||
276 | 1282 | { | ||
277 | 1283 | try | ||
278 | 1284 | { | ||
279 | 1285 | are_equivalent = CompareIterator::valueEqual(loc, | ||
280 | 1286 | lItem0, | ||
281 | 1287 | lItem1, | ||
282 | 1288 | theTypeManager, | ||
283 | 1289 | theTimezone, | ||
284 | 1290 | theCollation); | ||
285 | 1291 | } | ||
286 | 1292 | catch (ZorbaException const& e) | ||
287 | 1293 | { | ||
288 | 1294 | if (e.diagnostic() == err::XPTY0004) | ||
289 | 1295 | are_equivalent = false; | ||
290 | 1296 | else | ||
291 | 1297 | throw; | ||
292 | 1298 | } | ||
293 | 1299 | |||
294 | 1300 | STACK_PUSH(GENV_ITEMFACTORY->createBoolean(result, are_equivalent), | ||
295 | 1301 | state); | ||
296 | 1302 | } | ||
297 | 1303 | } | ||
298 | 1304 | 1283 | ||
299 | 1305 | STACK_END(state); | 1284 | STACK_END(state); |
300 | 1306 | } | 1285 | } |
301 | 1307 | 1286 | ||
302 | === modified file 'src/runtime/core/arithmetic_impl.cpp' | |||
303 | --- src/runtime/core/arithmetic_impl.cpp 2013-05-08 20:14:47 +0000 | |||
304 | +++ src/runtime/core/arithmetic_impl.cpp 2013-06-11 09:57:50 +0000 | |||
305 | @@ -167,16 +167,16 @@ | |||
306 | 167 | assert(n0->isAtomic()); | 167 | assert(n0->isAtomic()); |
307 | 168 | assert(n1->isAtomic()); | 168 | assert(n1->isAtomic()); |
308 | 169 | 169 | ||
311 | 170 | xqtref_t type0 = tm->create_value_type(n0); | 170 | store::SchemaTypeCode type0 = n0->getTypeCode(); |
312 | 171 | xqtref_t type1 = tm->create_value_type(n1); | 171 | store::SchemaTypeCode type1 = n1->getTypeCode(); |
313 | 172 | 172 | ||
317 | 173 | if (TypeOps::is_numeric(tm, *type0) && | 173 | if (TypeOps::is_numeric(type0) && |
318 | 174 | (TypeOps::is_subtype(tm, *type1, *rtm.YM_DURATION_TYPE_ONE) || | 174 | (TypeOps::is_subtype(type1, store::XS_YM_DURATION) || |
319 | 175 | TypeOps::is_subtype(tm, *type1, *rtm.DT_DURATION_TYPE_ONE))) | 175 | TypeOps::is_subtype(type1, store::XS_DT_DURATION))) |
320 | 176 | { | 176 | { |
321 | 177 | GenericCast::castToAtomic(n0, n0, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, aLoc); | 177 | GenericCast::castToAtomic(n0, n0, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, aLoc); |
322 | 178 | 178 | ||
324 | 179 | if (TypeOps::is_subtype(tm, *type1, *rtm.YM_DURATION_TYPE_ONE)) | 179 | if (TypeOps::is_subtype(type1, store::XS_YM_DURATION)) |
325 | 180 | { | 180 | { |
326 | 181 | return Operation::template | 181 | return Operation::template |
327 | 182 | compute<store::XS_DOUBLE, store::XS_YM_DURATION> | 182 | compute<store::XS_DOUBLE, store::XS_YM_DURATION> |
328 | @@ -189,44 +189,44 @@ | |||
329 | 189 | (result, dctx, tm, &aLoc, n0, n1); | 189 | (result, dctx, tm, &aLoc, n0, n1); |
330 | 190 | } | 190 | } |
331 | 191 | } | 191 | } |
334 | 192 | else if (TypeOps::is_subtype(tm, *type0, *rtm.DT_DURATION_TYPE_ONE) && | 192 | else if (TypeOps::is_subtype(type0, store::XS_DT_DURATION) && |
335 | 193 | TypeOps::is_subtype(tm, *type1, *rtm.TIME_TYPE_ONE)) | 193 | TypeOps::is_subtype(type1, store::XS_TIME)) |
336 | 194 | { | 194 | { |
337 | 195 | return Operation::template | 195 | return Operation::template |
338 | 196 | compute<store::XS_DURATION,store::XS_TIME> | 196 | compute<store::XS_DURATION,store::XS_TIME> |
339 | 197 | (result, dctx, tm, &aLoc, n0, n1); | 197 | (result, dctx, tm, &aLoc, n0, n1); |
340 | 198 | } | 198 | } |
342 | 199 | else if (TypeOps::is_subtype(tm, *type0, *rtm.YM_DURATION_TYPE_ONE)) | 199 | else if (TypeOps::is_subtype(type0, store::XS_YM_DURATION)) |
343 | 200 | { | 200 | { |
345 | 201 | if(TypeOps::is_numeric(tm, *type1)) | 201 | if (TypeOps::is_numeric(type1)) |
346 | 202 | { | 202 | { |
347 | 203 | GenericCast::castToAtomic(n1, n1, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, aLoc); | 203 | GenericCast::castToAtomic(n1, n1, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, aLoc); |
348 | 204 | return Operation::template | 204 | return Operation::template |
349 | 205 | compute<store::XS_YM_DURATION,store::XS_DOUBLE> | 205 | compute<store::XS_YM_DURATION,store::XS_DOUBLE> |
350 | 206 | (result, dctx, tm, &aLoc, n0, n1); | 206 | (result, dctx, tm, &aLoc, n0, n1); |
351 | 207 | } | 207 | } |
353 | 208 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DATETIME_TYPE_ONE)) | 208 | else if (TypeOps::is_subtype(type1, store::XS_DATETIME)) |
354 | 209 | { | 209 | { |
355 | 210 | return Operation::template | 210 | return Operation::template |
356 | 211 | compute<store::XS_DURATION,store::XS_DATETIME> | 211 | compute<store::XS_DURATION,store::XS_DATETIME> |
357 | 212 | (result, dctx, tm, &aLoc, n0, n1); | 212 | (result, dctx, tm, &aLoc, n0, n1); |
358 | 213 | } | 213 | } |
360 | 214 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DATE_TYPE_ONE)) | 214 | else if (TypeOps::is_subtype(type1, store::XS_DATE)) |
361 | 215 | { | 215 | { |
362 | 216 | return Operation::template | 216 | return Operation::template |
363 | 217 | compute<store::XS_DURATION,store::XS_DATE> | 217 | compute<store::XS_DURATION,store::XS_DATE> |
364 | 218 | (result, dctx, tm, &aLoc, n0, n1); | 218 | (result, dctx, tm, &aLoc, n0, n1); |
365 | 219 | } | 219 | } |
367 | 220 | else if (TypeOps::is_equal(tm, *type0, *type1)) | 220 | else if (type0 == type1) |
368 | 221 | { | 221 | { |
369 | 222 | return Operation::template | 222 | return Operation::template |
370 | 223 | computeSingleType<store::XS_YM_DURATION> | 223 | computeSingleType<store::XS_YM_DURATION> |
371 | 224 | (result, dctx, tm, &aLoc, n0, n1); | 224 | (result, dctx, tm, &aLoc, n0, n1); |
372 | 225 | } | 225 | } |
373 | 226 | } | 226 | } |
375 | 227 | else if (TypeOps::is_subtype(tm, *type0, *rtm.DT_DURATION_TYPE_ONE)) | 227 | else if (TypeOps::is_subtype(type0, store::XS_DT_DURATION)) |
376 | 228 | { | 228 | { |
378 | 229 | if(TypeOps::is_numeric(tm, *type1)) | 229 | if (TypeOps::is_numeric(type1)) |
379 | 230 | { | 230 | { |
380 | 231 | GenericCast::castToAtomic(n1, n1, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, aLoc); | 231 | GenericCast::castToAtomic(n1, n1, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, aLoc); |
381 | 232 | 232 | ||
382 | @@ -234,94 +234,96 @@ | |||
383 | 234 | compute<store::XS_DT_DURATION,store::XS_DOUBLE> | 234 | compute<store::XS_DT_DURATION,store::XS_DOUBLE> |
384 | 235 | (result, dctx, tm, &aLoc, n0, n1); | 235 | (result, dctx, tm, &aLoc, n0, n1); |
385 | 236 | } | 236 | } |
387 | 237 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DATETIME_TYPE_ONE)) | 237 | else if (TypeOps::is_subtype(type1, store::XS_DATETIME)) |
388 | 238 | { | 238 | { |
389 | 239 | return Operation::template | 239 | return Operation::template |
390 | 240 | compute<store::XS_DURATION,store::XS_DATETIME> | 240 | compute<store::XS_DURATION,store::XS_DATETIME> |
391 | 241 | (result, dctx, tm, &aLoc, n0, n1); | 241 | (result, dctx, tm, &aLoc, n0, n1); |
392 | 242 | } | 242 | } |
394 | 243 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DATE_TYPE_ONE)) | 243 | else if (TypeOps::is_subtype(type1, store::XS_DATE)) |
395 | 244 | { | 244 | { |
396 | 245 | return Operation::template | 245 | return Operation::template |
397 | 246 | compute<store::XS_DURATION,store::XS_DATE> | 246 | compute<store::XS_DURATION,store::XS_DATE> |
398 | 247 | (result, dctx, tm, &aLoc, n0, n1); | 247 | (result, dctx, tm, &aLoc, n0, n1); |
399 | 248 | } | 248 | } |
401 | 249 | else if (TypeOps::is_equal(tm, *type0, *type1)) | 249 | else if (type0 == type1) |
402 | 250 | { | 250 | { |
403 | 251 | return Operation::template | 251 | return Operation::template |
404 | 252 | computeSingleType<store::XS_DT_DURATION> | 252 | computeSingleType<store::XS_DT_DURATION> |
405 | 253 | (result, dctx, tm, &aLoc, n0, n1); | 253 | (result, dctx, tm, &aLoc, n0, n1); |
406 | 254 | } | 254 | } |
407 | 255 | } | 255 | } |
409 | 256 | else if(TypeOps::is_subtype(tm, *type0, *rtm.DATETIME_TYPE_ONE)) | 256 | else if (TypeOps::is_subtype(type0, store::XS_DATETIME)) |
410 | 257 | { | 257 | { |
412 | 258 | if(TypeOps::is_subtype(tm, *type1, *rtm.DATETIME_TYPE_ONE)) | 258 | if (TypeOps::is_subtype(type1, store::XS_DATETIME)) |
413 | 259 | { | 259 | { |
414 | 260 | return Operation::template | 260 | return Operation::template |
415 | 261 | compute<store::XS_DATETIME,store::XS_DATETIME> | 261 | compute<store::XS_DATETIME,store::XS_DATETIME> |
416 | 262 | (result, dctx, tm, &aLoc, n0, n1); | 262 | (result, dctx, tm, &aLoc, n0, n1); |
417 | 263 | } | 263 | } |
419 | 264 | else if (TypeOps::is_subtype(tm, *type1, *rtm.YM_DURATION_TYPE_ONE )) | 264 | else if (TypeOps::is_subtype(type1, store::XS_YM_DURATION)) |
420 | 265 | { | 265 | { |
421 | 266 | return Operation::template | 266 | return Operation::template |
422 | 267 | compute<store::XS_DATETIME,store::XS_DURATION> | 267 | compute<store::XS_DATETIME,store::XS_DURATION> |
423 | 268 | (result, dctx, tm, &aLoc, n0, n1); | 268 | (result, dctx, tm, &aLoc, n0, n1); |
424 | 269 | } | 269 | } |
426 | 270 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DT_DURATION_TYPE_ONE )) | 270 | else if (TypeOps::is_subtype(type1, store::XS_DT_DURATION)) |
427 | 271 | { | 271 | { |
428 | 272 | return Operation::template | 272 | return Operation::template |
429 | 273 | compute<store::XS_DATETIME,store::XS_DURATION> | 273 | compute<store::XS_DATETIME,store::XS_DURATION> |
430 | 274 | (result, dctx, tm, &aLoc, n0, n1); | 274 | (result, dctx, tm, &aLoc, n0, n1); |
431 | 275 | } | 275 | } |
432 | 276 | } | 276 | } |
434 | 277 | else if(TypeOps::is_subtype(tm, *type0, *rtm.DATE_TYPE_ONE)) | 277 | else if (TypeOps::is_subtype(type0, store::XS_DATE)) |
435 | 278 | { | 278 | { |
437 | 279 | if (TypeOps::is_subtype(tm, *type1, *rtm.DATE_TYPE_ONE)) | 279 | if (TypeOps::is_subtype(type1, store::XS_DATE)) |
438 | 280 | { | 280 | { |
439 | 281 | return Operation::template | 281 | return Operation::template |
440 | 282 | compute<store::XS_DATE,store::XS_DATE> | 282 | compute<store::XS_DATE,store::XS_DATE> |
441 | 283 | (result, dctx, tm, &aLoc, n0, n1); | 283 | (result, dctx, tm, &aLoc, n0, n1); |
442 | 284 | } | 284 | } |
444 | 285 | else if (TypeOps::is_subtype(tm, *type1, *rtm.YM_DURATION_TYPE_ONE)) | 285 | else if (TypeOps::is_subtype(type1, store::XS_YM_DURATION)) |
445 | 286 | { | 286 | { |
446 | 287 | return Operation::template | 287 | return Operation::template |
447 | 288 | compute<store::XS_DATE,store::XS_DURATION> | 288 | compute<store::XS_DATE,store::XS_DURATION> |
448 | 289 | (result, dctx, tm, &aLoc, n0, n1); | 289 | (result, dctx, tm, &aLoc, n0, n1); |
449 | 290 | } | 290 | } |
451 | 291 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DT_DURATION_TYPE_ONE)) | 291 | else if (TypeOps::is_subtype(type1, store::XS_DT_DURATION)) |
452 | 292 | { | 292 | { |
453 | 293 | return Operation::template | 293 | return Operation::template |
454 | 294 | compute<store::XS_DATE,store::XS_DURATION> | 294 | compute<store::XS_DATE,store::XS_DURATION> |
455 | 295 | (result, dctx, tm, &aLoc, n0, n1); | 295 | (result, dctx, tm, &aLoc, n0, n1); |
456 | 296 | } | 296 | } |
457 | 297 | } | 297 | } |
459 | 298 | else if(TypeOps::is_subtype(tm, *type0, *rtm.TIME_TYPE_ONE)) | 298 | else if (TypeOps::is_subtype(type0, store::XS_TIME)) |
460 | 299 | { | 299 | { |
462 | 300 | if(TypeOps::is_subtype(tm, *type1, *rtm.TIME_TYPE_ONE)) | 300 | if (TypeOps::is_subtype(type1, store::XS_TIME)) |
463 | 301 | { | 301 | { |
464 | 302 | return Operation::template | 302 | return Operation::template |
465 | 303 | compute<store::XS_TIME,store::XS_TIME> | 303 | compute<store::XS_TIME,store::XS_TIME> |
466 | 304 | (result, dctx, tm, &aLoc, n0, n1); | 304 | (result, dctx, tm, &aLoc, n0, n1); |
467 | 305 | } | 305 | } |
469 | 306 | else if (TypeOps::is_subtype(tm, *type1, *rtm.DT_DURATION_TYPE_ONE)) | 306 | else if (TypeOps::is_subtype(type1, store::XS_DT_DURATION)) |
470 | 307 | { | 307 | { |
471 | 308 | return Operation::template | 308 | return Operation::template |
472 | 309 | compute<store::XS_TIME,store::XS_DURATION> | 309 | compute<store::XS_TIME,store::XS_DURATION> |
473 | 310 | (result, dctx, tm, &aLoc, n0, n1); | 310 | (result, dctx, tm, &aLoc, n0, n1); |
474 | 311 | } | 311 | } |
475 | 312 | } | 312 | } |
480 | 313 | else if ((TypeOps::is_numeric(tm, *type0) || | 313 | else if ((TypeOps::is_numeric(type0) || type0 == store::XS_UNTYPED_ATOMIC) && |
481 | 314 | TypeOps::is_subtype(tm, *type0, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) && | 314 | (TypeOps::is_numeric(type1) || type1 == store::XS_UNTYPED_ATOMIC)) |
478 | 315 | ( TypeOps::is_numeric(tm, *type1) || | ||
479 | 316 | TypeOps::is_subtype(tm, *type1, *rtm.UNTYPED_ATOMIC_TYPE_ONE))) | ||
482 | 317 | { | 315 | { |
483 | 318 | return NumArithIterator<Operation>:: | 316 | return NumArithIterator<Operation>:: |
484 | 319 | computeAtomic(result, dctx, tm, aLoc, n0, type0, n1, type1); | 317 | computeAtomic(result, dctx, tm, aLoc, n0, type0, n1, type1); |
485 | 320 | } | 318 | } |
490 | 321 | 319 | ||
491 | 322 | 320 | { | |
492 | 323 | RAISE_ERROR(err::XPTY0004, aLoc, | 321 | xqtref_t type0 = tm->create_value_type(n0); |
493 | 324 | ERROR_PARAMS(ZED(ArithOpNotDefinedBetween_23), *type0, *type1)); | 322 | xqtref_t type1 = tm->create_value_type(n1); |
494 | 323 | |||
495 | 324 | RAISE_ERROR(err::XPTY0004, aLoc, | ||
496 | 325 | ERROR_PARAMS(ZED(ArithOpNotDefinedBetween_23), *type0, *type1)); | ||
497 | 326 | } | ||
498 | 325 | 327 | ||
499 | 326 | return false; // suppresses wanring | 328 | return false; // suppresses wanring |
500 | 327 | } | 329 | } |
501 | 328 | 330 | ||
502 | === modified file 'src/runtime/indexing/index_ddl.cpp' | |||
503 | --- src/runtime/indexing/index_ddl.cpp 2013-05-02 18:34:27 +0000 | |||
504 | +++ src/runtime/indexing/index_ddl.cpp 2013-06-11 09:57:50 +0000 | |||
505 | @@ -70,7 +70,8 @@ | |||
506 | 70 | 70 | ||
507 | 71 | 71 | ||
508 | 72 | /******************************************************************************* | 72 | /******************************************************************************* |
510 | 73 | 73 | This function is called from the probe function to chaeck that the type of | |
511 | 74 | the probing key is consistent with the index declaration. | ||
512 | 74 | ********************************************************************************/ | 75 | ********************************************************************************/ |
513 | 75 | static void checkKeyType( | 76 | static void checkKeyType( |
514 | 76 | const QueryLoc& loc, | 77 | const QueryLoc& loc, |
515 | @@ -138,6 +139,7 @@ | |||
516 | 138 | { | 139 | { |
517 | 139 | GENV_STORE.getItemFactory()-> | 140 | GENV_STORE.getItemFactory()-> |
518 | 140 | createDouble(searchKey, xs_float(searchKey->getDecimalValue())); | 141 | createDouble(searchKey, xs_float(searchKey->getDecimalValue())); |
519 | 142 | |||
520 | 141 | return; | 143 | return; |
521 | 142 | } | 144 | } |
522 | 143 | 145 | ||
523 | @@ -1217,7 +1219,6 @@ | |||
524 | 1217 | PlanState& planState) const | 1219 | PlanState& planState) const |
525 | 1218 | { | 1220 | { |
526 | 1219 | TypeManager* tm = theSctx->get_typemanager(); | 1221 | TypeManager* tm = theSctx->get_typemanager(); |
527 | 1220 | RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
528 | 1221 | store::IndexCondition_t cond; | 1222 | store::IndexCondition_t cond; |
529 | 1222 | csize numChildren = theChildren.size(); | 1223 | csize numChildren = theChildren.size(); |
530 | 1223 | csize numNonKeyParams = (theSkip ? 2 : 1); | 1224 | csize numNonKeyParams = (theSkip ? 2 : 1); |
531 | @@ -1262,37 +1263,37 @@ | |||
532 | 1262 | if (state->theIndexDecl->isGeneral() && | 1263 | if (state->theIndexDecl->isGeneral() && |
533 | 1263 | (state->theIndexDecl->getKeyTypes())[keyNo] == NULL) | 1264 | (state->theIndexDecl->getKeyTypes())[keyNo] == NULL) |
534 | 1264 | { | 1265 | { |
537 | 1265 | xqtref_t leftType; | 1266 | store::SchemaTypeCode leftType; |
538 | 1266 | xqtref_t rightType; | 1267 | store::SchemaTypeCode rightType; |
539 | 1267 | 1268 | ||
540 | 1268 | if (tempLeft != NULL) | 1269 | if (tempLeft != NULL) |
541 | 1269 | { | 1270 | { |
543 | 1270 | leftType = tm->create_value_type(tempLeft); | 1271 | leftType = tempLeft->getTypeCode(); |
544 | 1271 | 1272 | ||
546 | 1272 | if (TypeOps::is_equal(tm, *leftType, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 1273 | if (leftType == store::XS_UNTYPED_ATOMIC) |
547 | 1273 | { | 1274 | { |
548 | 1274 | zstring str = tempLeft->getStringValue(); | 1275 | zstring str = tempLeft->getStringValue(); |
549 | 1275 | GENV_ITEMFACTORY->createString(tempLeft, str); | 1276 | GENV_ITEMFACTORY->createString(tempLeft, str); |
551 | 1276 | leftType = rtm.STRING_TYPE_ONE; | 1277 | leftType = store::XS_STRING; |
552 | 1277 | } | 1278 | } |
553 | 1278 | } | 1279 | } |
554 | 1279 | 1280 | ||
555 | 1280 | if (tempRight != NULL) | 1281 | if (tempRight != NULL) |
556 | 1281 | { | 1282 | { |
558 | 1282 | rightType = tm->create_value_type(tempRight); | 1283 | rightType = tempRight->getTypeCode(); |
559 | 1283 | 1284 | ||
561 | 1284 | if (TypeOps::is_equal(tm, *rightType, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 1285 | if (rightType == store::XS_UNTYPED_ATOMIC) |
562 | 1285 | { | 1286 | { |
563 | 1286 | zstring str = tempRight->getStringValue(); | 1287 | zstring str = tempRight->getStringValue(); |
564 | 1287 | GENV_ITEMFACTORY->createString(tempRight, str); | 1288 | GENV_ITEMFACTORY->createString(tempRight, str); |
566 | 1288 | rightType = rtm.STRING_TYPE_ONE; | 1289 | rightType = store::XS_STRING; |
567 | 1289 | } | 1290 | } |
568 | 1290 | } | 1291 | } |
569 | 1291 | 1292 | ||
571 | 1292 | if (leftType != NULL && rightType != NULL) | 1293 | if (tempLeft != NULL && tempRight != NULL) |
572 | 1293 | { | 1294 | { |
575 | 1294 | if (!TypeOps::is_subtype(tm, *leftType, *rightType) && | 1295 | if (!TypeOps::is_subtype(leftType, rightType) && |
576 | 1295 | !TypeOps::is_subtype(tm, *rightType, *leftType)) | 1296 | !TypeOps::is_subtype(rightType, leftType)) |
577 | 1296 | { | 1297 | { |
578 | 1297 | RAISE_ERROR(zerr::ZDDY0034_INDEX_RANGE_VALUE_PROBE_BAD_KEY_TYPES, loc, | 1298 | RAISE_ERROR(zerr::ZDDY0034_INDEX_RANGE_VALUE_PROBE_BAD_KEY_TYPES, loc, |
579 | 1298 | ERROR_PARAMS(state->theIndexDecl->getName()->getStringValue())); | 1299 | ERROR_PARAMS(state->theIndexDecl->getName()->getStringValue())); |
580 | 1299 | 1300 | ||
581 | === modified file 'src/runtime/maths/maths_impl.cpp' | |||
582 | --- src/runtime/maths/maths_impl.cpp 2013-02-07 17:24:36 +0000 | |||
583 | +++ src/runtime/maths/maths_impl.cpp 2013-06-11 09:57:50 +0000 | |||
584 | @@ -30,6 +30,8 @@ | |||
585 | 30 | #include "store/api/item.h" | 30 | #include "store/api/item.h" |
586 | 31 | 31 | ||
587 | 32 | #include "diagnostics/xquery_diagnostics.h" | 32 | #include "diagnostics/xquery_diagnostics.h" |
588 | 33 | #include "diagnostics/util_macros.h" | ||
589 | 34 | |||
590 | 33 | #include "zorbatypes/numconversions.h" | 35 | #include "zorbatypes/numconversions.h" |
591 | 34 | 36 | ||
592 | 35 | namespace zorba { | 37 | namespace zorba { |
593 | @@ -345,44 +347,27 @@ | |||
594 | 345 | { | 347 | { |
595 | 346 | if (consumeNext(n1, this->theChild1.getp(), planState)) | 348 | if (consumeNext(n1, this->theChild1.getp(), planState)) |
596 | 347 | { | 349 | { |
597 | 350 | assert(n1->isAtomic()); | ||
598 | 351 | |||
599 | 348 | { | 352 | { |
600 | 349 | xqtref_t type; | ||
601 | 350 | |||
602 | 351 | const TypeManager* tm = theSctx->get_typemanager(); | 353 | const TypeManager* tm = theSctx->get_typemanager(); |
603 | 352 | |||
604 | 353 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | 354 | const RootTypeManager& rtm = GENV_TYPESYSTEM; |
605 | 355 | |||
606 | 354 | xs_double doub1 = n0->getDoubleValue(); | 356 | xs_double doub1 = n0->getDoubleValue(); |
616 | 355 | //xs_double doub2 = n1->getDoubleValue(); | 357 | |
617 | 356 | 358 | store::SchemaTypeCode type1 = n1->getTypeCode(); | |
618 | 357 | //GENV_ITEMFACTORY->createDouble(result, doub1.pow(doub2)); | 359 | |
619 | 358 | 360 | if (type1 == store::XS_UNTYPED_ATOMIC) | |
611 | 359 | assert(n1->isAtomic()); | ||
612 | 360 | |||
613 | 361 | type = tm->create_value_type(n1); | ||
614 | 362 | |||
615 | 363 | if (TypeOps::is_subtype(tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | ||
620 | 364 | { | 361 | { |
621 | 365 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 362 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); |
642 | 366 | type = tm->create_value_type(result); | 363 | |
643 | 367 | } | 364 | GENV_ITEMFACTORY->createDouble(result, doub1.pow(n1->getDoubleValue())); |
644 | 368 | 365 | } | |
645 | 369 | if (TypeOps::is_subtype(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 366 | else if (type1 == store::XS_DOUBLE || type1 == store::XS_FLOAT) |
646 | 370 | { | 367 | { |
647 | 371 | GENV_ITEMFACTORY->createDouble(result, doub1.pow(n1->getDoubleValue())); | 368 | GENV_ITEMFACTORY->createDouble(result, doub1.pow(n1->getDoubleValue())); |
648 | 372 | } | 369 | } |
649 | 373 | else if (TypeOps::is_subtype(tm, *type, *rtm.FLOAT_TYPE_ONE)) | 370 | else if (type1 == store::XS_INTEGER) |
630 | 374 | { | ||
631 | 375 | store::Item_t n1_double; | ||
632 | 376 | GenericCast::castToAtomic(n1_double, | ||
633 | 377 | n1, | ||
634 | 378 | rtm.DOUBLE_TYPE_ONE.getp(), | ||
635 | 379 | tm, | ||
636 | 380 | NULL, | ||
637 | 381 | loc); | ||
638 | 382 | |||
639 | 383 | GENV_ITEMFACTORY->createDouble(result, doub1.pow(n1_double->getDoubleValue())); | ||
640 | 384 | } | ||
641 | 385 | else if (TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE)) | ||
650 | 386 | { | 371 | { |
651 | 387 | xs_integer n1_integer = n1->getIntegerValue(); | 372 | xs_integer n1_integer = n1->getIntegerValue(); |
652 | 388 | try | 373 | try |
653 | @@ -390,16 +375,13 @@ | |||
654 | 390 | xs_int const n1_int = to_xs_int(n1_integer); | 375 | xs_int const n1_int = to_xs_int(n1_integer); |
655 | 391 | GENV_ITEMFACTORY->createDouble(result, doub1.pow(n1_int)); | 376 | GENV_ITEMFACTORY->createDouble(result, doub1.pow(n1_int)); |
656 | 392 | } | 377 | } |
658 | 393 | catch ( std::range_error const& ) | 378 | catch (std::range_error const&) |
659 | 394 | { | 379 | { |
665 | 395 | throw XQUERY_EXCEPTION( | 380 | RAISE_ERROR(err::XPTY0004, loc, |
666 | 396 | err::XPTY0004, | 381 | ERROR_PARAMS(ZED(NoCastToCInt_2), n1_integer)); |
662 | 397 | ERROR_PARAMS( ZED( NoCastToCInt_2 ), n1_integer ), | ||
663 | 398 | ERROR_LOC( loc ) | ||
664 | 399 | ); | ||
667 | 400 | } | 382 | } |
668 | 401 | } | 383 | } |
670 | 402 | else if (TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE)) | 384 | else if (type1 == store::XS_DECIMAL) |
671 | 403 | { | 385 | { |
672 | 404 | store::Item_t n1_double; | 386 | store::Item_t n1_double; |
673 | 405 | GenericCast::castToAtomic(n1_double, | 387 | GenericCast::castToAtomic(n1_double, |
674 | @@ -413,19 +395,13 @@ | |||
675 | 413 | } | 395 | } |
676 | 414 | else | 396 | else |
677 | 415 | { | 397 | { |
683 | 416 | throw XQUERY_EXCEPTION( | 398 | xqtref_t type = tm->create_value_type(n1); |
684 | 417 | err::XPTY0004, | 399 | |
685 | 418 | ERROR_PARAMS( ZED( BadTypeFor_23 ), type, "math:pow" ), | 400 | RAISE_ERROR(err::XPTY0004, loc, |
686 | 419 | ERROR_LOC( loc ) | 401 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "math:pow")); |
682 | 420 | ); | ||
687 | 421 | } | 402 | } |
688 | 422 | } | 403 | } |
689 | 423 | 404 | ||
690 | 424 | if (consumeNext(n0, this->theChild0.getp(), planState) || | ||
691 | 425 | consumeNext(n1, this->theChild1.getp(), planState)) | ||
692 | 426 | throw XQUERY_EXCEPTION( | ||
693 | 427 | err::XPTY0004, ERROR_PARAMS( ZED( NoSeqForFnOp_2 ), "math:pow" ) | ||
694 | 428 | ); | ||
695 | 429 | STACK_PUSH(true, state); | 405 | STACK_PUSH(true, state); |
696 | 430 | } | 406 | } |
697 | 431 | } | 407 | } |
698 | 432 | 408 | ||
699 | === modified file 'src/runtime/numerics/NumericsImpl.cpp' | |||
700 | --- src/runtime/numerics/NumericsImpl.cpp 2013-05-05 03:16:33 +0000 | |||
701 | +++ src/runtime/numerics/NumericsImpl.cpp 2013-06-11 09:57:50 +0000 | |||
702 | @@ -687,8 +687,8 @@ | |||
703 | 687 | assert(n0->isAtomic()); | 687 | assert(n0->isAtomic()); |
704 | 688 | assert(n1->isAtomic()); | 688 | assert(n1->isAtomic()); |
705 | 689 | 689 | ||
708 | 690 | xqtref_t type0 = tm->create_value_type(n0); | 690 | store::SchemaTypeCode type0 = n0->getTypeCode(); |
709 | 691 | xqtref_t type1 = tm->create_value_type(n1); | 691 | store::SchemaTypeCode type1 = n1->getTypeCode(); |
710 | 692 | 692 | ||
711 | 693 | return computeAtomic(result, dctx, tm, aLoc, n0, type0, n1, type1); | 693 | return computeAtomic(result, dctx, tm, aLoc, n0, type0, n1, type1); |
712 | 694 | } | 694 | } |
713 | @@ -701,9 +701,9 @@ | |||
714 | 701 | const TypeManager* tm, | 701 | const TypeManager* tm, |
715 | 702 | const QueryLoc& aLoc, | 702 | const QueryLoc& aLoc, |
716 | 703 | store::Item_t& item0, | 703 | store::Item_t& item0, |
718 | 704 | xqtref_t type0, | 704 | store::SchemaTypeCode type0, |
719 | 705 | store::Item_t& item1, | 705 | store::Item_t& item1, |
721 | 706 | xqtref_t type1) | 706 | store::SchemaTypeCode type1) |
722 | 707 | { | 707 | { |
723 | 708 | bool res; | 708 | bool res; |
724 | 709 | store::Item_t n0; | 709 | store::Item_t n0; |
725 | @@ -711,14 +711,14 @@ | |||
726 | 711 | 711 | ||
727 | 712 | bool isDivision = Operation::getOperationKind() == ArithmeticConsts::DIVISION; | 712 | bool isDivision = Operation::getOperationKind() == ArithmeticConsts::DIVISION; |
728 | 713 | 713 | ||
730 | 714 | xqtref_t resultType = TypeOps::arithmetic_type(tm, *type0, *type1, isDivision); | 714 | store::SchemaTypeCode resultType = TypeOps::arithmetic_type(type0, type1, isDivision); |
731 | 715 | 715 | ||
733 | 716 | switch (TypeOps::get_atomic_type_code(*resultType)) | 716 | switch (resultType) |
734 | 717 | { | 717 | { |
735 | 718 | case store::XS_DOUBLE: | 718 | case store::XS_DOUBLE: |
736 | 719 | { | 719 | { |
739 | 720 | GenericCast::castToAtomic(n0, item0, &*resultType, tm, NULL, aLoc); | 720 | GenericCast::castToBuiltinAtomic(n0, item0, resultType, NULL, aLoc); |
740 | 721 | GenericCast::castToAtomic(n1, item1, &*resultType, tm, NULL, aLoc); | 721 | GenericCast::castToBuiltinAtomic(n1, item1, resultType, NULL, aLoc); |
741 | 722 | 722 | ||
742 | 723 | res = Operation::template | 723 | res = Operation::template |
743 | 724 | computeSingleType<store::XS_DOUBLE> | 724 | computeSingleType<store::XS_DOUBLE> |
744 | @@ -727,8 +727,8 @@ | |||
745 | 727 | } | 727 | } |
746 | 728 | case store::XS_FLOAT: | 728 | case store::XS_FLOAT: |
747 | 729 | { | 729 | { |
750 | 730 | GenericCast::castToAtomic(n0, item0, &*resultType, tm, NULL, aLoc); | 730 | GenericCast::castToBuiltinAtomic(n0, item0, resultType, NULL, aLoc); |
751 | 731 | GenericCast::castToAtomic(n1, item1, &*resultType, tm, NULL, aLoc); | 731 | GenericCast::castToBuiltinAtomic(n1, item1, resultType, NULL, aLoc); |
752 | 732 | 732 | ||
753 | 733 | res = Operation::template | 733 | res = Operation::template |
754 | 734 | computeSingleType<store::XS_FLOAT> | 734 | computeSingleType<store::XS_FLOAT> |
755 | @@ -737,8 +737,8 @@ | |||
756 | 737 | } | 737 | } |
757 | 738 | case store::XS_DECIMAL: | 738 | case store::XS_DECIMAL: |
758 | 739 | { | 739 | { |
761 | 740 | GenericCast::castToAtomic(n0, item0, &*resultType, tm, NULL, aLoc); | 740 | GenericCast::castToBuiltinAtomic(n0, item0, resultType, NULL, aLoc); |
762 | 741 | GenericCast::castToAtomic(n1, item1, &*resultType, tm, NULL, aLoc); | 741 | GenericCast::castToBuiltinAtomic(n1, item1, resultType, NULL, aLoc); |
763 | 742 | 742 | ||
764 | 743 | res = Operation::template | 743 | res = Operation::template |
765 | 744 | computeSingleType<store::XS_DECIMAL> | 744 | computeSingleType<store::XS_DECIMAL> |
766 | @@ -747,8 +747,8 @@ | |||
767 | 747 | } | 747 | } |
768 | 748 | case store::XS_INTEGER: | 748 | case store::XS_INTEGER: |
769 | 749 | { | 749 | { |
772 | 750 | GenericCast::castToAtomic(n0, item0, &*resultType, tm, NULL, aLoc); | 750 | GenericCast::castToBuiltinAtomic(n0, item0, resultType, NULL, aLoc); |
773 | 751 | GenericCast::castToAtomic(n1, item1, &*resultType, tm, NULL, aLoc); | 751 | GenericCast::castToBuiltinAtomic(n1, item1, resultType, NULL, aLoc); |
774 | 752 | 752 | ||
775 | 753 | res = Operation::template | 753 | res = Operation::template |
776 | 754 | computeSingleType<store::XS_INTEGER> | 754 | computeSingleType<store::XS_INTEGER> |
777 | @@ -757,11 +757,13 @@ | |||
778 | 757 | } | 757 | } |
779 | 758 | default: | 758 | default: |
780 | 759 | { | 759 | { |
786 | 760 | throw XQUERY_EXCEPTION( | 760 | xqtref_t type0 = tm->create_value_type(item0); |
787 | 761 | err::XPTY0004, | 761 | xqtref_t type1 = tm->create_value_type(item1); |
788 | 762 | ERROR_PARAMS( ZED( ArithOpNotDefinedBetween_23 ), *type0, *type1 ), | 762 | |
789 | 763 | ERROR_LOC( aLoc ) | 763 | RAISE_ERROR(err::XPTY0004, aLoc, |
790 | 764 | ); | 764 | ERROR_PARAMS(ZED(ArithOpNotDefinedBetween_23), |
791 | 765 | type0->toSchemaString(), | ||
792 | 766 | type1->toSchemaString())); | ||
793 | 765 | } | 767 | } |
794 | 766 | } | 768 | } |
795 | 767 | 769 | ||
796 | @@ -896,9 +898,8 @@ | |||
797 | 896 | bool OpNumericUnaryIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 898 | bool OpNumericUnaryIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
798 | 897 | { | 899 | { |
799 | 898 | store::Item_t item; | 900 | store::Item_t item; |
801 | 899 | xqtref_t type; | 901 | store::SchemaTypeCode type; |
802 | 900 | 902 | ||
803 | 901 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
804 | 902 | const TypeManager* tm = theSctx->get_typemanager(); | 903 | const TypeManager* tm = theSctx->get_typemanager(); |
805 | 903 | 904 | ||
806 | 904 | PlanIteratorState* state; | 905 | PlanIteratorState* state; |
807 | @@ -908,35 +909,35 @@ | |||
808 | 908 | { | 909 | { |
809 | 909 | assert(item->isAtomic()); | 910 | assert(item->isAtomic()); |
810 | 910 | 911 | ||
812 | 911 | type = tm->create_value_type(item); | 912 | type = item->getTypeCode(); |
813 | 912 | 913 | ||
815 | 913 | if (TypeOps::is_subtype(tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE ) ) | 914 | if (type == store::XS_UNTYPED_ATOMIC) |
816 | 914 | { | 915 | { |
819 | 915 | GenericCast::castToAtomic(item, item, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 916 | GenericCast::castToBuiltinAtomic(item, item, store::XS_DOUBLE, NULL, loc); |
820 | 916 | type = rtm.DOUBLE_TYPE_ONE; | 917 | type = store::XS_DOUBLE; |
821 | 917 | } | 918 | } |
822 | 918 | 919 | ||
823 | 919 | // TODO Optimizations (e.g. if item has already the correct type and value, | 920 | // TODO Optimizations (e.g. if item has already the correct type and value, |
824 | 920 | // it does not have to be created newly) | 921 | // it does not have to be created newly) |
826 | 921 | if (TypeOps::is_subtype(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 922 | if (TypeOps::is_subtype(type, store::XS_DOUBLE)) |
827 | 922 | { | 923 | { |
828 | 923 | GENV_ITEMFACTORY-> | 924 | GENV_ITEMFACTORY-> |
829 | 924 | createDouble(result, | 925 | createDouble(result, |
830 | 925 | (thePlus ? item->getDoubleValue() : -item->getDoubleValue())); | 926 | (thePlus ? item->getDoubleValue() : -item->getDoubleValue())); |
831 | 926 | } | 927 | } |
833 | 927 | else if ( TypeOps::is_subtype(tm, *type, *rtm.FLOAT_TYPE_ONE ) ) | 928 | else if (TypeOps::is_subtype(type, store::XS_FLOAT)) |
834 | 928 | { | 929 | { |
835 | 929 | GENV_ITEMFACTORY-> | 930 | GENV_ITEMFACTORY-> |
836 | 930 | createFloat(result, | 931 | createFloat(result, |
837 | 931 | (thePlus ? item->getFloatValue() : -item->getFloatValue())); | 932 | (thePlus ? item->getFloatValue() : -item->getFloatValue())); |
838 | 932 | } | 933 | } |
840 | 933 | else if ( TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE ) ) | 934 | else if (TypeOps::is_subtype(type, store::XS_INTEGER)) |
841 | 934 | { | 935 | { |
842 | 935 | GENV_ITEMFACTORY-> | 936 | GENV_ITEMFACTORY-> |
843 | 936 | createInteger(result, | 937 | createInteger(result, |
844 | 937 | (thePlus ? item->getIntegerValue() : -item->getIntegerValue())); | 938 | (thePlus ? item->getIntegerValue() : -item->getIntegerValue())); |
845 | 938 | } | 939 | } |
847 | 939 | else if ( TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE ) ) | 940 | else if (TypeOps::is_subtype(type, store::XS_DECIMAL)) |
848 | 940 | { | 941 | { |
849 | 941 | GENV_ITEMFACTORY-> | 942 | GENV_ITEMFACTORY-> |
850 | 942 | createDecimal(result, | 943 | createDecimal(result, |
851 | @@ -944,8 +945,9 @@ | |||
852 | 944 | } | 945 | } |
853 | 945 | else | 946 | else |
854 | 946 | { | 947 | { |
855 | 948 | xqtref_t type = tm->create_value_type(item); | ||
856 | 947 | RAISE_ERROR(err::XPTY0004, loc, | 949 | RAISE_ERROR(err::XPTY0004, loc, |
858 | 948 | ERROR_PARAMS(ZED(BadTypeFor_23), type, ZED(UnaryArithOp))); | 950 | ERROR_PARAMS(ZED(BadTypeFor_23), type->toSchemaString(), ZED(UnaryArithOp))); |
859 | 949 | } | 951 | } |
860 | 950 | 952 | ||
861 | 951 | STACK_PUSH(true, state); | 953 | STACK_PUSH(true, state); |
862 | @@ -985,7 +987,7 @@ | |||
863 | 985 | PlanIteratorState* state; | 987 | PlanIteratorState* state; |
864 | 986 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 988 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
865 | 987 | 989 | ||
867 | 988 | if (consumeNext(item, theChild.getp(), planState )) | 990 | if (consumeNext(item, theChild.getp(), planState)) |
868 | 989 | { | 991 | { |
869 | 990 | assert(item->isAtomic()); | 992 | assert(item->isAtomic()); |
870 | 991 | 993 | ||
871 | 992 | 994 | ||
872 | === modified file 'src/runtime/numerics/NumericsImpl.h' | |||
873 | --- src/runtime/numerics/NumericsImpl.h 2013-02-07 17:24:36 +0000 | |||
874 | +++ src/runtime/numerics/NumericsImpl.h 2013-06-11 09:57:50 +0000 | |||
875 | @@ -61,9 +61,9 @@ | |||
876 | 61 | const TypeManager* tm, | 61 | const TypeManager* tm, |
877 | 62 | const QueryLoc&, | 62 | const QueryLoc&, |
878 | 63 | store::Item_t& item0, | 63 | store::Item_t& item0, |
880 | 64 | xqtref_t type0, | 64 | store::SchemaTypeCode type0, |
881 | 65 | store::Item_t& item1, | 65 | store::Item_t& item1, |
883 | 66 | xqtref_t type1); | 66 | store::SchemaTypeCode type1); |
884 | 67 | 67 | ||
885 | 68 | public: | 68 | public: |
886 | 69 | NumArithIterator(static_context* sctx, const QueryLoc&, PlanIter_t&, PlanIter_t&); | 69 | NumArithIterator(static_context* sctx, const QueryLoc&, PlanIter_t&, PlanIter_t&); |
887 | 70 | 70 | ||
888 | === modified file 'src/runtime/numerics/numerics_impl.cpp' | |||
889 | --- src/runtime/numerics/numerics_impl.cpp 2013-05-02 18:34:27 +0000 | |||
890 | +++ src/runtime/numerics/numerics_impl.cpp 2013-06-11 09:57:50 +0000 | |||
891 | @@ -52,12 +52,9 @@ | |||
892 | 52 | AbsIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 52 | AbsIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
893 | 53 | { | 53 | { |
894 | 54 | store::Item_t item; | 54 | store::Item_t item; |
897 | 55 | xqtref_t type; | 55 | store::SchemaTypeCode type; |
896 | 56 | |||
898 | 57 | const TypeManager* tm = theSctx->get_typemanager(); | 56 | const TypeManager* tm = theSctx->get_typemanager(); |
899 | 58 | 57 | ||
900 | 59 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
901 | 60 | |||
902 | 61 | PlanIteratorState* state; | 58 | PlanIteratorState* state; |
903 | 62 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 59 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
904 | 63 | 60 | ||
905 | @@ -65,31 +62,31 @@ | |||
906 | 65 | { | 62 | { |
907 | 66 | assert(result->isAtomic()); | 63 | assert(result->isAtomic()); |
908 | 67 | 64 | ||
910 | 68 | type = tm->create_value_type(result); | 65 | type = result->getTypeCode(); |
911 | 69 | 66 | ||
913 | 70 | if (TypeOps::is_subtype(tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 67 | if (type == store::XS_UNTYPED_ATOMIC) |
914 | 71 | { | 68 | { |
917 | 72 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 69 | GenericCast::castToBuiltinAtomic(result, result, store::XS_DOUBLE, NULL, loc); |
918 | 73 | type = tm->create_value_type(result); | 70 | type = store::XS_DOUBLE; |
919 | 74 | } | 71 | } |
920 | 75 | 72 | ||
922 | 76 | if (TypeOps::is_subtype(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 73 | if (TypeOps::is_subtype(type, store::XS_DOUBLE)) |
923 | 77 | { | 74 | { |
924 | 78 | if (result->getDoubleValue().isPos() || result->getDoubleValue().isPosZero()) | 75 | if (result->getDoubleValue().isPos() || result->getDoubleValue().isPosZero()) |
925 | 79 | { | 76 | { |
928 | 80 | if ( !TypeOps::is_equal(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 77 | if (type != store::XS_DOUBLE) |
929 | 81 | GENV_ITEMFACTORY->createDouble (result, result->getDoubleValue()); | 78 | GENV_ITEMFACTORY->createDouble(result, result->getDoubleValue()); |
930 | 82 | } | 79 | } |
931 | 83 | else | 80 | else |
932 | 84 | { | 81 | { |
933 | 85 | GENV_ITEMFACTORY->createDouble(result, -result->getDoubleValue()); | 82 | GENV_ITEMFACTORY->createDouble(result, -result->getDoubleValue()); |
934 | 86 | } | 83 | } |
935 | 87 | } | 84 | } |
937 | 88 | else if (TypeOps::is_subtype(tm, *type, *rtm.FLOAT_TYPE_ONE)) | 85 | else if (TypeOps::is_subtype(type, store::XS_FLOAT)) |
938 | 89 | { | 86 | { |
939 | 90 | if ( result->getFloatValue().isPos() || result->getFloatValue().isPosZero()) | 87 | if ( result->getFloatValue().isPos() || result->getFloatValue().isPosZero()) |
940 | 91 | { | 88 | { |
942 | 92 | if ( !TypeOps::is_equal(tm, *type, *rtm.FLOAT_TYPE_ONE)) | 89 | if (type != store::XS_FLOAT) |
943 | 93 | GENV_ITEMFACTORY->createFloat (result, result->getFloatValue()); | 90 | GENV_ITEMFACTORY->createFloat (result, result->getFloatValue()); |
944 | 94 | } | 91 | } |
945 | 95 | else | 92 | else |
946 | @@ -97,11 +94,11 @@ | |||
947 | 97 | GENV_ITEMFACTORY->createFloat(result, -result->getFloatValue()); | 94 | GENV_ITEMFACTORY->createFloat(result, -result->getFloatValue()); |
948 | 98 | } | 95 | } |
949 | 99 | } | 96 | } |
951 | 100 | else if (TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE)) | 97 | else if (TypeOps::is_subtype(type, store::XS_INTEGER)) |
952 | 101 | { | 98 | { |
953 | 102 | if (result->getIntegerValue().sign() >= 0) | 99 | if (result->getIntegerValue().sign() >= 0) |
954 | 103 | { | 100 | { |
956 | 104 | if ( !TypeOps::is_equal(tm, *type, *rtm.INTEGER_TYPE_ONE)) | 101 | if (type != store::XS_INTEGER) |
957 | 105 | GENV_ITEMFACTORY->createInteger(result, result->getIntegerValue()); | 102 | GENV_ITEMFACTORY->createInteger(result, result->getIntegerValue()); |
958 | 106 | } | 103 | } |
959 | 107 | else | 104 | else |
960 | @@ -109,28 +106,23 @@ | |||
961 | 109 | GENV_ITEMFACTORY->createInteger(result, -result->getIntegerValue()); | 106 | GENV_ITEMFACTORY->createInteger(result, -result->getIntegerValue()); |
962 | 110 | } | 107 | } |
963 | 111 | } | 108 | } |
965 | 112 | else if (TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE)) | 109 | else if (TypeOps::is_subtype(type, store::XS_DECIMAL)) |
966 | 113 | { | 110 | { |
967 | 114 | if ( result->getDecimalValue().sign() >= 0) | 111 | if ( result->getDecimalValue().sign() >= 0) |
968 | 115 | { | 112 | { |
970 | 116 | if ( !TypeOps::is_equal(tm, *type, *rtm.DECIMAL_TYPE_ONE)) | 113 | if (type != store::XS_DECIMAL) |
971 | 117 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue()); | 114 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue()); |
972 | 118 | } | 115 | } |
973 | 119 | else | 116 | else |
974 | 120 | { | 117 | { |
976 | 121 | GENV_ITEMFACTORY->createDecimal (result, -result->getDecimalValue()); | 118 | GENV_ITEMFACTORY->createDecimal(result, -result->getDecimalValue()); |
977 | 122 | } | 119 | } |
978 | 123 | } | 120 | } |
979 | 124 | else | 121 | else |
980 | 125 | { | 122 | { |
989 | 126 | RAISE_ERROR(err::XPTY0004, loc, | 123 | xqtref_t type = tm->create_value_type(result); |
990 | 127 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:abs" )); | 124 | RAISE_ERROR(err::XPTY0004, loc, |
991 | 128 | } | 125 | ERROR_PARAMS(ZED(BadTypeFor_23), type->toSchemaString(), "fn:abs" )); |
984 | 129 | |||
985 | 130 | if ( consumeNext(item, theChildren[0].getp(), planState )) | ||
986 | 131 | { | ||
987 | 132 | RAISE_ERROR(err::XPTY0004, loc, | ||
988 | 133 | ERROR_PARAMS(ZED(NoSeqForFnOp_2), "fn:abs")); | ||
992 | 134 | } | 126 | } |
993 | 135 | 127 | ||
994 | 136 | STACK_PUSH(true, state); | 128 | STACK_PUSH(true, state); |
995 | @@ -138,15 +130,15 @@ | |||
996 | 138 | STACK_END(state); | 130 | STACK_END(state); |
997 | 139 | } | 131 | } |
998 | 140 | 132 | ||
999 | 133 | |||
1000 | 141 | //6.4.2 fn:ceiling | 134 | //6.4.2 fn:ceiling |
1001 | 142 | bool | 135 | bool |
1002 | 143 | CeilingIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 136 | CeilingIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
1003 | 144 | { | 137 | { |
1004 | 145 | store::Item_t item; | 138 | store::Item_t item; |
1006 | 146 | xqtref_t type; | 139 | store::SchemaTypeCode type; |
1007 | 147 | 140 | ||
1008 | 148 | const TypeManager* tm = theSctx->get_typemanager(); | 141 | const TypeManager* tm = theSctx->get_typemanager(); |
1009 | 149 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
1010 | 150 | 142 | ||
1011 | 151 | PlanIteratorState* state; | 143 | PlanIteratorState* state; |
1012 | 152 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 144 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1013 | @@ -156,116 +148,109 @@ | |||
1014 | 156 | //get the value and the type of the item | 148 | //get the value and the type of the item |
1015 | 157 | assert(result->isAtomic()); | 149 | assert(result->isAtomic()); |
1016 | 158 | 150 | ||
1018 | 159 | type = tm->create_value_type(result); | 151 | type = result->getTypeCode(); |
1019 | 160 | 152 | ||
1020 | 161 | //Parameters of type xs:untypedAtomic are always promoted to xs:double | 153 | //Parameters of type xs:untypedAtomic are always promoted to xs:double |
1022 | 162 | if ( TypeOps::is_subtype(tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 154 | if (TypeOps::is_subtype(type, store::XS_UNTYPED_ATOMIC)) |
1023 | 163 | { | 155 | { |
1026 | 164 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 156 | GenericCast::castToBuiltinAtomic(result, result, store::XS_DOUBLE, NULL, loc); |
1027 | 165 | type = tm->create_value_type(result); | 157 | type = store::XS_DOUBLE; |
1028 | 166 | } | 158 | } |
1029 | 167 | 159 | ||
1032 | 168 | //item type is subtype of DOUBLE | 160 | if (TypeOps::is_subtype(type, store::XS_DOUBLE)) |
1033 | 169 | if ( TypeOps::is_subtype(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 161 | { |
1034 | 170 | GENV_ITEMFACTORY->createDouble(result, result->getDoubleValue().ceil()); | 162 | GENV_ITEMFACTORY->createDouble(result, result->getDoubleValue().ceil()); |
1038 | 171 | 163 | } | |
1039 | 172 | //item type is subtype of FLOAT | 164 | else if (TypeOps::is_subtype(type, store::XS_FLOAT)) |
1040 | 173 | else if ( TypeOps::is_subtype(tm, *type, *rtm.FLOAT_TYPE_ONE)) | 165 | { |
1041 | 174 | GENV_ITEMFACTORY->createFloat(result, result->getFloatValue().ceil()); | 166 | GENV_ITEMFACTORY->createFloat(result, result->getFloatValue().ceil()); |
1049 | 175 | 167 | } | |
1050 | 176 | //item type is subtype of INTEGER | 168 | else if (TypeOps::is_subtype(type, store::XS_INTEGER)) |
1051 | 177 | else if(TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE)) | 169 | { |
1052 | 178 | { /* do nothing */ } | 170 | /* do nothing */ |
1053 | 179 | 171 | } | |
1054 | 180 | //item type is subtype of DECIMAL | 172 | else if (TypeOps::is_subtype(type, store::XS_DECIMAL)) |
1055 | 181 | else if (TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE)) | 173 | { |
1056 | 182 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue().ceil()); | 174 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue().ceil()); |
1058 | 183 | 175 | } | |
1059 | 184 | else | 176 | else |
1060 | 185 | { | 177 | { |
1061 | 178 | xqtref_t type = tm->create_value_type(result); | ||
1062 | 186 | RAISE_ERROR(err::XPTY0004, loc, | 179 | RAISE_ERROR(err::XPTY0004, loc, |
1063 | 187 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:ceiling" )); | 180 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:ceiling" )); |
1064 | 188 | } | 181 | } |
1065 | 189 | 182 | ||
1066 | 190 | if ( consumeNext(item, theChildren[0].getp(), planState )) | ||
1067 | 191 | { | ||
1068 | 192 | RAISE_ERROR(err::XPTY0004, loc, | ||
1069 | 193 | ERROR_PARAMS(ZED(NoSeqForFnOp_2), "fn:ceiling")); | ||
1070 | 194 | } | ||
1071 | 195 | STACK_PUSH(true, state); | 183 | STACK_PUSH(true, state); |
1072 | 196 | } | 184 | } |
1073 | 185 | |||
1074 | 197 | STACK_END(state); | 186 | STACK_END(state); |
1075 | 198 | } | 187 | } |
1076 | 199 | 188 | ||
1077 | 189 | |||
1078 | 200 | //6.4.3 fn:floor | 190 | //6.4.3 fn:floor |
1079 | 201 | bool | 191 | bool |
1080 | 202 | FloorIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 192 | FloorIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
1081 | 203 | { | 193 | { |
1082 | 204 | store::Item_t item; | 194 | store::Item_t item; |
1084 | 205 | xqtref_t type; | 195 | store::SchemaTypeCode type; |
1085 | 206 | 196 | ||
1086 | 207 | const TypeManager* tm = theSctx->get_typemanager(); | 197 | const TypeManager* tm = theSctx->get_typemanager(); |
1087 | 208 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
1088 | 209 | 198 | ||
1089 | 210 | PlanIteratorState* state; | 199 | PlanIteratorState* state; |
1090 | 211 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 200 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1091 | 212 | 201 | ||
1092 | 213 | if (consumeNext(result, theChildren[0].getp(), planState)) | 202 | if (consumeNext(result, theChildren[0].getp(), planState)) |
1093 | 214 | { | 203 | { |
1094 | 215 | //get the value and the type of the item | ||
1095 | 216 | assert(result->isAtomic()); | 204 | assert(result->isAtomic()); |
1096 | 217 | 205 | ||
1098 | 218 | type = tm->create_value_type(result); | 206 | type = result->getTypeCode(); |
1099 | 219 | 207 | ||
1100 | 220 | //Parameters of type xs:untypedAtomic are always promoted to xs:double | 208 | //Parameters of type xs:untypedAtomic are always promoted to xs:double |
1102 | 221 | if (TypeOps::is_subtype(tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 209 | if (TypeOps::is_subtype(type, store::XS_UNTYPED_ATOMIC)) |
1103 | 222 | { | 210 | { |
1106 | 223 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 211 | GenericCast::castToBuiltinAtomic(result, result, store::XS_DOUBLE, NULL, loc); |
1107 | 224 | type = tm->create_value_type(result); | 212 | type = store::XS_DOUBLE; |
1108 | 225 | } | 213 | } |
1109 | 226 | 214 | ||
1112 | 227 | //item type is subtype of DOUBLE | 215 | if (TypeOps::is_subtype(type, store::XS_DOUBLE)) |
1113 | 228 | if (TypeOps::is_subtype(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 216 | { |
1114 | 229 | GENV_ITEMFACTORY->createDouble(result, result->getDoubleValue().floor()); | 217 | GENV_ITEMFACTORY->createDouble(result, result->getDoubleValue().floor()); |
1118 | 230 | 218 | } | |
1119 | 231 | //item type is subtype of FLOAT | 219 | else if (TypeOps::is_subtype(type, store::XS_FLOAT)) |
1120 | 232 | else if (TypeOps::is_subtype(tm, *type, *rtm.FLOAT_TYPE_ONE)) | 220 | { |
1121 | 233 | GENV_ITEMFACTORY->createFloat(result, result->getFloatValue().floor()); | 221 | GENV_ITEMFACTORY->createFloat(result, result->getFloatValue().floor()); |
1129 | 234 | 222 | } | |
1130 | 235 | //item type is subtype of INTEGER | 223 | else if(TypeOps::is_subtype(type, store::XS_INTEGER)) |
1131 | 236 | else if(TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE)) | 224 | { |
1132 | 237 | { /* do nothing */ } | 225 | /* do nothing */ |
1133 | 238 | 226 | } | |
1134 | 239 | //item type is subtype of DECIMAL | 227 | else if (TypeOps::is_subtype(type, store::XS_DECIMAL)) |
1135 | 240 | else if (TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE)) | 228 | { |
1136 | 241 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue().floor()); | 229 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue().floor()); |
1138 | 242 | 230 | } | |
1139 | 243 | else | 231 | else |
1140 | 244 | { | 232 | { |
1141 | 233 | xqtref_t type = tm->create_value_type(result); | ||
1142 | 245 | RAISE_ERROR(err::XPTY0004, loc, | 234 | RAISE_ERROR(err::XPTY0004, loc, |
1143 | 246 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:floor")); | 235 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:floor")); |
1144 | 247 | } | 236 | } |
1145 | 248 | 237 | ||
1152 | 249 | if ( consumeNext(item, theChildren[0].getp(), planState ) ) | 238 | STACK_PUSH(true, state); |
1147 | 250 | { | ||
1148 | 251 | RAISE_ERROR(err::XPTY0004, loc, | ||
1149 | 252 | ERROR_PARAMS(ZED(NoSeqForFnOp_2), "fn:floor" )); | ||
1150 | 253 | } | ||
1151 | 254 | STACK_PUSH (true, state ); | ||
1153 | 255 | } | 239 | } |
1155 | 256 | STACK_END (state); | 240 | |
1156 | 241 | STACK_END(state); | ||
1157 | 257 | } | 242 | } |
1158 | 258 | 243 | ||
1159 | 244 | |||
1160 | 259 | bool | 245 | bool |
1161 | 260 | RoundIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 246 | RoundIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
1162 | 261 | { | 247 | { |
1163 | 262 | store::Item_t item; | 248 | store::Item_t item; |
1165 | 263 | xqtref_t type; | 249 | store::SchemaTypeCode type; |
1166 | 264 | store::Item_t precision; | 250 | store::Item_t precision; |
1167 | 265 | Integer precision_integer(0); | 251 | Integer precision_integer(0); |
1168 | 266 | 252 | ||
1169 | 267 | const TypeManager* tm = theSctx->get_typemanager(); | 253 | const TypeManager* tm = theSctx->get_typemanager(); |
1170 | 268 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
1171 | 269 | 254 | ||
1172 | 270 | PlanIteratorState* state; | 255 | PlanIteratorState* state; |
1173 | 271 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 256 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1174 | @@ -280,125 +265,120 @@ | |||
1175 | 280 | precision_integer = precision->getIntegerValue(); | 265 | precision_integer = precision->getIntegerValue(); |
1176 | 281 | } | 266 | } |
1177 | 282 | 267 | ||
1178 | 283 | //get the value and the type of the item | ||
1179 | 284 | assert(result->isAtomic()); | 268 | assert(result->isAtomic()); |
1180 | 285 | 269 | ||
1209 | 286 | type = tm->create_value_type(result); | 270 | type = result->getTypeCode(); |
1210 | 287 | 271 | ||
1211 | 288 | //Parameters of type xs:untypedAtomic are always promoted to xs:double | 272 | if (TypeOps::is_subtype(type, store::XS_UNTYPED_ATOMIC)) |
1212 | 289 | if ( TypeOps::is_subtype(tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 273 | { |
1213 | 290 | { | 274 | GenericCast::castToBuiltinAtomic(result, result, store::XS_DOUBLE, NULL, loc); |
1214 | 291 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 275 | type = store::XS_DOUBLE; |
1215 | 292 | type = tm->create_value_type(result); | 276 | } |
1216 | 293 | } | 277 | |
1217 | 294 | 278 | if (TypeOps::is_subtype(type, store::XS_DOUBLE)) | |
1218 | 295 | //item type is subtype of DOUBLE | 279 | { |
1219 | 296 | if ( TypeOps::is_subtype(tm, *type, *rtm.DOUBLE_TYPE_ONE)) | 280 | GENV_ITEMFACTORY-> |
1220 | 297 | GENV_ITEMFACTORY->createDouble(result, result->getDoubleValue().round(precision_integer)); | 281 | createDouble(result, result->getDoubleValue().round(precision_integer)); |
1221 | 298 | 282 | } | |
1222 | 299 | //item type is subtype of FLOAT | 283 | else if (TypeOps::is_subtype(type, store::XS_FLOAT)) |
1223 | 300 | else if ( TypeOps::is_subtype(tm, *type, *rtm.FLOAT_TYPE_ONE)) | 284 | { |
1224 | 301 | GENV_ITEMFACTORY->createFloat(result, result->getFloatValue().round(precision_integer)); | 285 | GENV_ITEMFACTORY-> |
1225 | 302 | 286 | createFloat(result, result->getFloatValue().round(precision_integer)); | |
1226 | 303 | //item type is subtype of INTEGER | 287 | } |
1227 | 304 | else if(TypeOps::is_subtype(tm, *type, *rtm.INTEGER_TYPE_ONE)) | 288 | else if (TypeOps::is_subtype(type, store::XS_INTEGER)) |
1228 | 305 | { | 289 | { |
1229 | 306 | if(precision_integer.sign() < 0) | 290 | if (precision_integer.sign() < 0) |
1230 | 307 | GENV_ITEMFACTORY->createInteger(result, result->getIntegerValue().round(precision_integer)); | 291 | GENV_ITEMFACTORY-> |
1231 | 308 | } | 292 | createInteger(result, result->getIntegerValue().round(precision_integer)); |
1232 | 309 | 293 | } | |
1233 | 310 | //item type is subtype of DECIMAL | 294 | |
1234 | 311 | else if (TypeOps::is_subtype(tm, *type, *rtm.DECIMAL_TYPE_ONE)) | 295 | else if (TypeOps::is_subtype(type, store::XS_DECIMAL)) |
1235 | 312 | GENV_ITEMFACTORY->createDecimal(result, result->getDecimalValue().round(precision_integer)); | 296 | { |
1236 | 313 | 297 | GENV_ITEMFACTORY-> | |
1237 | 298 | createDecimal(result, result->getDecimalValue().round(precision_integer)); | ||
1238 | 299 | } | ||
1239 | 314 | else | 300 | else |
1240 | 315 | { | 301 | { |
1241 | 302 | xqtref_t type = tm->create_value_type(result); | ||
1242 | 316 | RAISE_ERROR(err::XPTY0004, loc, | 303 | RAISE_ERROR(err::XPTY0004, loc, |
1243 | 317 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:round")); | 304 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:round")); |
1244 | 318 | } | 305 | } |
1245 | 319 | 306 | ||
1252 | 320 | if ( consumeNext(item, theChildren[0].getp(), planState )) | 307 | STACK_PUSH(true, state); |
1247 | 321 | { | ||
1248 | 322 | RAISE_ERROR(err::XPTY0004, loc, | ||
1249 | 323 | ERROR_PARAMS(ZED(NoSeqForFnOp_2), "fn:round" )); | ||
1250 | 324 | } | ||
1251 | 325 | STACK_PUSH (true, state ); | ||
1253 | 326 | } | 308 | } |
1255 | 327 | STACK_END (state); | 309 | |
1256 | 310 | STACK_END(state); | ||
1257 | 328 | } | 311 | } |
1258 | 329 | 312 | ||
1259 | 313 | |||
1260 | 330 | //6.4.5 fn:round-half-to-even | 314 | //6.4.5 fn:round-half-to-even |
1263 | 331 | bool RoundHalfToEvenIterator::nextImpl( store::Item_t &result, | 315 | bool RoundHalfToEvenIterator::nextImpl( |
1264 | 332 | PlanState& planState ) const { | 316 | store::Item_t& result, |
1265 | 317 | PlanState& planState ) const | ||
1266 | 318 | { | ||
1267 | 333 | store::Item_t item; | 319 | store::Item_t item; |
1268 | 334 | xs_integer precision; | 320 | xs_integer precision; |
1269 | 335 | RootTypeManager const &rtm = GENV_TYPESYSTEM; | ||
1270 | 336 | TypeManager const *const tm = theSctx->get_typemanager(); | 321 | TypeManager const *const tm = theSctx->get_typemanager(); |
1283 | 337 | xqtref_t type; | 322 | store::SchemaTypeCode type; |
1284 | 338 | 323 | ||
1285 | 339 | PlanIteratorState *state; | 324 | PlanIteratorState* state; |
1286 | 340 | DEFAULT_STACK_INIT( PlanIteratorState, state, planState ); | 325 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1287 | 341 | 326 | ||
1288 | 342 | if ( consumeNext( result, theChildren [0].getp(), planState ) ) { | 327 | if (consumeNext(result, theChildren [0].getp(), planState)) |
1289 | 343 | assert( result->isAtomic() ); | 328 | { |
1290 | 344 | type = tm->create_value_type( result ); | 329 | assert(result->isAtomic()); |
1291 | 345 | 330 | type = result->getTypeCode(); | |
1292 | 346 | if ( theChildren.size() == 2 ) { | 331 | |
1293 | 347 | consumeNext( item, theChildren[1].getp(), planState ); | 332 | if (theChildren.size() == 2) |
1294 | 348 | assert( item->isAtomic() ); | 333 | { |
1295 | 334 | consumeNext(item, theChildren[1].getp(), planState); | ||
1296 | 335 | assert(item->isAtomic()); | ||
1297 | 349 | precision = item->getIntegerValue(); | 336 | precision = item->getIntegerValue(); |
1298 | 350 | } | 337 | } |
1299 | 351 | 338 | ||
1301 | 352 | if ( TypeOps::is_subtype( tm, *type, *rtm.UNTYPED_ATOMIC_TYPE_ONE ) ) { | 339 | if (TypeOps::is_subtype(type, store::XS_UNTYPED_ATOMIC)) |
1302 | 340 | { | ||
1303 | 353 | // | 341 | // |
1304 | 354 | // XQuery 3.0 3.1.5.2: Each item in the atomic sequence that is of type | 342 | // XQuery 3.0 3.1.5.2: Each item in the atomic sequence that is of type |
1305 | 355 | // xs:untypedAtomic is cast to the expected generalized atomic type. For | 343 | // xs:untypedAtomic is cast to the expected generalized atomic type. For |
1306 | 356 | // built-in functions where the expected type is specified as numeric, | 344 | // built-in functions where the expected type is specified as numeric, |
1307 | 357 | // arguments of type xs:untypedAtomic are cast to xs:double. | 345 | // arguments of type xs:untypedAtomic are cast to xs:double. |
1308 | 358 | // | 346 | // |
1335 | 359 | GenericCast::castToAtomic( | 347 | GenericCast::castToBuiltinAtomic(result, result, store::XS_DOUBLE, NULL, loc); |
1336 | 360 | result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc | 348 | type = store::XS_DOUBLE; |
1337 | 361 | ); | 349 | } |
1338 | 362 | type = tm->create_value_type( result ); | 350 | |
1339 | 363 | } | 351 | if (TypeOps::is_subtype(type, store::XS_DOUBLE)) |
1340 | 364 | 352 | { | |
1341 | 365 | if ( TypeOps::is_subtype( tm, *type, *rtm.DOUBLE_TYPE_ONE ) ) | 353 | GENV_ITEMFACTORY-> |
1342 | 366 | GENV_ITEMFACTORY->createDouble( | 354 | createDouble(result, result->getDoubleValue().roundHalfToEven(precision)); |
1343 | 367 | result, result->getDoubleValue().roundHalfToEven( precision ) | 355 | } |
1344 | 368 | ); | 356 | else if (TypeOps::is_subtype(type, store::XS_FLOAT)) |
1345 | 369 | 357 | { | |
1346 | 370 | else if ( TypeOps::is_subtype( tm, *type, *rtm.FLOAT_TYPE_ONE ) ) | 358 | GENV_ITEMFACTORY-> |
1347 | 371 | GENV_ITEMFACTORY->createFloat( | 359 | createFloat(result, result->getFloatValue().roundHalfToEven(precision)); |
1348 | 372 | result, result->getFloatValue().roundHalfToEven( precision ) | 360 | } |
1349 | 373 | ); | 361 | else if (TypeOps::is_subtype(type, store::XS_INTEGER)) |
1350 | 374 | 362 | { | |
1351 | 375 | else if ( TypeOps::is_subtype( tm, *type, *rtm.INTEGER_TYPE_ONE ) ) | 363 | GENV_ITEMFACTORY-> |
1352 | 376 | GENV_ITEMFACTORY->createInteger( | 364 | createInteger(result, result->getIntegerValue().roundHalfToEven(precision)); |
1353 | 377 | result, result->getIntegerValue().roundHalfToEven( precision ) | 365 | } |
1354 | 378 | ); | 366 | else if (TypeOps::is_subtype(type, store::XS_DECIMAL)) |
1355 | 379 | 367 | { | |
1356 | 380 | else if ( TypeOps::is_subtype( tm, *type, *rtm.DECIMAL_TYPE_ONE ) ) | 368 | GENV_ITEMFACTORY-> |
1357 | 381 | GENV_ITEMFACTORY->createDecimal( | 369 | createDecimal(result, result->getDecimalValue().roundHalfToEven(precision)); |
1358 | 382 | result, result->getDecimalValue().roundHalfToEven( precision ) | 370 | } |
1333 | 383 | ); | ||
1334 | 384 | |||
1359 | 385 | else | 371 | else |
1365 | 386 | throw XQUERY_EXCEPTION( | 372 | { |
1366 | 387 | err::XPTY0004, | 373 | xqtref_t type = tm->create_value_type(result); |
1367 | 388 | ERROR_PARAMS( ZED( BadTypeFor_23 ), type, "fn:round-half-to-even" ), | 374 | RAISE_ERROR(err::XPTY0004, loc, |
1368 | 389 | ERROR_LOC( loc ) | 375 | ERROR_PARAMS(ZED(BadTypeFor_23), type, "fn:round-half-to-even")); |
1369 | 390 | ); | 376 | } |
1370 | 391 | 377 | ||
1379 | 392 | if ( consumeNext( item, theChildren [0].getp(), planState ) ) { | 378 | STACK_PUSH(true, state); |
1372 | 393 | throw XQUERY_EXCEPTION( | ||
1373 | 394 | err::XPTY0004, | ||
1374 | 395 | ERROR_PARAMS( ZED( NoSeqForFnOp_2 ), "fn:round-half-to-even" ), | ||
1375 | 396 | ERROR_LOC( loc ) | ||
1376 | 397 | ); | ||
1377 | 398 | } | ||
1378 | 399 | STACK_PUSH( true, state ); | ||
1380 | 400 | } | 379 | } |
1382 | 401 | STACK_END( state ); | 380 | |
1383 | 381 | STACK_END(state); | ||
1384 | 402 | } | 382 | } |
1385 | 403 | 383 | ||
1386 | 404 | } // namespace zorba | 384 | } // namespace zorba |
1387 | 405 | 385 | ||
1388 | === modified file 'src/runtime/sequences/SequencesImpl.cpp' | |||
1389 | --- src/runtime/sequences/SequencesImpl.cpp 2013-05-15 23:22:01 +0000 | |||
1390 | +++ src/runtime/sequences/SequencesImpl.cpp 2013-06-11 09:57:50 +0000 | |||
1391 | @@ -62,35 +62,6 @@ | |||
1392 | 62 | 62 | ||
1393 | 63 | NARY_ACCEPT(FnMinMaxIterator); | 63 | NARY_ACCEPT(FnMinMaxIterator); |
1394 | 64 | 64 | ||
1395 | 65 | namespace sequences_impl_ns{ | ||
1396 | 66 | static XQPCollator* getCollator( | ||
1397 | 67 | static_context* sctx, | ||
1398 | 68 | const QueryLoc& loc, | ||
1399 | 69 | PlanState& planState, | ||
1400 | 70 | const PlanIterator* iter) | ||
1401 | 71 | { | ||
1402 | 72 | store::Item_t lCollationItem; | ||
1403 | 73 | store::Item_t temp; | ||
1404 | 74 | |||
1405 | 75 | if (!PlanIterator::consumeNext(lCollationItem, iter, planState)) | ||
1406 | 76 | throw XQUERY_EXCEPTION( | ||
1407 | 77 | err::XPTY0004, | ||
1408 | 78 | ERROR_PARAMS( ZED( NoEmptySeqAsCollationParam ) ), | ||
1409 | 79 | ERROR_LOC( loc ) | ||
1410 | 80 | ); | ||
1411 | 81 | |||
1412 | 82 | if (PlanIterator::consumeNext(temp, iter, planState)) | ||
1413 | 83 | throw XQUERY_EXCEPTION( | ||
1414 | 84 | err::XPTY0004, | ||
1415 | 85 | ERROR_PARAMS( ZED( NoSeqAsCollationParam ) ), | ||
1416 | 86 | ERROR_LOC( loc ) | ||
1417 | 87 | ); | ||
1418 | 88 | |||
1419 | 89 | xqtref_t lCollationItemType = sctx->get_typemanager()->create_value_type(lCollationItem); | ||
1420 | 90 | |||
1421 | 91 | return sctx->get_collator(lCollationItem->getStringValue().str(), loc); | ||
1422 | 92 | } | ||
1423 | 93 | } | ||
1424 | 94 | 65 | ||
1425 | 95 | ///////////////////////////////////////////////////////////////////////////////// | 66 | ///////////////////////////////////////////////////////////////////////////////// |
1426 | 96 | // // | 67 | // // |
1427 | @@ -121,104 +92,108 @@ | |||
1428 | 121 | bool | 92 | bool |
1429 | 122 | FnMinMaxIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 93 | FnMinMaxIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
1430 | 123 | { | 94 | { |
1433 | 124 | store::Item_t lRunningItem = NULL; | 95 | store::Item_t runningItem = NULL; |
1434 | 125 | xqtref_t lMaxType; | 96 | store::SchemaTypeCode maxType = store::XS_LAST; |
1435 | 126 | 97 | ||
1436 | 127 | const TypeManager* tm = theSctx->get_typemanager(); | 98 | const TypeManager* tm = theSctx->get_typemanager(); |
1437 | 128 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
1438 | 129 | |||
1439 | 130 | long timezone = planState.theLocalDynCtx->get_implicit_timezone(); | 99 | long timezone = planState.theLocalDynCtx->get_implicit_timezone(); |
1441 | 131 | XQPCollator* lCollator = 0; | 100 | XQPCollator* collator = 0; |
1442 | 132 | unsigned elems_in_seq = 0; | 101 | unsigned elems_in_seq = 0; |
1443 | 133 | result = NULL; | 102 | result = NULL; |
1444 | 134 | 103 | ||
1445 | 135 | try | 104 | try |
1446 | 136 | { | 105 | { |
1494 | 137 | PlanIteratorState* state; | 106 | PlanIteratorState* state; |
1495 | 138 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 107 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1496 | 139 | 108 | ||
1497 | 140 | if (theChildren.size() == 2) | 109 | if (theChildren.size() == 2) |
1498 | 141 | lCollator = sequences_impl_ns::getCollator(theSctx, loc, planState, theChildren[1].getp()); | 110 | { |
1499 | 142 | else | 111 | store::Item_t collationItem; |
1500 | 143 | lCollator = theSctx->get_default_collator(loc); | 112 | consumeNext(collationItem, theChildren[1], planState); |
1501 | 144 | 113 | collator = theSctx->get_collator(collationItem->getStringValue().str(), loc); | |
1502 | 145 | if (consumeNext(lRunningItem, theChildren[0].getp(), planState)) | 114 | } |
1503 | 146 | { | 115 | else |
1504 | 147 | do | 116 | { |
1505 | 148 | { | 117 | collator = theSctx->get_default_collator(loc); |
1506 | 149 | // casting of untyped atomic | 118 | } |
1507 | 150 | xqtref_t lRunningType = tm->create_value_type(lRunningItem); | 119 | |
1508 | 151 | 120 | if (consumeNext(runningItem, theChildren[0], planState)) | |
1509 | 152 | if (TypeOps::is_subtype(tm, *lRunningType, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 121 | { |
1510 | 153 | { | 122 | do |
1511 | 154 | GenericCast::castToAtomic(lRunningItem, | 123 | { |
1512 | 155 | lRunningItem, | 124 | // casting of untyped atomic |
1513 | 156 | &*rtm.DOUBLE_TYPE_ONE, | 125 | store::SchemaTypeCode runningType = runningItem->getTypeCode(); |
1514 | 157 | tm, | 126 | |
1515 | 158 | NULL, | 127 | if (runningType == store::XS_UNTYPED_ATOMIC) |
1516 | 159 | loc); | 128 | { |
1517 | 160 | lRunningType = rtm.DOUBLE_TYPE_ONE; | 129 | GenericCast::castToBuiltinAtomic(runningItem, |
1518 | 161 | } | 130 | runningItem, |
1519 | 162 | 131 | store::XS_DOUBLE, | |
1520 | 163 | // implementation dependent: return the first occurence) | 132 | NULL, |
1521 | 164 | if (lRunningItem->isNaN()) | 133 | loc); |
1522 | 165 | { | 134 | runningType = store::XS_DOUBLE; |
1523 | 166 | /** It must be checked if the sequence contains any | 135 | } |
1524 | 167 | * xs:double("NaN") [xs:double("NaN") is returned] or | 136 | |
1525 | 168 | * only xs:float("NaN")'s [xs:float("NaN") is returned]'. | 137 | // implementation dependent: return the first occurence) |
1526 | 169 | */ | 138 | if (runningItem->isNaN()) |
1527 | 170 | result = lRunningItem; | 139 | { |
1528 | 171 | if (TypeOps::is_subtype(tm, *lRunningType, *rtm.DOUBLE_TYPE_ONE)) | 140 | // It must be checked if the sequence contains any |
1529 | 172 | break; | 141 | // xs:double("NaN") [xs:double("NaN") is returned] or |
1530 | 173 | 142 | // only xs:float("NaN")'s [xs:float("NaN") is returned]'. | |
1531 | 174 | lMaxType = tm->create_value_type(result); | 143 | |
1532 | 175 | } | 144 | result = runningItem; |
1533 | 176 | 145 | if (TypeOps::is_subtype(runningType, store::XS_DOUBLE)) | |
1534 | 177 | if (result != 0) | 146 | break; |
1535 | 178 | { | 147 | |
1536 | 179 | // Type Promotion | 148 | maxType = runningType; |
1537 | 180 | store::Item_t lItemCur; | 149 | } |
1538 | 181 | if (!GenericCast::promote(lItemCur, lRunningItem, &*lMaxType, NULL, tm, loc)) | 150 | |
1539 | 182 | { | 151 | if (result != 0) |
1540 | 183 | if (GenericCast::promote(lItemCur, result, &*lRunningType, NULL, tm, loc)) | 152 | { |
1541 | 153 | // Type Promotion | ||
1542 | 154 | store::Item_t lItemCur; | ||
1543 | 155 | if (!GenericCast::promote(lItemCur, runningItem, maxType, NULL, tm, loc)) | ||
1544 | 184 | { | 156 | { |
1547 | 185 | result.transfer(lItemCur); | 157 | if (GenericCast::promote(lItemCur, result, runningType, NULL, tm, loc)) |
1548 | 186 | lMaxType = tm->create_value_type(result); | 158 | { |
1549 | 159 | result.transfer(lItemCur); | ||
1550 | 160 | maxType = result->getTypeCode(); | ||
1551 | 161 | } | ||
1552 | 162 | else | ||
1553 | 163 | { | ||
1554 | 164 | RAISE_ERROR(err::FORG0006, loc, | ||
1555 | 165 | ERROR_PARAMS(ZED(PromotionImpossible))); | ||
1556 | 166 | } | ||
1557 | 187 | } | 167 | } |
1558 | 188 | else | 168 | else |
1559 | 189 | { | 169 | { |
1562 | 190 | RAISE_ERROR(err::FORG0006, loc, | 170 | runningItem.transfer(lItemCur); |
1563 | 191 | ERROR_PARAMS(ZED(PromotionImpossible))); | 171 | runningType = runningItem->getTypeCode(); |
1564 | 172 | } | ||
1565 | 173 | |||
1566 | 174 | store::Item_t current_copy(runningItem); | ||
1567 | 175 | store::Item_t max_copy(result); | ||
1568 | 176 | if (CompareIterator::valueComparison(loc, | ||
1569 | 177 | current_copy, | ||
1570 | 178 | max_copy, | ||
1571 | 179 | theCompareType, | ||
1572 | 180 | tm, | ||
1573 | 181 | timezone, | ||
1574 | 182 | collator)) | ||
1575 | 183 | { | ||
1576 | 184 | maxType = runningType; | ||
1577 | 185 | result.transfer(runningItem); | ||
1578 | 192 | } | 186 | } |
1579 | 193 | } | 187 | } |
1580 | 194 | else | 188 | else |
1581 | 195 | { | 189 | { |
1608 | 196 | lRunningItem.transfer(lItemCur); | 190 | maxType = runningType; |
1609 | 197 | lRunningType = tm->create_value_type(lRunningItem); | 191 | result.transfer(runningItem); |
1610 | 198 | } | 192 | } |
1611 | 199 | 193 | ||
1612 | 200 | store::Item_t current_copy(lRunningItem); | 194 | elems_in_seq++; |
1613 | 201 | store::Item_t max_copy(result); | 195 | } |
1614 | 202 | if (CompareIterator::valueComparison(loc, | 196 | while (consumeNext(runningItem, theChildren[0], planState)); |
1589 | 203 | current_copy, | ||
1590 | 204 | max_copy, | ||
1591 | 205 | theCompareType, | ||
1592 | 206 | tm, | ||
1593 | 207 | timezone, | ||
1594 | 208 | lCollator) ) | ||
1595 | 209 | { | ||
1596 | 210 | lMaxType = lRunningType; | ||
1597 | 211 | result.transfer(lRunningItem); | ||
1598 | 212 | } | ||
1599 | 213 | } | ||
1600 | 214 | else | ||
1601 | 215 | { | ||
1602 | 216 | lMaxType = lRunningType; | ||
1603 | 217 | result.transfer(lRunningItem); | ||
1604 | 218 | } | ||
1605 | 219 | |||
1606 | 220 | elems_in_seq++; | ||
1607 | 221 | } while (consumeNext(lRunningItem, theChildren[0].getp(), planState)); | ||
1615 | 222 | 197 | ||
1616 | 223 | if (elems_in_seq == 1) | 198 | if (elems_in_seq == 1) |
1617 | 224 | { | 199 | { |
1618 | @@ -231,7 +206,7 @@ | |||
1619 | 231 | theCompareType, | 206 | theCompareType, |
1620 | 232 | tm, | 207 | tm, |
1621 | 233 | timezone, | 208 | timezone, |
1623 | 234 | lCollator); | 209 | collator); |
1624 | 235 | } | 210 | } |
1625 | 236 | 211 | ||
1626 | 237 | STACK_PUSH(result != NULL, state); | 212 | STACK_PUSH(result != NULL, state); |
1627 | 238 | 213 | ||
1628 | === modified file 'src/runtime/sequences/sequences_impl.cpp' | |||
1629 | --- src/runtime/sequences/sequences_impl.cpp 2013-06-05 00:37:35 +0000 | |||
1630 | +++ src/runtime/sequences/sequences_impl.cpp 2013-06-11 09:57:50 +0000 | |||
1631 | @@ -1438,7 +1438,7 @@ | |||
1632 | 1438 | { | 1438 | { |
1633 | 1439 | store::Item_t lSumItem; | 1439 | store::Item_t lSumItem; |
1634 | 1440 | store::Item_t lRunningItem; | 1440 | store::Item_t lRunningItem; |
1636 | 1441 | xqtref_t lRunningType; | 1441 | store::SchemaTypeCode lRunningType; |
1637 | 1442 | store::Item_t countItem; | 1442 | store::Item_t countItem; |
1638 | 1443 | int lCount = 0; | 1443 | int lCount = 0; |
1639 | 1444 | bool lHitNumeric = false, lHitYearMonth = false, lHitDayTime = false; | 1444 | bool lHitNumeric = false, lHitYearMonth = false, lHitDayTime = false; |
1640 | @@ -1446,86 +1446,101 @@ | |||
1641 | 1446 | const TypeManager* tm = theSctx->get_typemanager(); | 1446 | const TypeManager* tm = theSctx->get_typemanager(); |
1642 | 1447 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | 1447 | const RootTypeManager& rtm = GENV_TYPESYSTEM; |
1643 | 1448 | 1448 | ||
1644 | 1449 | xqtref_t lUntypedAtomic = rtm.UNTYPED_ATOMIC_TYPE_ONE; | ||
1645 | 1450 | xqtref_t lYearMonthDuration = rtm.YM_DURATION_TYPE_ONE; | ||
1646 | 1451 | xqtref_t lDayTimeDuration = rtm.DT_DURATION_TYPE_ONE; | ||
1647 | 1452 | |||
1648 | 1453 | PlanIteratorState* state; | 1449 | PlanIteratorState* state; |
1649 | 1454 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 1450 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1650 | 1455 | 1451 | ||
1651 | 1456 | while (consumeNext(lRunningItem, theChildren[0].getp(), planState)) | 1452 | while (consumeNext(lRunningItem, theChildren[0].getp(), planState)) |
1652 | 1457 | { | 1453 | { |
1654 | 1458 | lRunningType = tm->create_value_type(lRunningItem); | 1454 | lRunningType = lRunningItem->getTypeCode(); |
1655 | 1459 | 1455 | ||
1658 | 1460 | if (TypeOps::is_numeric(tm, *lRunningType) || | 1456 | if (TypeOps::is_numeric(lRunningType) || |
1659 | 1461 | TypeOps::is_equal(tm, *lRunningType, *lUntypedAtomic)) | 1457 | lRunningType == store::XS_UNTYPED_ATOMIC) |
1660 | 1462 | { | 1458 | { |
1661 | 1463 | lHitNumeric = true; | 1459 | lHitNumeric = true; |
1662 | 1464 | 1460 | ||
1664 | 1465 | if ( lHitYearMonth ) | 1461 | if (lHitYearMonth) |
1665 | 1462 | { | ||
1666 | 1463 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1667 | 1466 | RAISE_ERROR(err::FORG0006, loc, | 1464 | RAISE_ERROR(err::FORG0006, loc, |
1668 | 1467 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), | 1465 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), |
1670 | 1468 | *lRunningType, | 1466 | *type, |
1671 | 1469 | "fn:avg", | 1467 | "fn:avg", |
1672 | 1470 | ZED(ExpectedType_5), | 1468 | ZED(ExpectedType_5), |
1674 | 1471 | *lYearMonthDuration)); | 1469 | *rtm.YM_DURATION_TYPE_ONE)); |
1675 | 1470 | } | ||
1676 | 1472 | 1471 | ||
1678 | 1473 | if ( lHitDayTime ) | 1472 | if (lHitDayTime) |
1679 | 1473 | { | ||
1680 | 1474 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1681 | 1474 | RAISE_ERROR(err::FORG0006, loc, | 1475 | RAISE_ERROR(err::FORG0006, loc, |
1682 | 1475 | ERROR_PARAMS(ZED( BadArgTypeForFn_2o34o ), | 1476 | ERROR_PARAMS(ZED( BadArgTypeForFn_2o34o ), |
1684 | 1476 | *lRunningType, | 1477 | *type, |
1685 | 1477 | "fn:avg", | 1478 | "fn:avg", |
1686 | 1478 | ZED( ExpectedType_5 ), | 1479 | ZED( ExpectedType_5 ), |
1688 | 1479 | *lDayTimeDuration)); | 1480 | *rtm.DT_DURATION_TYPE_ONE)); |
1689 | 1481 | } | ||
1690 | 1480 | } | 1482 | } |
1692 | 1481 | else if (TypeOps::is_equal(tm, *lRunningType, *lYearMonthDuration)) | 1483 | else if (lRunningType == store::XS_YM_DURATION) |
1693 | 1482 | { | 1484 | { |
1694 | 1483 | lHitYearMonth = true; | 1485 | lHitYearMonth = true; |
1695 | 1484 | 1486 | ||
1696 | 1485 | if (lHitNumeric) | 1487 | if (lHitNumeric) |
1697 | 1488 | { | ||
1698 | 1489 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1699 | 1486 | RAISE_ERROR(err::FORG0006, loc, | 1490 | RAISE_ERROR(err::FORG0006, loc, |
1700 | 1487 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), | 1491 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), |
1702 | 1488 | *lRunningType, | 1492 | *type, |
1703 | 1489 | "fn:avg", | 1493 | "fn:avg", |
1704 | 1490 | ZED(ExpectedNumericType))); | 1494 | ZED(ExpectedNumericType))); |
1705 | 1495 | } | ||
1706 | 1491 | 1496 | ||
1707 | 1492 | if (lHitDayTime) | 1497 | if (lHitDayTime) |
1708 | 1498 | { | ||
1709 | 1499 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1710 | 1493 | RAISE_ERROR(err::FORG0006, loc, | 1500 | RAISE_ERROR(err::FORG0006, loc, |
1711 | 1494 | ERROR_PARAMS(ZED( BadArgTypeForFn_2o34o ), | 1501 | ERROR_PARAMS(ZED( BadArgTypeForFn_2o34o ), |
1713 | 1495 | *lRunningType, | 1502 | *type, |
1714 | 1496 | "fn:avg", | 1503 | "fn:avg", |
1715 | 1497 | ZED( ExpectedType_5 ), | 1504 | ZED( ExpectedType_5 ), |
1717 | 1498 | *lDayTimeDuration)); | 1505 | *rtm.DT_DURATION_TYPE_ONE)); |
1718 | 1506 | } | ||
1719 | 1499 | } | 1507 | } |
1721 | 1500 | else if (TypeOps::is_equal(tm, *lRunningType, *lDayTimeDuration)) | 1508 | else if (lRunningType == store::XS_DT_DURATION) |
1722 | 1501 | { | 1509 | { |
1723 | 1502 | lHitDayTime = true; | 1510 | lHitDayTime = true; |
1724 | 1503 | 1511 | ||
1726 | 1504 | if ( lHitNumeric ) | 1512 | if (lHitNumeric) |
1727 | 1513 | { | ||
1728 | 1514 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1729 | 1505 | RAISE_ERROR(err::FORG0006, loc, | 1515 | RAISE_ERROR(err::FORG0006, loc, |
1730 | 1506 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), | 1516 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), |
1732 | 1507 | *lRunningType, | 1517 | *type, |
1733 | 1508 | "fn:avg", | 1518 | "fn:avg", |
1734 | 1509 | ZED(ExpectedNumericType))); | 1519 | ZED(ExpectedNumericType))); |
1735 | 1520 | } | ||
1736 | 1510 | 1521 | ||
1738 | 1511 | if ( lHitYearMonth ) | 1522 | if (lHitYearMonth) |
1739 | 1523 | { | ||
1740 | 1524 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1741 | 1512 | RAISE_ERROR(err::FORG0006, loc, | 1525 | RAISE_ERROR(err::FORG0006, loc, |
1742 | 1513 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), | 1526 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), |
1744 | 1514 | *lRunningType, | 1527 | *type, |
1745 | 1515 | "fn:avg", | 1528 | "fn:avg", |
1746 | 1516 | ZED(ExpectedType_5), | 1529 | ZED(ExpectedType_5), |
1748 | 1517 | *lYearMonthDuration)); | 1530 | *rtm.YM_DURATION_TYPE_ONE)); |
1749 | 1531 | } | ||
1750 | 1518 | } | 1532 | } |
1751 | 1519 | else | 1533 | else |
1752 | 1520 | { | 1534 | { |
1753 | 1535 | xqtref_t type = tm->create_value_type(lRunningItem); | ||
1754 | 1521 | RAISE_ERROR(err::FORG0006, loc, | 1536 | RAISE_ERROR(err::FORG0006, loc, |
1755 | 1522 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), | 1537 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), |
1757 | 1523 | *lRunningType, | 1538 | *type, |
1758 | 1524 | "fn:avg", | 1539 | "fn:avg", |
1759 | 1525 | ZED(ExpectedNumericOrDurationType))); | 1540 | ZED(ExpectedNumericOrDurationType))); |
1760 | 1526 | } | 1541 | } |
1761 | 1527 | 1542 | ||
1763 | 1528 | if ( lCount++ == 0 ) | 1543 | if (lCount++ == 0) |
1764 | 1529 | { | 1544 | { |
1765 | 1530 | lSumItem = lRunningItem; | 1545 | lSumItem = lRunningItem; |
1766 | 1531 | } | 1546 | } |
1767 | @@ -1559,17 +1574,17 @@ | |||
1768 | 1559 | STACK_END (state); | 1574 | STACK_END (state); |
1769 | 1560 | } | 1575 | } |
1770 | 1561 | 1576 | ||
1771 | 1577 | |||
1772 | 1562 | /******************************************************************************* | 1578 | /******************************************************************************* |
1773 | 1563 | 15.4.5 fn:sum - Generic | 1579 | 15.4.5 fn:sum - Generic |
1774 | 1564 | ********************************************************************************/ | 1580 | ********************************************************************************/ |
1775 | 1565 | bool FnSumIterator::nextImpl(store::Item_t& result, PlanState& planState) const | 1581 | bool FnSumIterator::nextImpl(store::Item_t& result, PlanState& planState) const |
1776 | 1566 | { | 1582 | { |
1777 | 1567 | store::Item_t lRunningItem; | 1583 | store::Item_t lRunningItem; |
1780 | 1568 | xqtref_t lResultType; | 1584 | store::SchemaTypeCode lResultType; |
1781 | 1569 | xqtref_t lRunningType; | 1585 | store::SchemaTypeCode lRunningType; |
1782 | 1570 | 1586 | ||
1783 | 1571 | const TypeManager* tm = theSctx->get_typemanager(); | 1587 | const TypeManager* tm = theSctx->get_typemanager(); |
1784 | 1572 | const RootTypeManager& rtm = GENV_TYPESYSTEM; | ||
1785 | 1573 | 1588 | ||
1786 | 1574 | PlanIteratorState* state; | 1589 | PlanIteratorState* state; |
1787 | 1575 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); | 1590 | DEFAULT_STACK_INIT(PlanIteratorState, state, planState); |
1788 | @@ -1577,37 +1592,37 @@ | |||
1789 | 1577 | if (consumeNext(result, theChildren[0].getp(), planState)) | 1592 | if (consumeNext(result, theChildren[0].getp(), planState)) |
1790 | 1578 | { | 1593 | { |
1791 | 1579 | // casting of untyped atomic | 1594 | // casting of untyped atomic |
1793 | 1580 | lResultType = tm->create_value_type(result); | 1595 | lResultType = result->getTypeCode(); |
1794 | 1581 | 1596 | ||
1796 | 1582 | if (TypeOps::is_subtype(tm, *lResultType, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 1597 | if (lResultType == store::XS_UNTYPED_ATOMIC) |
1797 | 1583 | { | 1598 | { |
1800 | 1584 | GenericCast::castToAtomic(result, result, &*rtm.DOUBLE_TYPE_ONE, tm, NULL, loc); | 1599 | GenericCast::castToBuiltinAtomic(result, result, store::XS_DOUBLE, NULL, loc); |
1801 | 1585 | lResultType = rtm.DOUBLE_TYPE_ONE; | 1600 | lResultType = store::XS_DOUBLE; |
1802 | 1586 | } | 1601 | } |
1803 | 1587 | 1602 | ||
1807 | 1588 | if (!TypeOps::is_numeric(tm, *lResultType) && | 1603 | if (!TypeOps::is_numeric(lResultType) && |
1808 | 1589 | (!TypeOps::is_subtype(tm, *lResultType, *rtm.DURATION_TYPE_ONE) || | 1604 | (!TypeOps::is_subtype(lResultType, store::XS_DURATION) || |
1809 | 1590 | TypeOps::is_equal(tm, *lResultType, *rtm.DURATION_TYPE_ONE))) | 1605 | lResultType == store::XS_DURATION)) |
1810 | 1591 | { | 1606 | { |
1811 | 1607 | xqtref_t type = tm->create_value_type(result); | ||
1812 | 1592 | RAISE_ERROR(err::FORG0006, loc, | 1608 | RAISE_ERROR(err::FORG0006, loc, |
1814 | 1593 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), *lResultType, "fn:sum")); | 1609 | ERROR_PARAMS(ZED(BadArgTypeForFn_2o34o), *type, "fn:sum")); |
1815 | 1594 | } | 1610 | } |
1816 | 1595 | 1611 | ||
1817 | 1596 | while (consumeNext(lRunningItem, theChildren[0].getp(), planState)) | 1612 | while (consumeNext(lRunningItem, theChildren[0].getp(), planState)) |
1818 | 1597 | { | 1613 | { |
1819 | 1598 | // casting of untyped atomic | 1614 | // casting of untyped atomic |
1821 | 1599 | lRunningType = tm->create_value_type(lRunningItem); | 1615 | lRunningType = lRunningItem->getTypeCode(); |
1822 | 1600 | 1616 | ||
1824 | 1601 | if (TypeOps::is_subtype(tm, *lRunningType, *rtm.UNTYPED_ATOMIC_TYPE_ONE)) | 1617 | if (lRunningType == store::XS_UNTYPED_ATOMIC) |
1825 | 1602 | { | 1618 | { |
1832 | 1603 | GenericCast::castToAtomic(lRunningItem, | 1619 | GenericCast::castToBuiltinAtomic(lRunningItem, |
1833 | 1604 | lRunningItem, | 1620 | lRunningItem, |
1834 | 1605 | &*rtm.DOUBLE_TYPE_ONE, | 1621 | store::XS_DOUBLE, |
1835 | 1606 | tm, | 1622 | NULL, |
1836 | 1607 | NULL, | 1623 | loc); |
1831 | 1608 | loc); | ||
1837 | 1609 | 1624 | ||
1839 | 1610 | lRunningType = rtm.DOUBLE_TYPE_ONE; | 1625 | lRunningType = store::XS_DOUBLE; |
1840 | 1611 | } | 1626 | } |
1841 | 1612 | 1627 | ||
1842 | 1613 | // handling of NaN | 1628 | // handling of NaN |
1843 | @@ -1617,12 +1632,12 @@ | |||
1844 | 1617 | break; | 1632 | break; |
1845 | 1618 | } | 1633 | } |
1846 | 1619 | 1634 | ||
1853 | 1620 | if((TypeOps::is_numeric(tm, *lResultType) && | 1635 | if ((TypeOps::is_numeric(lResultType) && |
1854 | 1621 | TypeOps::is_numeric(tm, *lRunningType)) || | 1636 | TypeOps::is_numeric(lRunningType)) || |
1855 | 1622 | (TypeOps::is_subtype(tm, *lResultType, *rtm.YM_DURATION_TYPE_ONE) && | 1637 | (TypeOps::is_subtype(lResultType, store::XS_YM_DURATION) && |
1856 | 1623 | TypeOps::is_subtype(tm, *lRunningType, *rtm.YM_DURATION_TYPE_ONE)) || | 1638 | TypeOps::is_subtype(lRunningType, store::XS_YM_DURATION)) || |
1857 | 1624 | (TypeOps::is_subtype(tm, *lResultType, *rtm.DT_DURATION_TYPE_ONE) && | 1639 | (TypeOps::is_subtype(lResultType, store::XS_DT_DURATION) && |
1858 | 1625 | TypeOps::is_subtype(tm, *lRunningType, *rtm.DT_DURATION_TYPE_ONE))) | 1640 | TypeOps::is_subtype(lRunningType, store::XS_DT_DURATION))) |
1859 | 1626 | { | 1641 | { |
1860 | 1627 | GenericArithIterator<AddOperation>::compute(result, | 1642 | GenericArithIterator<AddOperation>::compute(result, |
1861 | 1628 | planState.theLocalDynCtx, | 1643 | planState.theLocalDynCtx, |
1862 | @@ -1633,13 +1648,10 @@ | |||
1863 | 1633 | } | 1648 | } |
1864 | 1634 | else | 1649 | else |
1865 | 1635 | { | 1650 | { |
1873 | 1636 | throw XQUERY_EXCEPTION( | 1651 | xqtref_t type1 = tm->create_value_type(result); |
1874 | 1637 | err::FORG0006, | 1652 | xqtref_t type2 = tm->create_value_type(lRunningItem); |
1875 | 1638 | ERROR_PARAMS( | 1653 | RAISE_ERROR(err::FORG0006, loc, |
1876 | 1639 | ZED( SumImpossibleWithTypes_23 ), *lResultType, *lRunningType | 1654 | ERROR_PARAMS(ZED( SumImpossibleWithTypes_23 ), *type1, *type2)); |
1870 | 1640 | ), | ||
1871 | 1641 | ERROR_LOC( loc ) | ||
1872 | 1642 | ); | ||
1877 | 1643 | } | 1655 | } |
1878 | 1644 | } | 1656 | } |
1879 | 1645 | 1657 | ||
1880 | @@ -1657,18 +1669,16 @@ | |||
1881 | 1657 | } | 1669 | } |
1882 | 1658 | else | 1670 | else |
1883 | 1659 | { | 1671 | { |
1890 | 1660 | STACK_PUSH( | 1672 | STACK_PUSH(GENV_ITEMFACTORY-> |
1891 | 1661 | GENV_ITEMFACTORY->createInteger( | 1673 | createInteger(result, numeric_consts<xs_integer>::zero()), |
1892 | 1662 | result, numeric_consts<xs_integer>::zero() | 1674 | state); |
1887 | 1663 | ), | ||
1888 | 1664 | state | ||
1889 | 1665 | ); | ||
1893 | 1666 | } | 1675 | } |
1894 | 1667 | } | 1676 | } |
1895 | 1668 | 1677 | ||
1897 | 1669 | STACK_END (state); | 1678 | STACK_END(state); |
1898 | 1670 | } | 1679 | } |
1899 | 1671 | 1680 | ||
1900 | 1681 | |||
1901 | 1672 | /******************************************************************************* | 1682 | /******************************************************************************* |
1902 | 1673 | 15.4.5 fn:sum - Double | 1683 | 15.4.5 fn:sum - Double |
1903 | 1674 | ********************************************************************************/ | 1684 | ********************************************************************************/ |
1904 | @@ -1766,6 +1776,7 @@ | |||
1905 | 1766 | STACK_END (state); | 1776 | STACK_END (state); |
1906 | 1767 | } | 1777 | } |
1907 | 1768 | 1778 | ||
1908 | 1779 | |||
1909 | 1769 | /******************************************************************************* | 1780 | /******************************************************************************* |
1910 | 1770 | 15.4.5 fn:sum - Decimal | 1781 | 15.4.5 fn:sum - Decimal |
1911 | 1771 | ********************************************************************************/ | 1782 | ********************************************************************************/ |
1912 | @@ -1814,6 +1825,7 @@ | |||
1913 | 1814 | STACK_END (state); | 1825 | STACK_END (state); |
1914 | 1815 | } | 1826 | } |
1915 | 1816 | 1827 | ||
1916 | 1828 | |||
1917 | 1817 | /******************************************************************************* | 1829 | /******************************************************************************* |
1918 | 1818 | 15.4.5 fn:sum - Integer | 1830 | 15.4.5 fn:sum - Integer |
1919 | 1819 | ********************************************************************************/ | 1831 | ********************************************************************************/ |
1920 | @@ -1823,8 +1835,8 @@ | |||
1921 | 1823 | { | 1835 | { |
1922 | 1824 | xs_integer sum; | 1836 | xs_integer sum; |
1923 | 1825 | store::Item_t item; | 1837 | store::Item_t item; |
1926 | 1826 | xqtref_t lResultType; | 1838 | store::SchemaTypeCode lResultType; |
1927 | 1827 | xqtref_t lTmpType; | 1839 | store::SchemaTypeCode lTmpType; |
1928 | 1828 | 1840 | ||
1929 | 1829 | const TypeManager* tm = theSctx->get_typemanager(); | 1841 | const TypeManager* tm = theSctx->get_typemanager(); |
1930 | 1830 | 1842 | ||
1931 | @@ -1833,13 +1845,15 @@ | |||
1932 | 1833 | 1845 | ||
1933 | 1834 | if (consumeNext(item, theChildren[0].getp(), planState)) | 1846 | if (consumeNext(item, theChildren[0].getp(), planState)) |
1934 | 1835 | { | 1847 | { |
1936 | 1836 | lResultType = tm->create_value_type(item); | 1848 | lResultType = item->getTypeCode(); |
1937 | 1849 | |||
1938 | 1837 | sum = item->getIntegerValue(); | 1850 | sum = item->getIntegerValue(); |
1939 | 1838 | 1851 | ||
1940 | 1839 | while (consumeNext(item, theChildren[0].getp(), planState)) | 1852 | while (consumeNext(item, theChildren[0].getp(), planState)) |
1941 | 1840 | { | 1853 | { |
1944 | 1841 | lTmpType = tm->create_value_type(item); | 1854 | lTmpType = item->getTypeCode(); |
1945 | 1842 | if(TypeOps::is_subtype(tm, *lResultType, *lTmpType)) | 1855 | |
1946 | 1856 | if (TypeOps::is_subtype(lResultType, lTmpType)) | ||
1947 | 1843 | lResultType = lTmpType; | 1857 | lResultType = lTmpType; |
1948 | 1844 | 1858 | ||
1949 | 1845 | if (item->isNaN()) | 1859 | if (item->isNaN()) |
1950 | @@ -1852,7 +1866,8 @@ | |||
1951 | 1852 | } | 1866 | } |
1952 | 1853 | 1867 | ||
1953 | 1854 | GENV_ITEMFACTORY->createInteger(result, sum); | 1868 | GENV_ITEMFACTORY->createInteger(result, sum); |
1955 | 1855 | GenericCast::castToAtomic(result, result, &*lResultType, tm, NULL, loc); | 1869 | |
1956 | 1870 | GenericCast::castToBuiltinAtomic(result, result, lResultType, NULL, loc); | ||
1957 | 1856 | 1871 | ||
1958 | 1857 | STACK_PUSH(true, state); | 1872 | STACK_PUSH(true, state); |
1959 | 1858 | } | 1873 | } |
1960 | @@ -1872,6 +1887,7 @@ | |||
1961 | 1872 | STACK_END (state); | 1887 | STACK_END (state); |
1962 | 1873 | } | 1888 | } |
1963 | 1874 | 1889 | ||
1964 | 1890 | |||
1965 | 1875 | /******************************************************************************* | 1891 | /******************************************************************************* |
1966 | 1876 | 15.5.1 op:to | 1892 | 15.5.1 op:to |
1967 | 1877 | ********************************************************************************/ | 1893 | ********************************************************************************/ |
1968 | @@ -1906,6 +1922,7 @@ | |||
1969 | 1906 | STACK_END (state); | 1922 | STACK_END (state); |
1970 | 1907 | } | 1923 | } |
1971 | 1908 | 1924 | ||
1972 | 1925 | |||
1973 | 1909 | /******************************************************************************* | 1926 | /******************************************************************************* |
1974 | 1910 | 15.5.4 fn:doc | 1927 | 15.5.4 fn:doc |
1975 | 1911 | ********************************************************************************/ | 1928 | ********************************************************************************/ |
1976 | 1912 | 1929 | ||
1977 | === modified file 'src/runtime/store/maps_impl.cpp' | |||
1978 | --- src/runtime/store/maps_impl.cpp 2013-05-08 20:14:47 +0000 | |||
1979 | +++ src/runtime/store/maps_impl.cpp 2013-06-11 09:57:50 +0000 | |||
1980 | @@ -77,10 +77,7 @@ | |||
1981 | 77 | loc ) ) | 77 | loc ) ) |
1982 | 78 | { | 78 | { |
1983 | 79 | RAISE_ERROR(zerr::ZXQD0005_INVALID_KEY_FOR_MAP, loc, | 79 | RAISE_ERROR(zerr::ZXQD0005_INVALID_KEY_FOR_MAP, loc, |
1988 | 80 | ERROR_PARAMS(*searchKeyType, | 80 | ERROR_PARAMS(*searchKeyType, *indexKeyType, aQName->getStringValue())); |
1985 | 81 | *indexKeyType, | ||
1986 | 82 | aQName->getStringValue()) | ||
1987 | 83 | ); | ||
1989 | 84 | } | 81 | } |
1990 | 85 | else | 82 | else |
1991 | 86 | { | 83 | { |
1992 | @@ -91,10 +88,7 @@ | |||
1993 | 91 | if ( e.diagnostic() == err::FORG0001 ) | 88 | if ( e.diagnostic() == err::FORG0001 ) |
1994 | 92 | { | 89 | { |
1995 | 93 | RAISE_ERROR(zerr::ZXQD0005_INVALID_KEY_FOR_MAP, loc, | 90 | RAISE_ERROR(zerr::ZXQD0005_INVALID_KEY_FOR_MAP, loc, |
2000 | 94 | ERROR_PARAMS(*searchKeyType, | 91 | ERROR_PARAMS(*searchKeyType, *indexKeyType, aQName->getStringValue())); |
1997 | 95 | *indexKeyType, | ||
1998 | 96 | aQName->getStringValue()) | ||
1999 | 97 | ); | ||
2001 | 98 | } | 92 | } |
2002 | 99 | throw; | 93 | throw; |
2003 | 100 | } | 94 | } |
2004 | 101 | 95 | ||
2005 | === modified file 'src/types/typeops.cpp' | |||
2006 | --- src/types/typeops.cpp 2013-06-03 23:03:58 +0000 | |||
2007 | +++ src/types/typeops.cpp 2013-06-11 09:57:50 +0000 | |||
2008 | @@ -1151,7 +1151,6 @@ | |||
2009 | 1151 | 1151 | ||
2010 | 1152 | RootTypeManager& rtm = GENV_TYPESYSTEM; | 1152 | RootTypeManager& rtm = GENV_TYPESYSTEM; |
2011 | 1153 | 1153 | ||
2012 | 1154 | xqtref_t resultType; | ||
2013 | 1155 | TypeConstants::quantifier_t resultQuant = TypeConstants::QUANT_ONE; | 1154 | TypeConstants::quantifier_t resultQuant = TypeConstants::QUANT_ONE; |
2014 | 1156 | 1155 | ||
2015 | 1157 | TypeConstants::quantifier_t quant1 = type1.get_quantifier(); | 1156 | TypeConstants::quantifier_t quant1 = type1.get_quantifier(); |
2016 | @@ -1166,43 +1165,43 @@ | |||
2017 | 1166 | } | 1165 | } |
2018 | 1167 | 1166 | ||
2019 | 1168 | if (division && | 1167 | if (division && |
2022 | 1169 | TypeOps::is_subtype(tm, type1, *rtm.INTEGER_TYPE_STAR) && | 1168 | is_subtype(tm, type1, *rtm.INTEGER_TYPE_STAR) && |
2023 | 1170 | TypeOps::is_subtype(tm, type2, *rtm.INTEGER_TYPE_STAR)) | 1169 | is_subtype(tm, type2, *rtm.INTEGER_TYPE_STAR)) |
2024 | 1171 | { | 1170 | { |
2025 | 1172 | return (resultQuant == TypeConstants::QUANT_ONE ? | 1171 | return (resultQuant == TypeConstants::QUANT_ONE ? |
2026 | 1173 | rtm.DECIMAL_TYPE_ONE : rtm.DECIMAL_TYPE_QUESTION); | 1172 | rtm.DECIMAL_TYPE_ONE : rtm.DECIMAL_TYPE_QUESTION); |
2027 | 1174 | } | 1173 | } |
2028 | 1175 | 1174 | ||
2045 | 1176 | if (TypeOps::is_subtype(tm, type1, *rtm.UNTYPED_ATOMIC_TYPE_STAR) || | 1175 | if (is_subtype(tm, type1, *rtm.UNTYPED_ATOMIC_TYPE_STAR) || |
2046 | 1177 | TypeOps::is_subtype(tm, type2, *rtm.UNTYPED_ATOMIC_TYPE_STAR)) | 1176 | is_subtype(tm, type2, *rtm.UNTYPED_ATOMIC_TYPE_STAR)) |
2047 | 1178 | { | 1177 | { |
2048 | 1179 | return (resultQuant == TypeConstants::QUANT_ONE ? | 1178 | return (resultQuant == TypeConstants::QUANT_ONE ? |
2049 | 1180 | rtm.DOUBLE_TYPE_ONE : rtm.DOUBLE_TYPE_QUESTION); | 1179 | rtm.DOUBLE_TYPE_ONE : rtm.DOUBLE_TYPE_QUESTION); |
2050 | 1181 | } | 1180 | } |
2051 | 1182 | 1181 | ||
2052 | 1183 | if (TypeOps::is_subtype(tm, type1, *rtm.DOUBLE_TYPE_STAR) || | 1182 | if (is_subtype(tm, type1, *rtm.DOUBLE_TYPE_STAR) || |
2053 | 1184 | TypeOps::is_subtype(tm, type2, *rtm.DOUBLE_TYPE_STAR)) | 1183 | is_subtype(tm, type2, *rtm.DOUBLE_TYPE_STAR)) |
2054 | 1185 | { | 1184 | { |
2055 | 1186 | return (resultQuant == TypeConstants::QUANT_ONE ? | 1185 | return (resultQuant == TypeConstants::QUANT_ONE ? |
2056 | 1187 | rtm.DOUBLE_TYPE_ONE : rtm.DOUBLE_TYPE_QUESTION); | 1186 | rtm.DOUBLE_TYPE_ONE : rtm.DOUBLE_TYPE_QUESTION); |
2057 | 1188 | } | 1187 | } |
2058 | 1189 | 1188 | ||
2059 | 1190 | if (TypeOps::is_subtype(tm, type1, *rtm.FLOAT_TYPE_STAR) || | 1189 | if (is_subtype(tm, type1, *rtm.FLOAT_TYPE_STAR) || |
2060 | 1191 | TypeOps::is_subtype(tm, type2, *rtm.FLOAT_TYPE_STAR)) | 1190 | is_subtype(tm, type2, *rtm.FLOAT_TYPE_STAR)) |
2061 | 1192 | { | 1191 | { |
2062 | 1193 | return (resultQuant == TypeConstants::QUANT_ONE ? | 1192 | return (resultQuant == TypeConstants::QUANT_ONE ? |
2063 | 1194 | rtm.FLOAT_TYPE_ONE : rtm.FLOAT_TYPE_QUESTION); | 1193 | rtm.FLOAT_TYPE_ONE : rtm.FLOAT_TYPE_QUESTION); |
2064 | 1195 | } | 1194 | } |
2065 | 1196 | 1195 | ||
2068 | 1197 | if (TypeOps::is_subtype(tm, type1, *rtm.INTEGER_TYPE_STAR) && | 1196 | if (is_subtype(tm, type1, *rtm.INTEGER_TYPE_STAR) && |
2069 | 1198 | TypeOps::is_subtype(tm, type2, *rtm.INTEGER_TYPE_STAR)) | 1197 | is_subtype(tm, type2, *rtm.INTEGER_TYPE_STAR)) |
2070 | 1199 | { | 1198 | { |
2071 | 1200 | return (resultQuant == TypeConstants::QUANT_ONE ? | 1199 | return (resultQuant == TypeConstants::QUANT_ONE ? |
2072 | 1201 | rtm.INTEGER_TYPE_ONE : rtm.INTEGER_TYPE_QUESTION); | 1200 | rtm.INTEGER_TYPE_ONE : rtm.INTEGER_TYPE_QUESTION); |
2073 | 1202 | } | 1201 | } |
2074 | 1203 | 1202 | ||
2077 | 1204 | if (TypeOps::is_subtype(tm, type1, *rtm.DECIMAL_TYPE_STAR) && | 1203 | if (is_subtype(tm, type1, *rtm.DECIMAL_TYPE_STAR) && |
2078 | 1205 | TypeOps::is_subtype(tm, type2, *rtm.DECIMAL_TYPE_STAR)) | 1204 | is_subtype(tm, type2, *rtm.DECIMAL_TYPE_STAR)) |
2079 | 1206 | { | 1205 | { |
2080 | 1207 | return (resultQuant == TypeConstants::QUANT_ONE ? | 1206 | return (resultQuant == TypeConstants::QUANT_ONE ? |
2081 | 1208 | rtm.DECIMAL_TYPE_ONE : rtm.DECIMAL_TYPE_QUESTION); | 1207 | rtm.DECIMAL_TYPE_ONE : rtm.DECIMAL_TYPE_QUESTION); |
2082 | @@ -1215,6 +1214,50 @@ | |||
2083 | 1215 | /******************************************************************************* | 1214 | /******************************************************************************* |
2084 | 1216 | 1215 | ||
2085 | 1217 | ********************************************************************************/ | 1216 | ********************************************************************************/ |
2086 | 1217 | store::SchemaTypeCode TypeOps::arithmetic_type( | ||
2087 | 1218 | store::SchemaTypeCode type1, | ||
2088 | 1219 | store::SchemaTypeCode type2, | ||
2089 | 1220 | bool division) | ||
2090 | 1221 | { | ||
2091 | 1222 | if (division && | ||
2092 | 1223 | is_subtype(type1, store::XS_INTEGER) && | ||
2093 | 1224 | is_subtype(type2, store::XS_INTEGER)) | ||
2094 | 1225 | { | ||
2095 | 1226 | return store::XS_DECIMAL; | ||
2096 | 1227 | } | ||
2097 | 1228 | |||
2098 | 1229 | if (type1 == store::XS_UNTYPED_ATOMIC || type2 == store::XS_UNTYPED_ATOMIC) | ||
2099 | 1230 | { | ||
2100 | 1231 | return store::XS_DOUBLE; | ||
2101 | 1232 | } | ||
2102 | 1233 | |||
2103 | 1234 | if (is_subtype(type1, store::XS_DOUBLE) || is_subtype(type2, store::XS_DOUBLE)) | ||
2104 | 1235 | { | ||
2105 | 1236 | return store::XS_DOUBLE; | ||
2106 | 1237 | } | ||
2107 | 1238 | |||
2108 | 1239 | if (is_subtype(type1, store::XS_FLOAT) || is_subtype(type2, store::XS_FLOAT)) | ||
2109 | 1240 | { | ||
2110 | 1241 | return store::XS_FLOAT; | ||
2111 | 1242 | } | ||
2112 | 1243 | |||
2113 | 1244 | if (is_subtype(type1, store::XS_INTEGER) && is_subtype(type2, store::XS_INTEGER)) | ||
2114 | 1245 | { | ||
2115 | 1246 | return store::XS_INTEGER; | ||
2116 | 1247 | } | ||
2117 | 1248 | |||
2118 | 1249 | if (is_subtype(type1, store::XS_DECIMAL) && is_subtype(type2, store::XS_DECIMAL)) | ||
2119 | 1250 | { | ||
2120 | 1251 | return store::XS_DECIMAL; | ||
2121 | 1252 | } | ||
2122 | 1253 | |||
2123 | 1254 | return store::XS_ANY_ATOMIC; | ||
2124 | 1255 | } | ||
2125 | 1256 | |||
2126 | 1257 | |||
2127 | 1258 | /******************************************************************************* | ||
2128 | 1259 | |||
2129 | 1260 | ********************************************************************************/ | ||
2130 | 1218 | static inline IdentTypes::quantifier_t get_typeident_quant( | 1261 | static inline IdentTypes::quantifier_t get_typeident_quant( |
2131 | 1219 | TypeConstants::quantifier_t quant) | 1262 | TypeConstants::quantifier_t quant) |
2132 | 1220 | { | 1263 | { |
2133 | 1221 | 1264 | ||
2134 | === modified file 'src/types/typeops.h' | |||
2135 | --- src/types/typeops.h 2013-02-07 17:24:36 +0000 | |||
2136 | +++ src/types/typeops.h 2013-06-11 09:57:50 +0000 | |||
2137 | @@ -181,6 +181,11 @@ | |||
2138 | 181 | const XQType& type2, | 181 | const XQType& type2, |
2139 | 182 | bool division); | 182 | bool division); |
2140 | 183 | 183 | ||
2141 | 184 | static store::SchemaTypeCode arithmetic_type( | ||
2142 | 185 | store::SchemaTypeCode type1, | ||
2143 | 186 | store::SchemaTypeCode type2, | ||
2144 | 187 | bool division); | ||
2145 | 188 | |||
2146 | 184 | /* | 189 | /* |
2147 | 185 | * Returns a type identifier that represents the given type. | 190 | * Returns a type identifier that represents the given type. |
2148 | 186 | * The invariant that is guaranteed is: | 191 | * The invariant that is guaranteed is: |
Validation queue starting for merge proposal. zorbatest. lambda. nu:8080/ remotequeue/ markos- scratch- 2013-06- 11T10-20- 00.706Z/ log.html
Log at: http://