Skip to content

Commit

Permalink
fixup to fromless select
Browse files Browse the repository at this point in the history
it is allowed to list absent variables (they will return '<empty>'), but
 not allowed to have an error in expressions. In this case all errors
 (if >1) will be glued together and returned as error packet.

Related issues: #3576, #3580

It changes behaviour of c437dcb

CHANGELOG: now you can use 'select' to make arbitrary calculations and
displaying @@sysvars (before you could use only one(!) calculation). So,
 queries like `select user(), database(), @@version_comment, version(),
 1+1 as a limit 10` will work and return all the columns.
 Optional 'limit' will always be ignored.
  • Loading branch information
klirichek committed Jun 8, 2023
1 parent 217e6b8 commit 3c84091
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions src/searchd.cpp
Expand Up @@ -15086,46 +15086,49 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
ISphExprRefPtr_c m_pExpr;
int m_iSysvarIdx;
const char* m_szAlias;
CSphString m_sError;
};

CSphVector<PreparedItem_t> dColumns;

bool bHaveExprs = false;
bool bHaveErrors = false;
bool bHaveValidExpressions = false; // whether we have at least one expression among @@sysvars
bool bHaveInvalidExpressions = false; // whether at least one expression is erroneous

for ( const auto& dItem : dItems )
{
bool bIsExpr = !dItem.m_sExpr.Begins ( "@@" );
CSphString sError;
auto iVar = VarIdxByName ( dItem.m_sExpr );
if ( !iVar )
{
CSphString sVar = dItem.m_sExpr;
CSphSchema tSchema;
ESphAttr eAttrType;
CSphString sError;
ExprParseArgs_t tExprArgs;
tExprArgs.m_pAttrType = &eAttrType;
ISphExprRefPtr_c pExpr { sphExprParse ( sVar.cstr(), tSchema, sError, tExprArgs ) };
if ( pExpr )
{
dColumns.Add ( { eAttrType, ESphAttr2MysqlColumn ( eAttrType ), pExpr, -1, dItem.m_sAlias.cstr() } );
bHaveExprs = true;
bHaveValidExpressions = true;
continue;
}
bHaveErrors = true;
bHaveInvalidExpressions |= bIsExpr;
}
dColumns.Add ( { SPH_ATTR_NONE, dSysvars[iVar].m_eType, nullptr, iVar, dItem.m_sAlias.cstr() } );
dColumns.Add ( { SPH_ATTR_NONE, dSysvars[iVar].m_eType, nullptr, iVar, dItem.m_sAlias.cstr(), sError } );
}

if ( bHaveErrors
&& HasBuddy()
)
assert ( dColumns.GetLength() == dItems.GetLength() );

// fail when we have error(s) in expression(s).
if ( bHaveInvalidExpressions )
{
tOut.ErrorEx ( tStmt.m_sStmt, "error in %s", tStmt.m_sStmt );
StringBuilder_c sError ("; ");
dColumns.for_each( [&sError] (const PreparedItem_t& dCol) { if ( !dCol.m_sError.IsEmpty()) sError << dCol.m_sError; });
tOut.ErrorEx ( tStmt.m_sStmt, sError.cstr() );
return;
}

assert ( dColumns.GetLength() == dItems.GetLength() );

// fill header
tOut.HeadBegin ( dColumns.GetLength() );
for ( const auto& dColumn : dColumns )
Expand All @@ -15134,7 +15137,7 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
if ( !tOut.HeadEnd() )
return;

if ( bHaveExprs )
if ( bHaveValidExpressions )
{
ExtraLastInsertID_c tIds;
for ( auto& pExpr : dColumns )
Expand Down

0 comments on commit 3c84091

Please sign in to comment.