@@ -8973,6 +8973,18 @@ void HandleMysqlOptimize ( RowBuffer_i & tOut, const SqlStmt_t & tStmt )
8973
8973
tOut.Ok ();
8974
8974
}
8975
8975
8976
+ static CSphString GetLastInsertId ( const ClientSession_c * pSession )
8977
+ {
8978
+ StringBuilder_c sBuf ( "," );
8979
+
8980
+ if ( pSession->m_dLastIds.IsEmpty() )
8981
+ sBuf << 0;
8982
+ else
8983
+ pSession->m_dLastIds.Apply ( [&sBuf] ( int64_t iID ) { sBuf << iID; } );
8984
+
8985
+ return CSphString ( sBuf );
8986
+ }
8987
+
8976
8988
class ExtraLastInsertID_c final: public ISphExtra
8977
8989
{
8978
8990
bool ExtraDataImpl ( ExtraData_e eCmd, void** pData ) final
@@ -8982,9 +8994,7 @@ class ExtraLastInsertID_c final: public ISphExtra
8982
8994
8983
8995
auto* sVal = (CSphString*)pData;
8984
8996
assert ( sVal );
8985
- StringBuilder_c tBuf ( "," );
8986
- session::Info().GetClientSession()->m_dLastIds.for_each ( [&tBuf] ( auto& iId ) { tBuf << iId; } );
8987
- tBuf.MoveTo ( *sVal );
8997
+ *sVal = GetLastInsertId ( session::Info().GetClientSession() );
8988
8998
return true;
8989
8999
}
8990
9000
};
@@ -9001,27 +9011,20 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
9001
9011
std::function<CSphString ( void )> m_fnValue;
9002
9012
};
9003
9013
9004
- const bool bHasBuddy = HasBuddy();
9005
- const SysVar_t tDefaultStr { MYSQL_COL_STRING, nullptr, [] { return "<empty>"; } };
9006
- const SysVar_t tDefaultNum { MYSQL_COL_LONG, nullptr, [] { return "0"; } };
9007
-
9008
9014
const SysVar_t dSysvars[] =
9009
- { bHasBuddy ? tDefaultNum : tDefaultStr, // stub
9015
+ {
9016
+ { MYSQL_COL_STRING, nullptr, [] { return "<empty>"; } }, // stub
9010
9017
{ MYSQL_COL_LONG, "@@session.auto_increment_increment", [] {return "1";}},
9011
9018
{ MYSQL_COL_STRING, "@@character_set_client", [] {return "utf8";}},
9012
9019
{ MYSQL_COL_STRING, "@@character_set_connection", [] {return "utf8";}},
9013
9020
{ MYSQL_COL_LONG, "@@max_allowed_packet", [] { StringBuilder_c s; s << g_iMaxPacketSize; return CSphString(s); }},
9014
9021
{ MYSQL_COL_STRING, "@@version_comment", [] { return szGIT_BRANCH_ID;}},
9015
9022
{ MYSQL_COL_LONG, "@@lower_case_table_names", [] { return "1"; }},
9016
- { MYSQL_COL_STRING, "@@session.last_insert_id", [pSession] {
9017
- StringBuilder_c s ( "," );
9018
- pSession->m_dLastIds.Apply ( [&s] ( int64_t iID ) { s << iID; } );
9019
- return CSphString ( s );
9020
- }},
9023
+ { MYSQL_COL_STRING, "@@session.last_insert_id", [pSession] { return GetLastInsertId ( pSession ); } },
9021
9024
{ MYSQL_COL_LONG, "@@autocommit", [pSession] { return pSession->m_bAutoCommit ? "1" : "0"; } },
9022
9025
};
9023
9026
9024
- auto VarIdxByName = [&dSysvars] ( const CSphString& sName ) noexcept -> int
9027
+ auto fnVarIdxByName = [&dSysvars] ( const CSphString& sName ) noexcept -> int
9025
9028
{
9026
9029
constexpr auto iSysvars = sizeof ( dSysvars ) / sizeof ( dSysvars[0] );
9027
9030
for ( int i = 1; i<(int)iSysvars; ++i )
@@ -9043,36 +9046,46 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
9043
9046
9044
9047
CSphVector<PreparedItem_t> dColumns;
9045
9048
9049
+ const bool bHasBuddy = HasBuddy();
9046
9050
bool bHaveValidExpressions = false; // whether we have at least one expression among @@sysvars
9047
9051
bool bHaveInvalidExpressions = false; // whether at least one expression is erroneous
9048
9052
9049
- for ( const auto& dItem : dItems )
9053
+ for ( const auto & tItem : dItems )
9050
9054
{
9051
- bool bIsExpr = !dItem.m_sExpr.Begins ( "@@" );
9052
9055
CSphString sError;
9053
- auto iVar = VarIdxByName ( dItem .m_sExpr );
9056
+ auto iVar = fnVarIdxByName ( tItem .m_sExpr );
9054
9057
if ( !iVar )
9055
9058
{
9056
- CSphString sVar = dItem .m_sExpr;
9059
+ CSphString sVar = tItem .m_sExpr;
9057
9060
CSphSchema tSchema;
9058
9061
ESphAttr eAttrType;
9059
9062
ExprParseArgs_t tExprArgs;
9060
9063
tExprArgs.m_pAttrType = &eAttrType;
9061
9064
ISphExprRefPtr_c pExpr { sphExprParse ( sVar.cstr(), tSchema, nullptr, sError, tExprArgs ) };
9062
9065
if ( pExpr )
9063
9066
{
9064
- dColumns.Add ( { eAttrType, ESphAttr2MysqlColumn ( eAttrType ), pExpr, -1, dItem .m_sAlias.cstr() } );
9067
+ dColumns.Add ( { eAttrType, ESphAttr2MysqlColumn ( eAttrType ), pExpr, -1, tItem .m_sAlias.cstr() } );
9065
9068
bHaveValidExpressions = true;
9066
9069
continue;
9067
9070
}
9068
- bHaveInvalidExpressions |= bIsExpr;
9071
+
9072
+ // failure:
9073
+ // - if a buddy exists and any unknown sysvar is requested
9074
+ // - if no buddy exists and a non-sysvar is requested or the expression parser failed
9075
+ bool bSysVar = tItem.m_sExpr.Begins ( "@@" );
9076
+ if ( bSysVar && bHasBuddy )
9077
+ {
9078
+ sError.SetSprintf ( "unknown sysvar %s", tItem.m_sExpr.cstr() );
9079
+ bHaveInvalidExpressions = true;
9080
+ } else if ( !bSysVar )
9081
+ bHaveInvalidExpressions = true;
9069
9082
}
9070
- dColumns.Add ( { SPH_ATTR_NONE, dSysvars[iVar].m_eType, nullptr, iVar, dItem .m_sAlias.cstr(), sError } );
9083
+ dColumns.Add ( { SPH_ATTR_NONE, dSysvars[iVar].m_eType, nullptr, iVar, tItem .m_sAlias.cstr(), sError } );
9071
9084
}
9072
9085
9073
9086
assert ( dColumns.GetLength() == dItems.GetLength() );
9074
9087
9075
- // fail when we have error(s) in expression(s).
9088
+ // fail when we have error in expression or any unknown sysvar - buddy should handle that
9076
9089
if ( bHaveInvalidExpressions )
9077
9090
{
9078
9091
StringBuilder_c sError ("; ");
@@ -9237,12 +9250,7 @@ void HandleMysqlShowVariables ( RowBuffer_i & dRows, const SqlStmt_t & tStmt )
9237
9250
dTable.MatchTuplet ( "character_set_connection", "utf8" );
9238
9251
dTable.MatchTuplet ( "grouping_in_utc", GetGroupingInUTC() ? "1" : "0" );
9239
9252
dTable.MatchTuplet ( "timezone", GetTimeZoneName().cstr() );
9240
- dTable.MatchTupletFn ( "last_insert_id" , [&pVars]
9241
- {
9242
- StringBuilder_c tBuf ( "," );
9243
- pVars->m_dLastIds.Apply ( [&tBuf] ( int64_t iID ) { tBuf << iID; } );
9244
- return tBuf;
9245
- });
9253
+ dTable.MatchTupletFn ( "last_insert_id" , [&pVars] { return GetLastInsertId ( pVars ); } );
9246
9254
}
9247
9255
dTable.MatchTuplet ( "pseudo_sharding", GetPseudoSharding() ? "1" : "0" );
9248
9256
0 commit comments