@@ -53,7 +53,8 @@ public Column(List<String> nameParts, List<String> delimiters) {
5353 }
5454
5555 public Column (String columnName ) {
56- this (null , columnName );
56+ this ();
57+ setColumnName (columnName );
5758 }
5859
5960 public ArrayConstructor getArrayConstructor () {
@@ -131,8 +132,56 @@ public String getUnquotedColumnName() {
131132 return MultiPartName .unquote (columnName );
132133 }
133134
134- public void setColumnName (String string ) {
135- columnName = string ;
135+ public void setColumnName (String name ) {
136+ // BigQuery seems to allow things like: `catalogName.schemaName.tableName` in only one pair
137+ // of quotes
138+ // however, some people believe that Dots in Names are a good idea, so provide a switch-off
139+ boolean splitNamesOnDelimiter = System .getProperty ("SPLIT_NAMES_ON_DELIMITER" ) == null ||
140+ !List
141+ .of ("0" , "N" , "n" , "FALSE" , "false" , "OFF" , "off" )
142+ .contains (System .getProperty ("SPLIT_NAMES_ON_DELIMITER" ));
143+
144+ setName (name , splitNamesOnDelimiter );
145+ }
146+
147+ public void setName (String name , boolean splitNamesOnDelimiter ) {
148+ if (MultiPartName .isQuoted (name ) && name .contains ("." ) && splitNamesOnDelimiter ) {
149+ String [] parts = MultiPartName .unquote (name ).split ("\\ ." );
150+ switch (parts .length ) {
151+ case 3 :
152+ this .table = new Table ("\" " + parts [0 ] + "\" .\" " + parts [1 ] + "\" " );
153+ this .columnName = "\" " + parts [2 ] + "\" " ;
154+ break ;
155+ case 2 :
156+ this .table = new Table ("\" " + parts [0 ] + "\" " );
157+ this .columnName = "\" " + parts [1 ] + "\" " ;
158+ break ;
159+ case 1 :
160+ this .columnName = "\" " + parts [0 ] + "\" " ;
161+ break ;
162+ default :
163+ throw new RuntimeException ("Invalid column name: " + name );
164+ }
165+ } else if (name .contains ("." ) && splitNamesOnDelimiter ) {
166+ String [] parts = MultiPartName .unquote (name ).split ("\\ ." );
167+ switch (parts .length ) {
168+ case 3 :
169+ this .table = new Table (parts [0 ] + "." + parts [1 ]);
170+ this .columnName = parts [2 ];
171+ break ;
172+ case 2 :
173+ this .table = new Table (parts [0 ]);
174+ this .columnName = parts [1 ];
175+ break ;
176+ case 1 :
177+ this .columnName = parts [0 ];
178+ break ;
179+ default :
180+ throw new RuntimeException ("Invalid column name: " + name );
181+ }
182+ } else {
183+ this .columnName = name ;
184+ }
136185 }
137186
138187 public String getTableDelimiter () {
0 commit comments