SOLR-13414: SolrSchema - Avoid NPE if Luke returns field with no type defined

Signed-off-by: Kevin Risden <krisden@apache.org>
This commit is contained in:
Kevin Risden 2019-04-25 13:56:15 -04:00
parent ef79dd548d
commit 35aeb7f623
No known key found for this signature in database
GPG Key ID: 040FAE3292C5F73F
2 changed files with 11 additions and 5 deletions

View File

@ -311,6 +311,8 @@ Other Changes
* SOLR-13423: Upgrade RRD4j to version 3.5. (ab) * SOLR-13423: Upgrade RRD4j to version 3.5. (ab)
* SOLR-13414: SolrSchema - Avoid NPE if Luke returns field with no type defined (Kevin Risden)
================== 8.0.0 ================== ================== 8.0.0 ==================
Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release. Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

View File

@ -18,7 +18,6 @@ package org.apache.solr.handler.sql;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Properties; import java.util.Properties;
@ -39,7 +38,6 @@ import org.apache.solr.client.solrj.response.LukeResponse;
import org.apache.solr.common.cloud.Aliases; import org.apache.solr.common.cloud.Aliases;
import org.apache.solr.common.cloud.ClusterState; import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.ZkStateReader; import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.luke.FieldFlag;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@ -98,14 +96,20 @@ class SolrSchema extends AbstractSchema {
// because we're creating a proto-type, not a type; before being used, the // because we're creating a proto-type, not a type; before being used, the
// proto-type will be copied into a real type factory. // proto-type will be copied into a real type factory.
final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT); final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
final RelDataTypeFactory.FieldInfoBuilder fieldInfo = typeFactory.builder(); final RelDataTypeFactory.Builder fieldInfo = typeFactory.builder();
Map<String, LukeResponse.FieldInfo> luceneFieldInfoMap = getFieldInfo(collection); Map<String, LukeResponse.FieldInfo> luceneFieldInfoMap = getFieldInfo(collection);
for(Map.Entry<String, LukeResponse.FieldInfo> entry : luceneFieldInfoMap.entrySet()) { for(Map.Entry<String, LukeResponse.FieldInfo> entry : luceneFieldInfoMap.entrySet()) {
LukeResponse.FieldInfo luceneFieldInfo = entry.getValue(); LukeResponse.FieldInfo luceneFieldInfo = entry.getValue();
String luceneFieldType = luceneFieldInfo.getType();
// SOLR-13414: Luke can return a field definition with no type in rare situations
if(luceneFieldType == null) {
continue;
}
RelDataType type; RelDataType type;
switch (luceneFieldInfo.getType()) { switch (luceneFieldType) {
case "string": case "string":
type = typeFactory.createJavaType(String.class); type = typeFactory.createJavaType(String.class);
break; break;
@ -129,8 +133,8 @@ class SolrSchema extends AbstractSchema {
type = typeFactory.createJavaType(String.class); type = typeFactory.createJavaType(String.class);
} }
EnumSet<FieldFlag> flags = luceneFieldInfo.parseFlags(luceneFieldInfo.getSchema());
/* /*
EnumSet<FieldFlag> flags = luceneFieldInfo.parseFlags(luceneFieldInfo.getSchema());
if(flags != null && flags.contains(FieldFlag.MULTI_VALUED)) { if(flags != null && flags.contains(FieldFlag.MULTI_VALUED)) {
type = typeFactory.createArrayType(type, -1); type = typeFactory.createArrayType(type, -1);
} }