Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions .translation-cache/Searching/Joining.md.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion manual/chinese/Searching/Joining.md
Original file line number Diff line number Diff line change
Expand Up @@ -996,9 +996,11 @@ POST /search

在 Manticore Search 中使用 JOIN 时,请记住以下几点:

1. **字段选择**:在 JOIN 中选择两个表的字段时,不要为左表的字段添加前缀,但需要为右表的字段添加前缀。例如:
1. **字段选择**:在 JOIN 中从两个表选择字段时,右表的字段需以表名作为前缀。左表的字段可以使用或不使用表名前缀。例如:
```sql
SELECT field_name, right_table.field_name FROM ...
-- or with left table prefix:
SELECT left_table.field_name, right_table.field_name FROM ...
```

2. **JOIN 条件**:始终在 JOIN 条件中明确指定表名:
Expand Down
4 changes: 3 additions & 1 deletion manual/english/Searching/Joining.md
Original file line number Diff line number Diff line change
Expand Up @@ -996,9 +996,11 @@ Distributed tables consisting only of local tables are supported on both the lef

When using JOINs in Manticore Search, keep the following points in mind:

1. **Field selection**: When selecting fields from two tables in a JOIN, do not prefix fields from the left table, but do prefix fields from the right table. For example:
1. **Field selection**: When selecting fields from two tables in a JOIN, prefix fields from the right table with the table name. Left table fields can be used with or without the table prefix. For example:
```sql
SELECT field_name, right_table.field_name FROM ...
-- or with left table prefix:
SELECT left_table.field_name, right_table.field_name FROM ...
```

2. **JOIN conditions**: Always explicitly specify the table names in your JOIN conditions:
Expand Down
4 changes: 3 additions & 1 deletion manual/russian/Searching/Joining.md
Original file line number Diff line number Diff line change
Expand Up @@ -996,9 +996,11 @@ POST /search

При использовании JOIN в Manticore Search учитывайте следующие моменты:

1. **Выбор полей**: При выборе полей из двух таблиц в JOIN не используйте префикс для полей из левой таблицы, но используйте префикс для полей из правой таблицы. Например:
1. **Выбор полей**: При выборе полей из двух таблиц в JOIN добавляйте префикс имени таблицы к полям из правой таблицы. Поля левой таблицы можно использовать как с префиксом таблицы, так и без него. Например:
```sql
SELECT field_name, right_table.field_name FROM ...
-- or with left table prefix:
SELECT left_table.field_name, right_table.field_name FROM ...
```

2. **Условия JOIN**: Всегда явно указывайте имена таблиц в ваших условиях JOIN:
Expand Down
2 changes: 1 addition & 1 deletion src/gtests/gtests_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2115,7 +2115,7 @@ TEST ( functions, histogram_expression )

CSphString sError;
ExprParseArgs_t tExprArgs;
ISphExprRefPtr_c pExpr ( sphExprParse ( "histogram(price*100, {hist_interval=1})", tSchema, nullptr, sError, tExprArgs ) );
ISphExprRefPtr_c pExpr ( sphExprParse ( "histogram(price*100, {hist_interval=1})", tSchema, sError, tExprArgs ) );
ASSERT_TRUE ( pExpr.Ptr () ) << sError.cstr();

sphSetRowAttr ( pRow, tSchema.GetAttr(0).m_tLocator, sphF2DW ( 0.5f ) );
Expand Down
4 changes: 2 additions & 2 deletions src/gtests/gtests_text.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ TEST ( Text, expression_parser )
{
CSphString sError;
ExprParseArgs_t tExprArgs;
ISphExprRefPtr_c pExpr ( sphExprParse ( dTest.m_sExpr, tSchema, nullptr, sError, tExprArgs ) );
ISphExprRefPtr_c pExpr ( sphExprParse ( dTest.m_sExpr, tSchema, sError, tExprArgs ) );
ASSERT_TRUE ( pExpr.Ptr () ) << "parsing " << dTest.m_sExpr << ":" << sError.cstr ();
ASSERT_FLOAT_EQ ( dTest.m_fValue, pExpr->Eval ( tMatch ) );
}
Expand Down Expand Up @@ -511,7 +511,7 @@ TEST ( Text, expression_parser_many )
{
CSphString sError;
ExprParseArgs_t tExprArgs;
ISphExprRefPtr_c pExpr ( sphExprParse ( sTest.cstr (), tSchema, nullptr, sError, tExprArgs ) );
ISphExprRefPtr_c pExpr ( sphExprParse ( sTest.cstr (), tSchema, sError, tExprArgs ) );
ASSERT_TRUE ( pExpr.Ptr () ) << sError.cstr () << ": " << sTest.cstr();
}

