1 | /* |
2 | * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, |
3 | * and the EPL 1.0 (http://h2database.com/html/license.html). |
4 | * Initial Developer: H2 Group |
5 | */ |
6 | package org.h2.command.dml; |
7 | |
8 | import java.sql.ResultSet; |
9 | import org.h2.command.CommandInterface; |
10 | import org.h2.command.Prepared; |
11 | import org.h2.engine.Session; |
12 | import org.h2.expression.Expression; |
13 | import org.h2.expression.ExpressionVisitor; |
14 | import org.h2.result.LocalResult; |
15 | import org.h2.result.ResultInterface; |
16 | import org.h2.value.Value; |
17 | |
18 | /** |
19 | * This class represents the statement |
20 | * CALL. |
21 | */ |
22 | public class Call extends Prepared { |
23 | |
24 | private boolean isResultSet; |
25 | private Expression expression; |
26 | private Expression[] expressions; |
27 | |
28 | public Call(Session session) { |
29 | super(session); |
30 | } |
31 | |
32 | @Override |
33 | public ResultInterface queryMeta() { |
34 | LocalResult result; |
35 | if (isResultSet) { |
36 | Expression[] expr = expression.getExpressionColumns(session); |
37 | result = new LocalResult(session, expr, expr.length); |
38 | } else { |
39 | result = new LocalResult(session, expressions, 1); |
40 | } |
41 | result.done(); |
42 | return result; |
43 | } |
44 | |
45 | @Override |
46 | public int update() { |
47 | Value v = expression.getValue(session); |
48 | int type = v.getType(); |
49 | switch(type) { |
50 | case Value.RESULT_SET: |
51 | // this will throw an exception |
52 | // methods returning a result set may not be called like this. |
53 | return super.update(); |
54 | case Value.UNKNOWN: |
55 | case Value.NULL: |
56 | return 0; |
57 | default: |
58 | return v.getInt(); |
59 | } |
60 | } |
61 | |
62 | @Override |
63 | public ResultInterface query(int maxrows) { |
64 | setCurrentRowNumber(1); |
65 | Value v = expression.getValue(session); |
66 | if (isResultSet) { |
67 | v = v.convertTo(Value.RESULT_SET); |
68 | ResultSet rs = v.getResultSet(); |
69 | return LocalResult.read(session, rs, maxrows); |
70 | } |
71 | LocalResult result = new LocalResult(session, expressions, 1); |
72 | Value[] row = { v }; |
73 | result.addRow(row); |
74 | result.done(); |
75 | return result; |
76 | } |
77 | |
78 | @Override |
79 | public void prepare() { |
80 | expression = expression.optimize(session); |
81 | expressions = new Expression[] { expression }; |
82 | isResultSet = expression.getType() == Value.RESULT_SET; |
83 | if (isResultSet) { |
84 | prepareAlways = true; |
85 | } |
86 | } |
87 | |
88 | public void setExpression(Expression expression) { |
89 | this.expression = expression; |
90 | } |
91 | |
92 | @Override |
93 | public boolean isQuery() { |
94 | return true; |
95 | } |
96 | |
97 | @Override |
98 | public boolean isTransactional() { |
99 | return true; |
100 | } |
101 | |
102 | @Override |
103 | public boolean isReadOnly() { |
104 | return expression.isEverything(ExpressionVisitor.READONLY_VISITOR); |
105 | |
106 | } |
107 | |
108 | @Override |
109 | public int getType() { |
110 | return CommandInterface.CALL; |
111 | } |
112 | |
113 | @Override |
114 | public boolean isCacheable() { |
115 | return !isResultSet; |
116 | } |
117 | |
118 | } |