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);
179 boolean buildRATreeFromRAString =
false;
180 if (queryText.startsWith(
"execute calcite")) {
181 queryText = queryText.replaceFirst(
"execute calcite",
"");
182 buildRATreeFromRAString =
true;
186 queryText = queryText.trim();
188 if (queryText.length() > 0 && queryText.charAt(queryText.length() - 1) ==
';') {
189 queryText = queryText.substring(0, queryText.length() - 1);
192 SqlIdentifierCapturer capturer;
193 TAccessedQueryObjects primaryAccessedObjects =
new TAccessedQueryObjects();
194 TAccessedQueryObjects resolvedAccessedObjects =
new TAccessedQueryObjects();
196 final List<HeavyDBParserOptions.FilterPushDownInfo> filterPushDownInfo =
198 for (
final TFilterPushDownInfo req : optimizationOption.filter_push_down_info) {
199 filterPushDownInfo.add(
new HeavyDBParserOptions.FilterPushDownInfo(
200 req.input_prev, req.input_start, req.input_next));
202 HeavyDBParserOptions parserOptions =
new HeavyDBParserOptions(filterPushDownInfo,
203 queryParsingOption.legacy_syntax,
204 queryParsingOption.is_explain,
205 optimizationOption.is_view_optimize,
206 optimizationOption.enable_watchdog,
207 optimizationOption.distributed_mode);
209 if (!buildRATreeFromRAString) {
210 Pair<String, SqlIdentifierCapturer>
res;
213 res = parser.process(queryText, parserOptions);
214 jsonResult = res.left;
215 capturer = res.right;
217 primaryAccessedObjects.tables_selected_from =
new ArrayList<>(capturer.selects);
218 primaryAccessedObjects.tables_inserted_into =
new ArrayList<>(capturer.inserts);
219 primaryAccessedObjects.tables_updated_in =
new ArrayList<>(capturer.updates);
220 primaryAccessedObjects.tables_deleted_from =
new ArrayList<>(capturer.deletes);
225 resolvedAccessedObjects.tables_selected_from =
226 new ArrayList<>(parser.resolveSelectIdentifiers(capturer));
227 resolvedAccessedObjects.tables_inserted_into =
new ArrayList<>(capturer.inserts);
228 resolvedAccessedObjects.tables_updated_in =
new ArrayList<>(capturer.updates);
229 resolvedAccessedObjects.tables_deleted_from =
new ArrayList<>(capturer.deletes);
234 parser.buildRATreeAndPerformQueryOptimization(queryText, parserOptions);
236 }
catch (SqlParseException ex) {
237 String msg =
"SQL Error: " + ex.getMessage();
238 HEAVYDBLOGGER.error(msg);
239 throw new InvalidParseRequest(-2, msg);
240 }
catch (org.apache.calcite.tools.ValidationException ex) {
241 String msg =
"SQL Error: " + ex.getMessage();
242 if (ex.getCause() != null
243 && (ex.getCause().getClass() == CalciteContextException.class)) {
244 msg =
"SQL Error: " + ex.getCause().getMessage();
246 HEAVYDBLOGGER.error(msg);
247 throw new InvalidParseRequest(-3, msg);
248 }
catch (CalciteContextException ex) {
249 String msg = ex.getMessage();
250 HEAVYDBLOGGER.error(msg);
251 throw new InvalidParseRequest(-6, msg);
252 }
catch (RelConversionException ex) {
253 String msg =
"Failed to generate relational algebra for query " + ex.getMessage();
254 HEAVYDBLOGGER.error(msg, ex);
255 throw new InvalidParseRequest(-5, msg);
256 }
catch (Throwable ex) {
257 HEAVYDBLOGGER.error(ex.getClass().
toString());
258 String msg = ex.getMessage();
259 HEAVYDBLOGGER.error(msg, ex);
260 throw new InvalidParseRequest(-4, msg);
262 CURRENT_PARSER.set(null);
265 parserPool.returnObject(
parser);
266 }
catch (Exception ex) {
267 String msg =
"Could not return parse object: " + ex.getMessage();
268 HEAVYDBLOGGER.error(msg, ex);
269 throw new InvalidParseRequest(-7, msg);
273 TPlanResult
result =
new TPlanResult();
274 result.primary_accessed_objects = primaryAccessedObjects;
275 result.resolved_accessed_objects = resolvedAccessedObjects;
276 result.plan_result = jsonResult;
277 result.execution_time_ms = System.currentTimeMillis() - timer;
final GenericObjectPool parserPool
std::string toString(const ExecutorDeviceType &device_type)