Skip to content

Commit bfe857a

Browse files
authored
Merge a7c4d21 into bedf457
2 parents bedf457 + a7c4d21 commit bfe857a

File tree

2 files changed

+38
-30
lines changed

2 files changed

+38
-30
lines changed

src/searchd.cpp

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8973,6 +8973,18 @@ void HandleMysqlOptimize ( RowBuffer_i & tOut, const SqlStmt_t & tStmt )
89738973
tOut.Ok ();
89748974
}
89758975

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+
89768988
class ExtraLastInsertID_c final: public ISphExtra
89778989
{
89788990
bool ExtraDataImpl ( ExtraData_e eCmd, void** pData ) final
@@ -8982,9 +8994,7 @@ class ExtraLastInsertID_c final: public ISphExtra
89828994

89838995
auto* sVal = (CSphString*)pData;
89848996
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() );
89888998
return true;
89898999
}
89909000
};
@@ -9001,27 +9011,20 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
90019011
std::function<CSphString ( void )> m_fnValue;
90029012
};
90039013

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-
90089014
const SysVar_t dSysvars[] =
9009-
{ bHasBuddy ? tDefaultNum : tDefaultStr, // stub
9015+
{
9016+
{ MYSQL_COL_STRING, nullptr, [] { return "<empty>"; } }, // stub
90109017
{ MYSQL_COL_LONG, "@@session.auto_increment_increment", [] {return "1";}},
90119018
{ MYSQL_COL_STRING, "@@character_set_client", [] {return "utf8";}},
90129019
{ MYSQL_COL_STRING, "@@character_set_connection", [] {return "utf8";}},
90139020
{ MYSQL_COL_LONG, "@@max_allowed_packet", [] { StringBuilder_c s; s << g_iMaxPacketSize; return CSphString(s); }},
90149021
{ MYSQL_COL_STRING, "@@version_comment", [] { return szGIT_BRANCH_ID;}},
90159022
{ 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 ); } },
90219024
{ MYSQL_COL_LONG, "@@autocommit", [pSession] { return pSession->m_bAutoCommit ? "1" : "0"; } },
90229025
};
90239026

9024-
auto VarIdxByName = [&dSysvars] ( const CSphString& sName ) noexcept -> int
9027+
auto fnVarIdxByName = [&dSysvars] ( const CSphString& sName ) noexcept -> int
90259028
{
90269029
constexpr auto iSysvars = sizeof ( dSysvars ) / sizeof ( dSysvars[0] );
90279030
for ( int i = 1; i<(int)iSysvars; ++i )
@@ -9043,36 +9046,46 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
90439046

90449047
CSphVector<PreparedItem_t> dColumns;
90459048

9049+
const bool bHasBuddy = HasBuddy();
90469050
bool bHaveValidExpressions = false; // whether we have at least one expression among @@sysvars
90479051
bool bHaveInvalidExpressions = false; // whether at least one expression is erroneous
90489052

9049-
for ( const auto& dItem : dItems )
9053+
for ( const auto & tItem : dItems )
90509054
{
9051-
bool bIsExpr = !dItem.m_sExpr.Begins ( "@@" );
90529055
CSphString sError;
9053-
auto iVar = VarIdxByName ( dItem.m_sExpr );
9056+
auto iVar = fnVarIdxByName ( tItem.m_sExpr );
90549057
if ( !iVar )
90559058
{
9056-
CSphString sVar = dItem.m_sExpr;
9059+
CSphString sVar = tItem.m_sExpr;
90579060
CSphSchema tSchema;
90589061
ESphAttr eAttrType;
90599062
ExprParseArgs_t tExprArgs;
90609063
tExprArgs.m_pAttrType = &eAttrType;
90619064
ISphExprRefPtr_c pExpr { sphExprParse ( sVar.cstr(), tSchema, nullptr, sError, tExprArgs ) };
90629065
if ( pExpr )
90639066
{
9064-
dColumns.Add ( { eAttrType, ESphAttr2MysqlColumn ( eAttrType ), pExpr, -1, dItem.m_sAlias.cstr() } );
9067+
dColumns.Add ( { eAttrType, ESphAttr2MysqlColumn ( eAttrType ), pExpr, -1, tItem.m_sAlias.cstr() } );
90659068
bHaveValidExpressions = true;
90669069
continue;
90679070
}
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;
90699082
}
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 } );
90719084
}
90729085

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

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
90769089
if ( bHaveInvalidExpressions )
90779090
{
90789091
StringBuilder_c sError ("; ");
@@ -9237,12 +9250,7 @@ void HandleMysqlShowVariables ( RowBuffer_i & dRows, const SqlStmt_t & tStmt )
92379250
dTable.MatchTuplet ( "character_set_connection", "utf8" );
92389251
dTable.MatchTuplet ( "grouping_in_utc", GetGroupingInUTC() ? "1" : "0" );
92399252
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 ); } );
92469254
}
92479255
dTable.MatchTuplet ( "pseudo_sharding", GetPseudoSharding() ? "1" : "0" );
92489256

src/sphinxql.l

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,8 @@
4242
DIGIT [0-9]
4343
ALPHA [a-zA-Z_@]
4444
ALNUM [a-zA-Z_0-9]
45-
ALPHA_SYS [a-zA-Z_]
4645
ID {ALPHA}{ALNUM}*
47-
ID_SYS {ALPHA_SYS}{ALNUM}*
46+
ID_SYS {ALNUM}{ALNUM}*
4847
SPACE [ \t\n\r]
4948
SIGN [+-]?
5049
INT {DIGIT}+
@@ -244,6 +243,7 @@ FLOAT_CONSTANT {INT}\.{INT}?{EXP}?|{INT}?\.{INT}{EXP}|{INT}{EXP}
244243
{ID} { YYSTOREBOUNDS; return TOK_IDENT; }
245244
{ALNUM}+ { YYSTOREBOUNDS; return TOK_BAD_NUMERIC; }
246245
@@{ID_SYS} { YYSTOREBOUNDS; return TOK_SYSVAR; }
246+
@@`{ID_SYS}` { YYSTOREBOUNDS; return TOK_SYSVAR; }
247247
`{ID}` { YYSTOREBOUNDS; ++lvalp->m_iStart; --lvalp->m_iEnd; return TOK_IDENT; }
248248
`{ID}:{ID}` { YYSTOREBOUNDS; ++lvalp->m_iStart; --lvalp->m_iEnd; return TOK_IDENT; }
249249
`{INT}{ID}` { YYSTOREBOUNDS; return TOK_BACKIDENT; } // allow `123xyz` column names

0 commit comments

Comments
 (0)