 					{
 						var getTablePromise:WeavePromise = new WeavePromise(_service)
 							.then(function(..._):AsyncToken {
+								if (debug)
+									weaveTrace('invoking getTable()', hash);
 								return _service.getTable(result.tableId, sqlParams);
 							});
 						
 						var keyStrings:Array;
 						promise = getTablePromise
 							.then(function(tableData:TableData):TableData {
+								if (debug)
+									weaveTrace('received', debugId(tableData), hash);
+								
+								if (!tableData.keyColumns)
+									tableData.keyColumns = [];
+								if (!tableData.columns)
+									tableData.columns = {};
+								
 								var name:String;
 								for each (name in tableData.keyColumns)
 									if (!tableData.columns.hasOwnProperty(name))

		WeaveAPI.ClassRegistry.registerImplementation(IDataSource, WeaveDataSource, "Weave server");

		private static const SQLPARAMS:String = 'sqlParams';
		
		public function WeaveDataSource()
		{

								}
								
								// generate compound keys
								var nCol:int = tableData.keyColumns.length;
								var iCol:int, iRow:int, nRow:int;
								for (iCol = 0; iCol < nCol; iCol++)
								{
