147 long timer = System.currentTimeMillis();
152 parser = (HeavyDBParser)
parserPool.borrowObject();
154 }
catch (Exception ex) {
155 String msg =
"Could not get Parse Item from pool: " + ex.getMessage();
156 HEAVYDBLOGGER.error(msg, ex);
157 throw new InvalidParseRequest(-1, msg);
159 List<Restriction> rests = null;
160 if (trestrictions != null && !trestrictions.isEmpty()) {
161 rests =
new ArrayList<>();
162 for (TRestriction trestriction : trestrictions) {
163 Restriction rest = null;
164 rest =
new Restriction(trestriction.database,
167 trestriction.values);
171 HeavyDBUser dbUser =
new HeavyDBUser(user, session, catalog,
dbPort, rests);
172 HEAVYDBLOGGER.debug(
"process was called User: " + user +
" Catalog: " + catalog
173 +
" sql: " + queryText);
174 parser.setUser(dbUser);
175 CURRENT_PARSER.set(
parser);
178 boolean isRAQuery =
false;
180 if (queryText.startsWith(
"execute calcite")) {
181 queryText = queryText.replaceFirst(
"execute calcite",
"");
185 queryText = queryText.trim();
187 if (queryText.length() > 0 && queryText.charAt(queryText.length() - 1) ==
';') {
188 queryText = queryText.substring(0, queryText.length() - 1);
191 SqlIdentifierCapturer capturer;
192 TAccessedQueryObjects primaryAccessedObjects =
new TAccessedQueryObjects();
193 TAccessedQueryObjects resolvedAccessedObjects =
new TAccessedQueryObjects();
195 final List<HeavyDBParserOptions.FilterPushDownInfo> filterPushDownInfo =
197 for (
final TFilterPushDownInfo req : optimizationOption.filter_push_down_info) {
198 filterPushDownInfo.add(
new HeavyDBParserOptions.FilterPushDownInfo(
199 req.input_prev, req.input_start, req.input_next));
201 HeavyDBParserOptions parserOptions =
new HeavyDBParserOptions(filterPushDownInfo,
202 queryParsingOption.legacy_syntax,
203 queryParsingOption.is_explain,
204 optimizationOption.is_view_optimize,
205 optimizationOption.enable_watchdog);
208 Pair<String, SqlIdentifierCapturer>
res;
211 res = parser.process(queryText, parserOptions);
212 jsonResult = res.left;
213 capturer = res.right;
215 primaryAccessedObjects.tables_selected_from =
new ArrayList<>(capturer.selects);
216 primaryAccessedObjects.tables_inserted_into =
new ArrayList<>(capturer.inserts);
217 primaryAccessedObjects.tables_updated_in =
new ArrayList<>(capturer.updates);
218 primaryAccessedObjects.tables_deleted_from =
new ArrayList<>(capturer.deletes);
223 resolvedAccessedObjects.tables_selected_from =
224 new ArrayList<>(parser.resolveSelectIdentifiers(capturer));
225 resolvedAccessedObjects.tables_inserted_into =
new ArrayList<>(capturer.inserts);
226 resolvedAccessedObjects.tables_updated_in =
new ArrayList<>(capturer.updates);
227 resolvedAccessedObjects.tables_deleted_from =
new ArrayList<>(capturer.deletes);
230 jsonResult = parser.optimizeRAQuery(queryText, parserOptions);
232 }
catch (SqlParseException ex) {
233 String msg =
"SQL Error: " + ex.getMessage();
234 HEAVYDBLOGGER.error(msg);
235 throw new InvalidParseRequest(-2, msg);
236 }
catch (org.apache.calcite.tools.ValidationException ex) {
237 String msg =
"SQL Error: " + ex.getMessage();
238 if (ex.getCause() != null
239 && (ex.getCause().getClass() == CalciteContextException.class)) {
240 msg =
"SQL Error: " + ex.getCause().getMessage();
242 HEAVYDBLOGGER.error(msg);
243 throw new InvalidParseRequest(-3, msg);
244 }
catch (CalciteContextException ex) {
245 String msg = ex.getMessage();
246 HEAVYDBLOGGER.error(msg);
247 throw new InvalidParseRequest(-6, msg);
248 }
catch (RelConversionException ex) {
249 String msg =
"Failed to generate relational algebra for query " + ex.getMessage();
250 HEAVYDBLOGGER.error(msg, ex);
251 throw new InvalidParseRequest(-5, msg);
252 }
catch (Throwable ex) {
253 HEAVYDBLOGGER.error(ex.getClass().
toString());
254 String msg = ex.getMessage();
255 HEAVYDBLOGGER.error(msg, ex);
256 throw new InvalidParseRequest(-4, msg);
258 CURRENT_PARSER.set(null);
261 parserPool.returnObject(
parser);
262 }
catch (Exception ex) {
263 String msg =
"Could not return parse object: " + ex.getMessage();
264 HEAVYDBLOGGER.error(msg, ex);
265 throw new InvalidParseRequest(-7, msg);
269 TPlanResult
result =
new TPlanResult();
270 result.primary_accessed_objects = primaryAccessedObjects;
271 result.resolved_accessed_objects = resolvedAccessedObjects;
272 result.plan_result = jsonResult;
273 result.execution_time_ms = System.currentTimeMillis() - timer;
final GenericObjectPool parserPool
std::string toString(const Executor::ExtModuleKinds &kind)