Expand Down
8 changes: 4 additions & 4 deletions src/joinsorter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1686,12 +1686,11 @@ bool JoinSorter_c::ValidateLeftTableNotPrefixedInFilters ( CSphString & sError )
sLeftPrefix.SetSprintf ( "%s.", sLeftTableName.cstr() );
ARRAY_FOREACH ( i, m_tQuery.m_dFilters )
{
const auto & tFilter = m_tQuery.m_dFilters[i];
auto & tFilter = m_tQuery.m_dFilters[i];
if ( tFilter.m_sAttrName.Begins ( sLeftPrefix.cstr() ) )
{
CSphString sAttrName = tFilter.m_sAttrName.SubString ( sLeftPrefix.Length(), tFilter.m_sAttrName.Length() - sLeftPrefix.Length() );
sError.SetSprintf ( "table %s: unknown column: %s (do not prefix left table attributes in JOIN queries, use '%s' instead of '%s')", sLeftTableName.cstr(), sAttrName.cstr(), sAttrName.cstr(), tFilter.m_sAttrName.cstr() );
return false;
// Allow left table prefix: strip it so the rest of the pipeline sees bare attribute names
tFilter.m_sAttrName = tFilter.m_sAttrName.SubString ( sLeftPrefix.Length(), tFilter.m_sAttrName.Length() - sLeftPrefix.Length() );
}
}

