@@ -210,6 +210,9 @@ CTranslatorQueryToDXL::CTranslatorQueryToDXL(
210210 }
211211 }
212212
213+ // check if query has insert/update/delete when is_master_only is true.
214+ CheckUnsupportedDDLInSingleMode (m_mp, query);
215+
213216 // check if the query has any unsupported node types
214217 CheckUnsupportedNodeTypes (query);
215218
@@ -280,6 +283,50 @@ CTranslatorQueryToDXL::~CTranslatorQueryToDXL()
280283 }
281284}
282285
286+ // ---------------------------------------------------------------------------
287+ // @function:
288+ // CTranslatorQueryToDXL::CheckUnsupportedNodeTypes
289+ //
290+ // @doc:
291+ // Check for unsupported node types, and throws an exception when found
292+ //
293+ // ---------------------------------------------------------------------------
294+ void
295+ CTranslatorQueryToDXL::CheckUnsupportedDDLInSingleMode (CMemoryPool *mp, Query *query)
296+ {
297+ static const SUnsupportedFeature unsupported_features[] = {
298+ {T_SubLink, GPOS_WSZ_LIT (" Sublink" )},
299+ {T_SubqueryScan, GPOS_WSZ_LIT (" Subscan" )},
300+ };
301+
302+ List *unsupported_list = NIL;
303+ for (ULONG ul = 0 ; ul < GPOS_ARRAY_SIZE (unsupported_features); ul++)
304+ {
305+ unsupported_list = gpdb::LAppendInt (unsupported_list,
306+ unsupported_features[ul].node_tag );
307+ }
308+
309+ INT unsupported_node = gpdb::FindNodes ((Node *) query, unsupported_list);
310+ gpdb::GPDBFree (unsupported_list);
311+
312+ if (GPOS_FTRACE (EopttraceSingleNodeMode) || GPOS_FTRACE (EopttraceDisableMotions)) {
313+ if (query->commandType == CMD_INSERT || query->commandType == CMD_UPDATE ||
314+ query->commandType == CMD_DELETE) {
315+ GPOS_RAISE (gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature,
316+ GPOS_WSZ_LIT (" Single-mode not support insert/update/delete" ));
317+ }
318+
319+ if (0 <= unsupported_node) {
320+ CWStringDynamic error_message (mp);
321+ error_message.AppendFormat (GPOS_WSZ_LIT (" Single-mode not support %s" ),
322+ unsupported_features[unsupported_node].m_feature_name );
323+
324+ GPOS_RAISE (gpdxl::ExmaDXL, gpdxl::ExmiQuery2DXLUnsupportedFeature,
325+ error_message.GetBuffer ());
326+ }
327+ }
328+ }
329+
283330// ---------------------------------------------------------------------------
284331// @function:
285332// CTranslatorQueryToDXL::CheckUnsupportedNodeTypes
0 commit comments