Expand All @@ -1716,6 +1715,7 @@ bool JoinSorter_c::SetupRightFilters ( CSphString & sError )
tCtx.m_pIndexSchema = &m_pIndex->GetMatchSchema();
tCtx.m_bScan = m_tQuery.m_sQuery.IsEmpty();
tCtx.m_sJoinIdx = GetJoinedIndexName();
tCtx.m_sJoinIdxLeft = m_pIndex->GetName();
tCtx.m_eJoinType = m_tQuery.m_eJoinType;
if ( !sphCreateFilters ( tCtx, sError, sError ) )
{
Expand Down
58 changes: 50 additions & 8 deletions src/queuecreator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,13 @@ void QueueCreator_c::CreateGrouperByAttr ( ESphAttr eType, const CSphColumnInfo
{
ExprParseArgs_t tExprArgs;
tExprArgs.m_eCollation = m_tQuery.m_eCollation;
if ( m_tSettings.m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}

ISphExprRefPtr_c pExpr { sphExprParse ( m_tQuery.m_sGroupBy.cstr(), tSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprArgs ) };
ISphExprRefPtr_c pExpr { sphExprParse ( m_tQuery.m_sGroupBy.cstr(), tSchema, m_sError, tExprArgs ) };
m_tGroupSorterSettings.m_pGrouper = CreateGrouperJsonField ( tLoc, pExpr );
m_tGroupSorterSettings.m_bJson = true;
}
Expand Down Expand Up @@ -586,7 +591,12 @@ bool QueueCreator_c::SetupGroupbySettings ( bool bHasImplicitGrouping )
if ( !sJsonExpr.IsEmpty() )
{
ExprParseArgs_t tExprArgs;
dJsonKeys.Add ( sphExprParse ( sJsonExpr.cstr(), tSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprArgs ) );
if ( m_tSettings.m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}
dJsonKeys.Add ( sphExprParse ( sJsonExpr.cstr(), tSchema, m_sError, tExprArgs ) );
}
else if ( tAttr.m_eAttrType==SPH_ATTR_JSON_FIELD )
{
Expand Down Expand Up @@ -623,8 +633,13 @@ bool QueueCreator_c::SetupGroupbySettings ( bool bHasImplicitGrouping )

ExprParseArgs_t tExprArgs;
tExprArgs.m_eCollation = m_tQuery.m_eCollation;
if ( m_tSettings.m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}

ISphExprRefPtr_c pExpr { sphExprParse ( m_tQuery.m_sGroupBy.cstr(), tSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprArgs ) };
ISphExprRefPtr_c pExpr { sphExprParse ( m_tQuery.m_sGroupBy.cstr(), tSchema, m_sError, tExprArgs ) };
m_tGroupSorterSettings.m_pGrouper = CreateGrouperJsonField ( tSchema.GetAttr(iAttr).m_tLocator, pExpr );
m_tGroupSorterSettings.m_bJson = true;
m_bJoinedGroupSort |= IsJoinAttr(sJsonColumn);
Expand Down Expand Up @@ -1124,10 +1139,22 @@ bool QueueCreator_c::ParseQueryItem ( const CSphQueryItem & tItem )
{
CSphString sExpr2;
sExpr2.SetSprintf ( "TO_STRING(%s)", sExpr.cstr() );
tExprCol.m_pExpr = sphExprParse ( sExpr2.cstr(), *m_pSorterSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprParseArgs );
if ( m_tSettings.m_pJoinArgs )
{
tExprParseArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprParseArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}
tExprCol.m_pExpr = sphExprParse ( sExpr2.cstr(), *m_pSorterSchema, m_sError, tExprParseArgs );
}
else
tExprCol.m_pExpr = sphExprParse ( sExpr.cstr(), *m_pSorterSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprParseArgs );
{
if ( m_tSettings.m_pJoinArgs )
{
tExprParseArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprParseArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}
tExprCol.m_pExpr = sphExprParse ( sExpr.cstr(), *m_pSorterSchema, m_sError, tExprParseArgs );
}

m_uPackedFactorFlags |= uQueryPackedFactorFlags;
m_bZonespanlist |= bHasZonespanlist;
Expand Down Expand Up @@ -1264,8 +1291,13 @@ bool QueueCreator_c::MaybeAddExprColumn ()
tExprArgs.m_pProfiler = m_tSettings.m_pProfiler;
tExprArgs.m_eCollation = m_tQuery.m_eCollation;
tExprArgs.m_pZonespanlist = &bHasZonespanlist;
if ( m_tSettings.m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}

tCol.m_pExpr = sphExprParse ( m_tQuery.m_sSortBy.cstr (), *m_pSorterSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprArgs );
tCol.m_pExpr = sphExprParse ( m_tQuery.m_sSortBy.cstr (), *m_pSorterSchema, m_sError, tExprArgs );
if ( !tCol.m_pExpr )
return false;

Expand Down Expand Up @@ -1460,7 +1492,12 @@ void QueueCreator_c::ReplaceJsonGroupbyWithStrings ( CSphString & sJsonGroupBy )
if ( !sJsonExpr.IsEmpty() )
{
ExprParseArgs_t tExprArgs;
dJsonKeys.Add ( sphExprParse ( sJsonExpr.cstr(), *m_pSorterSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprArgs ) );
if ( m_tSettings.m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}
dJsonKeys.Add ( sphExprParse ( sJsonExpr.cstr(), *m_pSorterSchema, m_sError, tExprArgs ) );
}
else
dJsonKeys.Add(nullptr);
Expand Down Expand Up @@ -1655,8 +1692,13 @@ bool QueueCreator_c::ParseJoinExpr ( CSphColumnInfo & tExprCol, const CSphString
tExprParseArgs.m_pAttrType = &tExprCol.m_eAttrType;
tExprParseArgs.m_pProfiler = m_tSettings.m_pProfiler;
tExprParseArgs.m_eCollation = m_tQuery.m_eCollation;
if ( m_tSettings.m_pJoinArgs )
{
tExprParseArgs.m_pJoinIdx = &m_tSettings.m_pJoinArgs->m_sIndex2;
tExprParseArgs.m_pJoinIdxLeft = &m_tSettings.m_pJoinArgs->m_sIndex1;
}
tExprCol.m_eStage = SPH_EVAL_PRESORT;
tExprCol.m_pExpr = sphExprParse ( sExpr.cstr(), *m_pSorterSchema, m_tSettings.m_pJoinArgs ? &(m_tSettings.m_pJoinArgs->m_sIndex2) : nullptr, m_sError, tExprParseArgs );
tExprCol.m_pExpr = sphExprParse ( sExpr.cstr(), *m_pSorterSchema, m_sError, tExprParseArgs );
tExprCol.m_uAttrFlags |= CSphColumnInfo::ATTR_JOINED;
return !!tExprCol.m_pExpr;
}
Expand Down
4 changes: 2 additions & 2 deletions src/schematransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ void TransformedSchemaBuilder_c::ReplaceColumnarAttrWithExpression ( CSphColumnI
// parse expression as if it is not columnar
CSphString sError;
ExprParseArgs_t tExprArgs;
tAttr.m_pExpr = sphExprParse ( tAttr.m_sName.cstr(), m_tNewSchema, nullptr, sError, tExprArgs );
tAttr.m_pExpr = sphExprParse ( tAttr.m_sName.cstr(), m_tNewSchema, sError, tExprArgs );
assert ( tAttr.m_pExpr );

// now remove it from schema (it will be added later with the supplied expression)
Expand Down Expand Up @@ -310,7 +310,7 @@ void MatchesToNewSchema_c::SetupAction ( const CSphColumnInfo & tOld, const CSph
{
CSphString sError;
ExprParseArgs_t tExprArgs;
tAction.m_pExpr = sphExprParse ( tOld.m_sName.cstr(), *pOldSchema, nullptr, sError, tExprArgs );
tAction.m_pExpr = sphExprParse ( tOld.m_sName.cstr(), *pOldSchema, sError, tExprArgs );
assert ( tAction.m_pExpr );

switch ( tNew.m_eAttrType )
Expand Down
4 changes: 2 additions & 2 deletions src/searchd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7712,7 +7712,7 @@ static void ReturnZeroCount ( const CSphSchema & tSchema, const CSphBitvec & tAt
CSphString sError;
ExprParseArgs_t tExprArgs;
tExprArgs.m_pAttrType = &eAttrType;
ISphExprRefPtr_c pExpr { sphExprParse ( tCol.m_sName.cstr(), tSchema, nullptr, sError, tExprArgs )};
ISphExprRefPtr_c pExpr { sphExprParse ( tCol.m_sName.cstr(), tSchema, sError, tExprArgs )};

if ( !pExpr || !pExpr->IsConst() )
eAttrType = SPH_ATTR_NONE;
Expand Down Expand Up @@ -9503,7 +9503,7 @@ void HandleMysqlSelectColumns ( RowBuffer_i & tOut, const SqlStmt_t & tStmt, Cli
ESphAttr eAttrType;
ExprParseArgs_t tExprArgs;
tExprArgs.m_pAttrType = &eAttrType;
ISphExprRefPtr_c pExpr { sphExprParse ( sVar.cstr(), tSchema, nullptr, sError, tExprArgs ) };
ISphExprRefPtr_c pExpr { sphExprParse ( sVar.cstr(), tSchema, sError, tExprArgs ) };
if ( pExpr )
{
dColumns.Add ( { eAttrType, ESphAttr2MysqlColumn ( eAttrType ), pExpr, -1, tItem.m_sAlias.cstr() } );
Expand Down
2 changes: 1 addition & 1 deletion src/searchdsql.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2716,7 +2716,7 @@ bool PercolateParseFilters ( const char * sFilters, ESphCollation eCollation, co
ExprParseArgs_t tExprArgs;
tExprArgs.m_pAttrType = &eAttrType;
tExprArgs.m_eCollation = eCollation;
ISphExprRefPtr_c pExpr { sphExprParse ( sFilters, tSchema, nullptr, sError, tExprArgs ) };
ISphExprRefPtr_c pExpr { sphExprParse ( sFilters, tSchema, sError, tExprArgs ) };
if ( pExpr )
{
sError = "";
Expand Down
21 changes: 18 additions & 3 deletions src/sortsetup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,12 @@ bool SortStateSetup_c::SetupJsonField ( CSphString & sError )
if ( m_iAttr>=0 )
{
ExprParseArgs_t tExprArgs;
ISphExpr * pExpr = sphExprParse ( m_szTok, m_tSchema, m_pJoinArgs ? &(m_pJoinArgs->m_sIndex2) : nullptr, sError, tExprArgs );
if ( m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_pJoinArgs->m_sIndex1;
}
ISphExpr * pExpr = sphExprParse ( m_szTok, m_tSchema, sError, tExprArgs );
if ( !pExpr )
return false;

Expand All @@ -362,7 +367,12 @@ bool SortStateSetup_c::SetupColumnar ( CSphString & sError )

ExprParseArgs_t tExprArgs;
tExprArgs.m_pAttrType = &m_eAttrType;
ISphExpr * pExpr = sphExprParse ( m_szTok, m_tSchema, m_pJoinArgs ? &(m_pJoinArgs->m_sIndex2) : nullptr, sError, tExprArgs );
if ( m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_pJoinArgs->m_sIndex1;
}
ISphExpr * pExpr = sphExprParse ( m_szTok, m_tSchema, sError, tExprArgs );
if ( !pExpr )
return false;

Expand Down Expand Up @@ -398,7 +408,12 @@ void SortStateSetup_c::SetupJsonConversions()
ExprParseArgs_t tExprArgs;
tExprArgs.m_pAttrType = &eAttrType;
CSphString sError; // ignored
ISphExpr * pExpr = sphExprParse ( m_szTok, m_tSchema, m_pJoinArgs ? &(m_pJoinArgs->m_sIndex2) : nullptr, sError, tExprArgs );
if ( m_pJoinArgs )
{
tExprArgs.m_pJoinIdx = &m_pJoinArgs->m_sIndex2;
tExprArgs.m_pJoinIdxLeft = &m_pJoinArgs->m_sIndex1;
}
ISphExpr * pExpr = sphExprParse ( m_szTok, m_tSchema, sError, tExprArgs );
if ( !pExpr )
return;

Expand Down
2 changes: 1 addition & 1 deletion src/sphinx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,7 @@ void UpdateContext_t::PrepareListOfUpdatedAttributes ( CSphString & sError )
if ( iUpdAttrId>=0 )
{
ExprParseArgs_t tExprArgs;
tUpdAttr.m_pExpr = sphExprParse ( sUpdAttrName.cstr(), m_tSchema, nullptr, sError, tExprArgs );
tUpdAttr.m_pExpr = sphExprParse ( sUpdAttrName.cstr(), m_tSchema, sError, tExprArgs );
}
}
}
Expand Down
23 changes: 15 additions & 8 deletions src/sphinxexpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4264,7 +4264,7 @@ class ExprParser_t
}

~ExprParser_t ();
ISphExpr * Parse ( const char * szExpr, const ISphSchema & tSchema, const CSphString * pJoinIdx, ESphAttr * pAttrType, bool * pUsesWeight, CSphString & sError );
ISphExpr * Parse ( const char * szExpr, const ISphSchema & tSchema, const CSphString * pJoinIdx, const CSphString * pJoinIdxLeft, ESphAttr * pAttrType, bool * pUsesWeight, CSphString & sError );

protected:
int m_iParsed = 0; ///< filled by yyparse() at the very end
Expand Down Expand Up @@ -4319,7 +4319,8 @@ class ExprParser_t
void * m_pScanner = nullptr;
Str_t m_sExpr;
const ISphSchema * m_pSchema = nullptr;
const CSphString * m_pJoinIdx = nullptr;
const CSphString * m_pJoinIdx = nullptr; ///< right table name in JOIN
const CSphString * m_pJoinIdxLeft = nullptr; ///< left table name in JOIN
CSphVector<ExprNode_t> m_dNodes;
StrVec_t m_dUservars;
CSphVector<char*> m_dIdents;
Expand Down Expand Up @@ -4707,8 +4708,8 @@ int ExprParser_t::ProcessRawToken ( const char * sToken, int iLen, YYSTYPE * lva
return iRes;
}

// check for table name
if ( m_pJoinIdx && *m_pJoinIdx==sTok )
// check for table name (left or right in JOIN)
if ( ( m_pJoinIdxLeft && *m_pJoinIdxLeft==sTok ) || ( m_pJoinIdx && *m_pJoinIdx==sTok ) )
{
CSphString sTokMixed { sToken, iLen };
m_dIdents.Add ( sTokMixed.Leak() );
Expand Down Expand Up @@ -10580,8 +10581,13 @@ int ExprParser_t::ParseJoinAttr ( const char * szTable, uint64_t uOffset )
CSphString sAttrName;
sAttrName.SetBinary ( m_sExpr.first + GetConstStrOffset(uOffset), GetConstStrLength(uOffset) );

// Left table columns are stored in schema without prefix; right table with "right.attr"
CSphString sAttrWithTable;
sAttrWithTable.SetSprintf ( "%s.%s", szTable, sAttrName.cstr() );
if ( m_pJoinIdxLeft && *m_pJoinIdxLeft==szTable )
sAttrWithTable = sAttrName;
else
sAttrWithTable.SetSprintf ( "%s.%s", szTable, sAttrName.cstr() );

int iAttr = m_pSchema->GetAttrIndex ( sAttrWithTable.cstr() );
if ( iAttr==-1 )
m_sParserError.SetSprintf ( "unknown attribute '%s'", sAttrWithTable.cstr() );
Expand Down Expand Up @@ -10769,7 +10775,7 @@ void SetMaxExprNodeEvalStackItemSize ( std::pair<int, int> tSize )
}


ISphExpr * ExprParser_t::Parse ( const char * sExpr, const ISphSchema & tSchema, const CSphString * pJoinIdx, ESphAttr * pAttrType, bool * pUsesWeight, CSphString & sError )
ISphExpr * ExprParser_t::Parse ( const char * sExpr, const ISphSchema & tSchema, const CSphString * pJoinIdx, const CSphString * pJoinIdxLeft, ESphAttr * pAttrType, bool * pUsesWeight, CSphString & sError )
{
const char* szExpr = sExpr;

Expand All @@ -10784,6 +10790,7 @@ ISphExpr * ExprParser_t::Parse ( const char * sExpr, const ISphSchema & tSchema,
m_sExpr = { szExpr, (int)strlen (szExpr) };
m_pSchema = &tSchema;
m_pJoinIdx = pJoinIdx;
m_pJoinIdxLeft = pJoinIdxLeft;

// setup constant functions
m_iConstNow = (int) time ( nullptr );
Expand Down Expand Up @@ -10948,11 +10955,11 @@ JoinArgs_t::JoinArgs_t ( const ISphSchema & tJoinedSchema, const CSphString & sI
{}

/// parser entry point
ISphExpr * sphExprParse ( const char * szExpr, const ISphSchema & tSchema, const CSphString * pJoinIdx, CSphString & sError, ExprParseArgs_t & tArgs )
ISphExpr * sphExprParse ( const char * szExpr, const ISphSchema & tSchema, CSphString & sError, ExprParseArgs_t & tArgs )
{
// parse into opcodes
ExprParser_t tParser ( tArgs.m_pHook, tArgs.m_pProfiler, tArgs.m_eCollation );
ISphExpr * pRes = tParser.Parse ( szExpr, tSchema, pJoinIdx, tArgs.m_pAttrType, tArgs.m_pUsesWeight, sError );
ISphExpr * pRes = tParser.Parse ( szExpr, tSchema, tArgs.m_pJoinIdx, tArgs.m_pJoinIdxLeft, tArgs.m_pAttrType, tArgs.m_pUsesWeight, sError );
if ( tArgs.m_pZonespanlist )
*tArgs.m_pZonespanlist = tParser.m_bHasZonespanlist;
if ( tArgs.m_pEvalStage )
Expand Down
4 changes: 3 additions & 1 deletion src/sphinxexpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,8 @@ struct ExprParseArgs_t
ESphEvalStage * m_pEvalStage = nullptr;
DWORD * m_pStoredField = nullptr;
bool * m_pNeedDocIds = nullptr;
const CSphString * m_pJoinIdx = nullptr;
const CSphString * m_pJoinIdxLeft = nullptr;
};

struct JoinArgs_t
Expand All @@ -375,7 +377,7 @@ class AttrDependencyMap_c
};

struct CommonFilterSettings_t;
ISphExpr * sphExprParse ( const char * szExpr, const ISphSchema & tSchema, const CSphString * pJoinIdx, CSphString & sError, ExprParseArgs_t & tArgs );
ISphExpr * sphExprParse ( const char * szExpr, const ISphSchema & tSchema, CSphString & sError, ExprParseArgs_t & tArgs );
ISphExpr * sphJsonFieldConv ( ISphExpr * pExpr );
ISphExpr * ExprJsonIn ( const VecTraits_T<CSphString> & dVals, ISphExpr * pArg, ESphCollation eCollation );
ISphExpr * ExprJsonIn ( const VecTraits_T<int64_t> & dVals, ISphExpr * pArg, ESphCollation eCollation );
Expand Down
Loading
Loading